Решил оставить памятку по установке девятой ветки FreeBSD на файловую систему ZFS. Инструкций по установке в инете достаточно много, но почему-то все авторы ставят zfs на разделы диска gpt. Мое мнение — это совершенно не нужно, в случае если Вы не планируете использовать на диске другие файловые системы, помимо ZFS.
Процессы скачивания и записи дистрибутива я описывать не буду.
Загружаемся с дистрибутва и выбираем в инсталляторе LiveCD .
Создаем файловую систему (в данном примере создается зеркало, на базе двух SATA-дисков ada0, ada1, но ни кто Вам не мешает создать файловую систему по вашему усмотрению). Создаем с оптимизацией под диски с сектором 4K
gnop create -S 4096 /dev/ada0 gnop create -S 4096 /dev/ada1 zpool create zroot mirror ada0.nop ada1.nop zpool set bootfs=zroot zroot zpool export zroot gnop destroy /dev/ada0.nop gnop destroy /dev/ada1.nop zpool import -o cachefile=/var/tmp/zpool.cache zroot
Здесь система выдаст ошибку монтирования : Unable mount /zroot : read-only filesystem. Это нормально, игнорируем и продолжаем далее.
zfs set mountpoint=/mnt zroot zfs mount -a zfs set atime=off zroot zfs create zroot/usr zfs create zroot/usr/home cd /mnt ln -sf usr/home home zfs create zroot/usr/ports zfs create zroot/usr/src zfs create zroot/usr/obj zfs create zroot/var zfs create zroot/tmp chmod 1777 /mnt/tmp
Несколько слов о структуре каталогов, которую мы создаем. Я специально не делаю разделов с компрессией (как это рекомендуют во многих источниках), так как в наше время c текущей стоимостью и размерами дисков, выигрыш из-за компрессии разделов ports и src, будет несущественен, по сравнению с общим объемом дисковой подсистемы, но при этом мы будем тратить дополнительное процессорное время на чтение из данных разделов. Сильно озабоченные безопасностью могут дополнительно поиграться с атрибутами exec и setuid=off на разделах.
Создаем SWAP раздел (в примере на 4 гигабайта) :
zfs create -V 4G zroot/swap zfs set org.freebsd:swap=on zroot/swap zfs set checksum=off zroot/swap
Разворачиваем систему из дистрибутива :
sh cd /usr/freebsd-dist export DESTDIR=/mnt for file in `ls -1 *.txz`; do (cat $file | tar --unlink -vxpJf - -C ${DESTDIR}); done
Копируем zpool.cache в /boot/zfs
cp /var/tmp/zpool.cache /mnt/boot/zfs/zpool.cache
Создаем конфигурационные файлы:
echo 'zfs_enable="YES"' >> /mnt/etc/rc.conf echo 'zfs_load="YES"' >> /mnt/boot/loader.conf echo 'vfs.root.mountfrom="zfs:zroot"' >> /mnt/boot/loader.conf touch /mnt/etc/fstab
Назначаем точки монтирования (здесь будет стоять ругань системы на невозможность монтирования в новые точки, не обращаем внимание, все так и должно быть):
cd / zfs set mountpoint=legacy zroot zfs set mountpoint=/tmp zroot/tmp zfs set mountpoint=/usr zroot/usr zfs set mountpoint=/var zroot/var zfs umount -a
Устанавливаем загрузчик:
sysctl kern.geom.debugflags=0x10 dd if=/boot/zfsboot of=/dev/ada0 count=1 dd if=/boot/zfsboot of=/dev/ada1 count=1 dd if=/boot/zfsboot of=/dev/ada0 skip=1 seek=1024 dd if=/boot/zfsboot of=/dev/ada1 skip=1 seek=1024
Reboot и пытаемся загрузиться с установленной системы. Если все было сделано правильно, система загрузится без проблем. В случае замены одного из дисков в зеркале, последнюю операцию надо будет повторить, для инициализации загрузчика на новом диске.