Во FreeBSD 8-CURRENT недавно появилась поддержка загрузки ядра с ZFS, а сама файловая система
была обновлена до версии 13. Процесс развертывания ZFS с возможностью загрузки с нее очень простой:1. Компилируете систему с опцией "-DLOADER_ZFS_SUPPORT" или добавляете в /etc/make.conf
LOADER_ZFS_SUPPORT=yes
2. Размечаете первый диск командой gpart на несколько разделов, из которых
обязательны только freebsd-boot и freebsd-zfs:
# создаем таблицу разделов типа GPT на диске ad0
gpart create -s GPT ad0
# добавляем загрузочный код позволяющий загружаться GPT разделов
gpart bootcode -b /boot/pmbr ad0
# создаем раздел для кода загрузки loader(8)'а с раздела GPT
gpart add -b 34 -s 256 -t freebsd-boot ad0
# записываем загрузочный код на него
gpart bootcode -p /boot/gptzfsboot -i 1 ad0
# создаем swap-раздел для возможности делать kernel
# dump'ы в случае panic или deadlock'ов, чтобы иметь
# возможность анализировать неисправности. А также он
# может пригодиться в случае не хватки оперативной
# памяти.
gpart add -b 290 -s 2097152 -t freebsd-swap ad0
# создаем основной раздел для ZFS
gpart add -b 2097442 -s 232344173 -t freebsd-zfs ad0
# смотрим на результат
gpart show
=> 34 234441581 ad1 GPT (112G)
34 256 1 freebsd-boot (128K)
290 2097152 2 freebsd-swap (1.0G)
2097442 232344173 3 freebsd-zfs (111G)
3. Создаете pool для ZFS на первом разделе и загружаетесь с него:
# создаем pool с именем 'h', выключенном поддержкой
# времени последнего доступа и включенным сжатием данных
zpool create -O atime=off -O compression=on h ad0p3
# создаем необходимые dataset'ы
zfs create -p -o setuid=off -o utf8only=on h/usr/home
zfs create -o sharenfs='-alldirs -webnfs' h/usr/ports
zfs create -o atime=on h/var
zfs create -o readonly=on h/var/empty
# населяем pool[1]
rsync -aHS --del --fileflags --filter '. migrate.rsync' / /h/
# перезагружаемся
shutdown -r now
# загружаемся *не* с ZFS в single-user режим (loader prompt)
boot -s
# меняем точку монтирования pool'а на корень
/etc/rc.d/hostid restart
/sbin/zfs set mountpoint=/ h
# перезагружаемся
/sbin/reboot
# загружаемся с ZFS (loader prompt)
set vfs.root.mountfrom=zfs:h
boot
4. Повторяете шаг 1 для второго диска и подсоединяете его к "зеркалу":
# Размечаем диск с учетом того, что количество блоков
# у freebsd-zfs должно быть такое же, как и на первом диске.
# В даннном примере - 484200428.
=> 34 488394988 ad0 GPT (233G)
34 256 1 freebsd-boot (128K)
290 4194304 2 freebsd-swap (2.0G)
4194594 484200428 3 freebsd-zfs (231G)
=> 34 488397101 ad1 GPT (233G)
34 256 1 freebsd-boot (128K)
290 4196417 2 freebsd-swap (2.0G)
4196707 484200428 3 freebsd-zfs (231G)
# подсоединяем его к pool'у как элемент зеркала
# (не перепутайте с *add*)
zpool attach h ad0p3 ad1p3
Примечание: Тест проводился на 14 версии и с использованием
вот этого патча - http://pastebin.com/f3d2089f3
Если будут проблемы с компиляцей loader'а или gptzfsboot на
amd64,
то просто скопируйте их с уже работающей машины на i386.
[1] пример migrate.rsync:
- .ccache
- /h
- /nfs
- /dev
- /tmp
- /var/emtpy
- /var/run
Стоит не забыть потом создать эти директории в /h с соответствующими правами
на них. В частности без /dev система не загрузится.
URL:
Обсуждается: http://www.opennet.dev/tips/info/1844.shtml