Решил перевести один подопытный сервер с UFS2 на ZFS и GPT. В наличии имеется обычная персоналочка с Intel C2D, 4 Гб ОЗУ, жёсткие диски 4×500 Гб. Так же есть 1×750 Гб — на него временно перенесу систему. Система уже есть:
# uname -mrs FreeBSD 8.1-RELEASE-p2 amd64
Начнём с создания таблицы разделов. Мои диски видятся в системе как ada0, ada1, ada2 и ada3. Если на диске уже есть таблица разделов, то её надо предварительно удалить:
# gpart show ada0 => 63 976773105 ada3 MBR (466G) 63 62910477 1 freebsd [active] (30G) 62910540 1890609525 2 freebsd [active] (902G) # gpart delete -i 1 ada0 ada0s1 deleted # gpart delete -i 2 ada0 ada0s2 deleted # gpart destroy ada0 ada0 destroyed # gpart show ada0 gpart: No such geom: ada0.
Получаем чистый диск, готовый для новой разметки. Создаём таблицу разделов GPT:
# gpart create -s gpt ada0 ada0 createded # gpart create -s gpt ada1 ada1 createded # gpart create -s gpt ada2 ada2 createded # gpart create -s gpt ada3 ada3 createded
Проверим, что у нас получилось:
# gpart show ada0 => 34 976773101 ada3 GPT (466G) 34 976773101 - free - (466G) # ls -l /dev | grep ada crw-r----- 1 root operator 0, 91 8 дек 19:31 ada0 crw-r----- 1 root operator 0, 92 8 дек 19:31 ada1 crw-r----- 1 root operator 0, 93 8 дек 19:31 ada2 crw-r----- 1 root operator 0, 94 8 дек 19:31 ada3
Создадим по три раздела на каждом из дисков — загрузочный, под своп и непосредственно под систему. Выполняем эти команды для каждого из дисков. Не забываем проставлять правильные метки разделов: swap0, swap1, swap2, … , disk0, disk1, …
# gpart add -b 34 -s 64k -t freebsd-boot ada0 ada0p1 added # gpart add -s 1G -t freebsd-swap -l swap0 ada0 ada0p2 added # gpart add -t freebsd-zfs -l disk0 ada0 ada0p3 added
Тут есть определённые тонкости. Во-первых, стартовый блок для загрузочного раздела для жёстких дисков с 512 б секторами должен быть 34, а для дисков с 4 Кб секторами — 40. Во-вторых, под своп создаётся отдельный раздел, т.к. в случае размещения его на ZFS система не будет иметь возможности сделать дамп ядра при kernel panic. И в третьих, для последнего раздела можно не указывать размер, если мы хотим использовать всё доступное пространство. По завершении всех операций должно получиться следующее:
# ls /dev/gpt disk0 disk1 disk2 disk3 swap0 swap1 swap2 swap3
Установим Protected MBR и загрузчик gptzfsboot (выполнить для всех дисков):
# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada0 ada0 has bootcode
Пора загрузить модули ядра, для поддержки ZFS. Добавим необходимые записи в файлы конфигурации и загрузим модули:
# echo 'zfs_enable="YES"' >> /etc/rc.conf # echo 'zfs_load="YES"' >> /boot/loader.conf # echo 'vfs.root.mountfrom="zfs:tank"' >> /boot/loader.conf # echo 'vfs.zfs.prefetch_disable=0' >> /boot/loader.conf # /etc/rc.d/zfs start
Создадим пул ZFS. Из возможных вариантов я выбрал RaidZ2, т.е. система сможет выдержать выход из строя одновременно двух дисков. Доступный объём вычисляется по формле: (N−P)×X, где N — общее число дисков, P — число «parity» дисков, X — объём одного диска. В моём случае это будет (4−2)×465=930 Гб. При выборе RaidZ было бы 1.36 Тб. Пул назовём tank, но это не принципиально:
# zpool create tank raidz2 /dev/gpt/disk0 /dev/gpt/disk1 /dev/gpt/disk2 /dev/gpt/disk3 # zpool set bootfs=tank tank
Перейдём к созданию иерархии файловых систем. Команды привожу как есть, более подробная информация есть в документации и на сайте wiki.freebsd.org:
# zfs set checksum=fletcher4 tank # zfs create -o compression=on -o exec=on -o setuid=off tank/tmp # chmod 1777 /tank/tmp # zfs create tank/usr # zfs create tank/usr/home # cd /tank ; ln -s /usr/home home # zfs create -o compression=lzjb -o setuid=off tank/usr/ports # zfs create -o compression=off -o exec=off -o setuid=off tank/usr/ports/distfiles # zfs create -o compression=off -o exec=off -o setuid=off tank/usr/ports/packages # zfs create -o compression=lzjb -o exec=off -o setuid=off tank/usr/src # zfs create tank/var # zfs create -o compression=lzjb -o exec=off -o setuid=off tank/var/crash # zfs create -o exec=off -o setuid=off tank/var/db # zfs create -o compression=lzjb -o exec=on -o setuid=off tank/var/db/pkg # zfs create -o exec=off -o setuid=off tank/var/empty # zfs create -o compression=lzjb -o exec=off -o setuid=off tank/var/log # zfs create -o compression=gzip -o exec=off -o setuid=off tank/var/mail # zfs create -o exec=off -o setuid=off tank/var/run # zfs create -o compression=lzjb -o exec=on -o setuid=off tank/var/tmp # chmod 1777 /tank/var/tmp
Скопируем текущую систему на ZFS. В идеале эту операцию надо выполнять в однопользовательском режиме:
# cd / ; pax -p eme -X -rw . /tank # cd /var ; pax -p eme -X -rw . /tank/var # cd /usr ; pax -p eme -X -rw . /tank/usr
И в завершении ставим атрибут ro на /var/empty:
# zfs set readonly=on tank/var/empty
Редактируем файл fstab, приведя его к примерно следующему виду:
# cat /tank/etc/fstab # Device Mountpoint FStype Options Dump Pass /dev/gpt/swap0 none swap sw 0 0 /dev/gpt/swap1 none swap sw 0 0 /dev/gpt/swap2 none swap sw 0 0 /dev/gpt/swap3 none swap sw 0 0
Укажем новые точки монтирования ZFS и можно перезагружаться и оценивать результат:
# zfs unmount -a # zfs set mountpoint=legacy tank # zfs set mountpoint=/tmp tank/tmp # zfs set mountpoint=/usr tank/usr # zfs set mountpoint=/var tank/var
Что могу сказать ещё? Пока полёт нормальный, проблем не замечено. Удобство управления разделами радует. Надо будет ещё проверить действительно ли так надёжен RaidZ2…
UPD В ходе испытаний выяснилось, что с учётом общей загруженности сервера 4 Гб ОЗУ не хватает, вернее хватает на сутки-двое, а потом начинаются тормоза. Увеличил до 8 Гб 🙂
Уведомление: Диски WD Caviar Green c 4 кб сектором | OnlyFriends!
Уведомление: Жаренный ZFS | OnlyFriends!
Уведомление: Диски WD Caviar Green c 4 кб сектором | OnlyFriends!