FreeBSD 8.1 — мигрируем на ZFS

Автор: | 10.12.2010

Решил перевести один подопытный сервер с 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 Гб 🙂

FreeBSD 8.1 — мигрируем на ZFS: 3 комментария

  1. Уведомление: Диски WD Caviar Green c 4 кб сектором | OnlyFriends!

  2. Уведомление: Жаренный ZFS | OnlyFriends!

  3. Уведомление: Диски WD Caviar Green c 4 кб сектором | OnlyFriends!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *