Прикладная демонология, практические рецепты

Установка FreeBSD с корнем на ZFS

Включаем в BIOS поддержку AHCI и грузимся с установочной флешки или CDROM.
На шаге Partitioning выбираем shell.

Смотрим имена доступных дисковых устройств:

sysctl kern.disks

Заново размечаем диски:

gpart destroy -F ada0; gpart create -s gpt ada0
gpart destroy -F ada1; gpart create -s gpt ada1
gpart destroy -F ada2; gpart create -s gpt ada2
gpart destroy -F ada3; gpart create -s gpt ada3

Если эти команды обламываются с operation not permitted, то выполняем:

sysctl kern.geom.debugflags=16

На каждом диске создаем загрузочный раздел, swap и основной (который войдет в zpool):

gpart add -a 4k -s 512k -t freebsd-boot ada0
gpart add -a 4k -s 512k -t freebsd-boot ada1
gpart add -a 4k -s 512k -t freebsd-boot ada2
gpart add -a 4k -s 512k -t freebsd-boot ada3
gpart add -a 1m -s 4g -t freebsd-swap ada0
gpart add -a 1m -s 4g -t freebsd-swap ada1
gpart add -a 1m -s 4g -t freebsd-swap ada2
gpart add -a 1m -s 4g -t freebsd-swap ada3
gpart add -a 1m -t freebsd-zfs ada0
gpart add -a 1m -t freebsd-zfs ada1
gpart add -a 1m -t freebsd-zfs ada2
gpart add -a 1m -t freebsd-zfs ada3

Устанавливаем загрузчик на каждый диск:

gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada0
gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada1
gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada2
gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada3

Подгружаем модуль ядра:

kldload zfs

Создаем доступный на запись каталог, чтобы сохранить кэш zpool:

mkdir /tmp/zfs
mount -t nullfs /tmp/zfs /boot/zfs

Создаем zpool с нужными свойствами:

zpool create -O mountpoint=legacy -O atime=off -O compression=lz4 tank mirror /dev/ada0p3 /dev/ada1p3 mirror /dev/ada2p3 /dev/ada3p3

Cоздаем необходимые файловые системы:

zfs create tank/root
zfs create -o mountpoint=/usr  tank/usr  && umount tank/usr
zfs create -o mountpoint=/var  tank/var  && umount tank/var
zfs create -o mountpoint=/tmp  tank/tmp  && umount tank/tmp
zfs create -o mountpoint=/home tank/home && umount tank/home

Устанавливаем загрузочную файловую систему:

zpool set bootfs=tank/root tank

На время установки монтируем иерархию файловых систем в /tmp:

mount -t zfs tank/root /mnt
mkdir /mnt/var /mnt/tmp /mnt/usr /mnt/home
mount -t zfs tank/usr /mnt/usr
mount -t zfs tank/var /mnt/var
mount -t zfs tank/tmp /mnt/tmp
mount -t zfs tank/home /mnt/home

Выходим из shell (<Ctrl-D>), происходит возврат в bsdinstall и сразу начинается распаковка системы.
После окончания установки выбираем пункт Live CD вместо Reboot.
Перемещаем кеш zpool в каталог /boot установленной системы:

mv /boot/zfs/zpool.cache /mnt/boot/zfs/

Делаем chroot в корень свежеустановленной системы:

chroot /mnt

Активируем автоматическое монтирование разделов файловых систем на старте:

echo 'zfs_load="YES"' >> /boot/loader.conf
echo 'zfs_enable="YES"' >> /etc/rc.conf

Создаем пустой fstab:

touch /etc/fstab

Создаем необходимых пользователей:

pw useradd vasya -s /bin/csh -G wheel -m -h0

Конфигурируем сеть и resolver:

echo 'ifconfig_bge0="inet 192.168.0.2/24" >> /etc/rc.conf
echo 'defaultrouter="192.168.0.1"' >> /etc/rc.conf
echo 'nameserver 192.168.0.1' >> /etc/resolver.conf

Выходим из chroot (<Ctrl-D>), reboot, выдергиваем флешку.