вівторок, 12 жовтня 2010 р.

Advanced disk format on FreeBSD

Вот такой вот свой маленький велосипедик получился:
# cat /etc/rc.d/gnop 
#!/bin/sh
#

# PROVIDE: gnop
# REQUIRE: mountcritlocal
# BEFORE:  zfs
# KEYWORD: nojail

. /etc/rc.subr

name="gnop"
rcvar=`set_rcvar`
start_cmd="do_gnop"
stop_cmd=":"

do_gnop()
{
        for d in $gnop_disks
        do
                if [ -e /dev/$d.nop ]
                then
                        echo "gnop: device $d already configured"
                else
                        echo -n "gnop: configuring device $d ..."
                        gnop create -v $gnop_flags $d
                fi
        done
}

load_rc_config $name
run_rc_command "$1"
# fgrep gnop /etc/rc.conf
gnop_enable="YES"
gnop_disks="ada0 ada1 ada2 ada3"
gnop_flags="-S 4096"

10 коментарів:

blog сказав...

А для чего используется gnop? Как я понял ты её используешь совместно с zfs.

levsha сказав...

Хм, требуется пересказать что такое advanced disk format? Ну ладно, попробую кратко описать.
Для экономии места под служебные данные производителям жетских дисков выгоднее писать на диск бОльшими блоками. Поэтому некторые из них сделали записать на диск блоками по 4KB, а не по 512B. Но для совместимости со старями убогими операционками (не будем показывать пальцем на поделку от M$) диск сообщает что у него размер блока 512B. При этом если на него записать 512B, то на самом деле прошивка диска считает 4KB блок, изменит в нем нужные 512B, запишет назад 4KB блок. Естественно всё это в ущерб скорости работы.
Еще хуже будет если мы будем писать 4KB (или больше) блоками, но начало "нашего" блока не будет совпадать с началом физического блока диска.
Поэтому нужно выравнивать.
В случае с ufs, у которого свой blocksize 16KB, достаточно просто чтобы раздел начинался с 4KB границы.
У zfs же variable block size. Поэтому лучше всего ему отдать такой диск блоками по 4KB, совпадающими с физическими блоками диска. Вот для этого и используется gnop

roman.golovanov сказав...
Автор видалив цей коментар.
roman.golovanov сказав...

А в ZFS вы сразу /dev/ada[*].nop запихнули?
Я новичок в мире FreeBSD, никак не соображу как прилично разрешить в этом варианте ситуацию с съезжающей нумерацией дисков в случае потери одного из них.

levsha сказав...

http://blog.levsha.me/2010/05/zpool-on-whoole-disk-or-not.html
Ну и кроме того рекомендую оставлять в конце диска немного свободного места: очень поможет в случае, когда диск умер, а купленный на замену "такого же размера" "вдруг" окажется на пару килобайт меньше

roman.golovanov сказав...

про "zpool on whoole disk or not?" уже читал, но пока не понял как правильно делать - вначале разметить диски gpart-ом с выравниванием по 4К а потом поверх /dev/gpt/disk[*] создавать геометрию с помощью gnop, или наоборот?

levsha сказав...

По моему более правильно будет сначала gnop на диск, потом gpart-ом GPT на gnop device. Как минимум правильно тем, что в будущем после реализации работы с 4K дисками как-то более нативно есть шанст что всё оно плавно переедет. Ну и при такой схеме заботиться о выравнивании уже нет необходимости.
Я делал именно так

roman.golovanov сказав...

спасибо, пойду пробовать :)

roman.golovanov сказав...

^_^ для себя немного допилил скрипт так как есть винты разных серий, не все они AF:


$ cat /etc/rc.d/gnop
#!/bin/sh
#

# PROVIDE: gnop
# REQUIRE: mountcritlocal
# BEFORE: zfs
# KEYWORD: nojail

. /etc/rc.subr

name="gnop"
rcvar=`set_rcvar`
start_cmd="do_gnop"
stop_cmd=":"

do_gnop()
{
for d in $gnop_disks
do
if [ -e /dev/$d ]
then
model=`/usr/local/sbin/smartctl -i /dev/$d | /usr/bin/grep "Device Model:"`
for m in $gnop_models
do
if echo "$model" | grep -q $m; then
gnop_disk $d
else
fi
done
fi
done
}

gnop_disk()
{
if [ -e /dev/$1.nop ]
then
echo "gnop: device $1 already configured"
else
echo -n "gnop: configuring device $1 ..."
gnop create -v $gnop_flags $1
fi
}

load_rc_config $name
run_rc_command "$1"


и

$ cat /etc/rc.conf
gnop_enable="YES"
gnop_disks="ad0 ad1 ad2 ad3 ad4 ad5 ad6 ad7 ad8 ad9 ad10"
gnop_models="6L300S0 WD20EARS"
gnop_flags="-S 4096"

sean сказав...

Здравствуйте, хоть и давно ваш пост был, надеюсь вы прочтете комментарий.
Немного работаю с freebsd, но вот что касается работы с дисками и файловыми системами, то тут для меня совсем темный лес.
Вопрос такой этот ваш велосипедик сейчас актуален, если я выполню следующее:
# gpart show md0
# gpart add -t freebsd-boot -s 128k -a 4k md0
# gpart add -t freebsd-ufs -s 60m -a 4k md0
# gpart add -t freebsd-ufs -a 4k md0
Это же вроде как создание выровненных разделов, из вашего комментария сделал вывод, что нужен т.к. "У zfs же variable block size". Правильный ли мой вывод?
Диск у меня с 4к кластерами.