Данная статья описывает, как можно быстро и автоматически установить FreeBSD 9 с корнем на zfs. По сути эта статья является лучшим комбинированием статей http://habrahabr.ru/blogs/bsdelniki/124263/ и http://www.aisecure.net/2011/05/01/root-on-zfs-freebsd-current/ , то есть вобрала в себя лучшее.
Обязательно прочтите эту стать
Тестовый стенд FreeBSD 9-Release amd64
Загружаемся с диска (не обязательно DVD, достаточно обычного disk1.iso) и выбираем пункт LiveCD. Да, да, теперь нету меню FixitIt. После этого логинимся под root’ом с пустым паролем и присваиваем адрес сетевому интерфейсу.
Теперь на другой машине создаём такой файл:
#!/bin/sh
# Vars
dev=ada0
pool_name=rpool
swap_size=1G
umount /dev/md1
mdmfs -s 512M md1 /tmp
sysctl kern.geom.debugflags=0x10
# gpart
gpart destroy -F $dev
gpart create -s GPT $dev
gpart add -s 64K -t freebsd-boot $dev
gpart add -s $swap_size -t freebsd-swap -l swap0 $dev
gpart add -t freebsd-zfs -l disk0 $dev
gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 $dev
# install ZFS
kldload /boot/kernel/opensolaris.ko
kldload /boot/kernel/zfs.ko
mkdir /boot/zfs
# сreate ZFS pool
zpool create -f $pool_name /dev/gpt/disk0
zfs set mountpoint=/mnt $pool_name
zpool set bootfs=$pool_name $pool_name
zfs create $pool_name/usr
zfs create $pool_name/usr/home
zfs create $pool_name/var
zfs create $pool_name/tmp
zpool export $pool_name
zpool import -o cachefile=/tmp/zpool.cache $pool_name
chmod 1777 /mnt/tmp
cd /mnt ; ln -s usr/home home
mkdir /mnt/var/tmp
chmod 1777 /mnt/var/tmp
cd /usr/freebsd-dist
export DESTDIR=/mnt
for file in base.txz lib32.txz kernel.txz doc.txz ;
do (cat $file | tar --unlink -xpJf - -C ${DESTDIR:-/}); done
cp /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 'opensolaris_load="YES"' >> /mnt/boot/loader.conf
echo "vfs.root.mountfrom=\"zfs:$pool_name\"" >> /mnt/boot/loader.conf
cat << EOF > /mnt/etc/fstab
# Device Mountpoint FStype Options Dump Pass#
/dev/gpt/swap0 none swap sw 0 0
EOF
zfs set readonly=on $pool_name/var/empty
zfs umount -a
zfs set mountpoint=legacy $pool_name
zfs set mountpoint=/tmp $pool_name/tmp
zfs set mountpoint=/usr $pool_name/usr
zfs set mountpoint=/var $pool_name/var
echo "Finished"
После этого на устанавливаемой машине выполняем такую команду:
ssh user@host 'cat /path/to/script' | sh
где /path/to/script – полный путь к скрипту, а user – имя юзера на той машине.
В процессе установки могут появится ошибки, о том, что неправильный аргумент или файловая система не смонтирована – ничего страшного. Дождитесь появление фразы Finished и после этого перегрузитесь.
Примечание.
Обратите внимание на переменные в скрипте: имя пула, размер swap’a, имя устройства! Теперь оно ada0 а не ad0.
Для i386 рекомендуется использовать такие значения (добавляется в /boot/loader.conf)
vm.kmem_size="512M"
vm.kmem_size_max="512M"
vfs.zfs.arc="80M"
vfs.zfs.arc_max="80M"
vfs.zfs.vdev.cache.size="30M"
vfs.zfs.prefetch_disable=1
Есть важное уточнение (опять же – для i386): если выставляется kmem более 512 Мб, то система падает в “кернел паник” с “руганью” на kmem_suballoc. Суть в том, что по умолчанию указать можно не более 512 Мб, а для бОльших значений (до 1Гб) необходимо пересобрать ядро с параметром:
options KVA_PAGES=512
По умочанию KVA_PAGES=256, что и является причиной ограничения.
Последний абзац позаимствован отсюда (http://www.lissyara.su/articles/freebsd/file_system/root_zfs_gpt/)
Обязательно прочтите эту статью про то, что бывает с пулом, когда он сильно заполнен и какие последствия этого.