Загрузка с ZFS-mirror на GPT во FreeBSD

Материал из wiki.lissyara.su
Перейти к: навигация, поиск

Загрузка с 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 в официальной вики, много ссылок по теме, в том числе и о разных способах загрузки.