Загрузка с ZFS-mirror на GPT во FreeBSD
Загрузка с ZFS-mirror на GPT во FreeBSD
Во FreeBSD 8-CURRENT в середине ноябре 2008 появилась поддержка загрузки ядра с ZFS, а сама файловая система была обновлена до версии 13. Процесс развертывания ZFS с возможностью загрузки с нее очень простой:
Содержание
Использование gpart для разметки диска
Размечаете первый диск командой gpart на несколько разделов, из которых обязательны только freebsd-boot и freebsd-zfs:
- создаем таблицу разделов типа GPT на диске ad0
gpart create -s GPT ad0
- Если на этом шаге возникнет ошибка, то скорее всего у вас не включена поддержка GEOM_PART_GPT в ядре, но она есть в GENERIC-ядре. Поэтому вам понадобится подгрузить соответствующий модуль
kldload geom_part_gpt echo geom_part_gpt=YES >>/boot/loader.conf
- добавляем загрузочный код, позволяющий загружаться с GPT разделов
gpart bootcode -b /boot/pmbr ad0
- создаем раздел для кода загрузки loader'а с раздела GPT
gpart add -s 128k -t freebsd-boot ad0
- записываем загрузочный код на него
gpart bootcode -p /boot/gptzfsboot -i 1 ad0
- создаем swap раздел с меткой swap0 для возможности использовать его в качестве dumpdev, т.к. делать kernel dump'ы на zvol'ах невозможно; метка swap0 нам может пригодиться, например, в fstab
gpart add -s 1g -l swap0 -t freebsd-swap ad0
- создаем основной раздел для ZFS с меткой v0_h, где v0 (сокр. от vdev) - номер устройства в pool'е и `h' - название pool'а
gpart add -l v0_h -t freebsd-zfs ad0
- смотрим на результат
gpart show => 34 234441581 ad0 GPT (112G) 34 256 1 freebsd-boot (128K) 290 2097152 2 freebsd-swap (1.0G) 2097442 232344173 3 freebsd-zfs (111G)
Создание ZFS пула
Создаете pool для ZFS на первом разделе и загружаетесь с него:
- создаем pool с именем `h', выключенном поддержкой времени последнего доступа и включенным сжатием данных; вместо ad0p3 используем GPT-метку v0_h, чтобы избежать проблем при смене имен устройств или их нумерации
zpool create -O atime=off -O compression=on h gpt/v0_h
- создаем необходимые 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 'merge migrate.rsync' / /h/
- перезагружаемся
shutdown -r now
- загружаемся *не* с ZFS в single-user режим (loader prompt)
boot -s
- меняем точку монтирования pool'а на корень
/etc/rc.d/hostid restart /sbin/zfs umount -a /sbin/zfs set mountpoint=/ h
- перезагружаемся
/sbin/reboot
- загружаемся с ZFS (loader prompt)
load zfs set vfs.root.mountfrom=zfs:h boot
- добавляем в loader.conf(5) поддержку zfs и точку монтирования / (корня)
echo zfs_load=YES >>/boot/loader.conf echo vfs.root.mountfrom=\"zfs:h\" >>/boot/loader.conf
- добавляем в rc.conf примонтирование всех томов zfs.
echo zfs_enable=\"YES\" >>/etc/rc.conf
Разбивка и подключение в зеркало второго диска
Повторяете шаг 2 для второго диска и подсоединяете его к "зеркалу":
- Размечаем диск с учетом того, что количество блоков у 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 gpt/v0_h gpt/v1_h
- смотрим на результат
zpool status pool: h state: ONLINE scrub: none requested config: NAME STATE READ WRITE CKSUM h ONLINE 0 0 0 mirror ONLINE 0 0 0 gpt/v0_h ONLINE 0 0 0 gpt/v1_h ONLINE 0 0 0 errors: No known data errors
Примечания
Если будете использовать автомонтирование ZFS, держать корень `/' на ZFS и будут проблемы с монтированием разделов через fstab(5), то можно заменить mountcritlocal на hostid в /etc/rc.d/zfs. Иначе разделы из fstab будут монтироваться раньше, чем произойдет `zfs mount -a'. Или можно просто использовать опцию монтирования late.
[1] пример migrate.rsync:
exclude .ccache exclude /h exclude /dev exclude /nfs exclude /tmp exclude /var/emtpy exclude /var/run
Стоит не забыть потом создать эти директории в /h с соответствующими правами на них. В частности без /dev система не загрузится.
Ссылки
Создание шифрованного с помощью ELI раздела на ZFS (Англ.)
Настройка системы для ZFS (Англ.)
Загрузка с ZFS практический пример (Рус.) - Небольшой самопиар и пример инсталляции на ZFS mirror
FreeBSD на GPT (Англ.) - Статья о преимушествах GPT схемы перед MBR
Сделать Gpart дефолтной (Англ.) - Дискуссия в рассылке, о необходимости перехода на использование GPT по дефолту.
ZFS on Root (Англ.) - Статья об установки ZFS в качестве корневой ФС на официальной вики.
ZFS (Англ.) - Общая страничка о ZFS в официальной вики, много ссылок по теме, в том числе и о разных способах загрузки.