Installer et booter une FreeBSD zfs on root depuis Debian/Grub2

J’ai une partition primaire de libre sur mon laptop sous Debian , je comptais y installer une FreeBSD full zfs. Le problème c’est que mon laptop n’a pas (plus) de lecteur cd, et que je me voyais mal faire une installation zfs un peu ardue en pxe et sans avoir la doc dans $BROWSER.

Alors je me dis qu’installer FreeBSD sur la partition libre depuis ma Debian testing avec zfs-fuse est possible. Évidement pas de chroot possible, mais y’a même pas besoin. Le plus dur ça a été de démarrer la FreeBSD avec grub2, mais je suis tombé sur la bonne doc. Voilà la manip sans attendre que qemu se lance.

On installe les petits (gros) tools qu’il nous faut (zfs-fuse est dans testing ou sid) :

sudo apt-get install bsdtar zfs-fuse lftp

On récupère une distribution binnaire de FreeBSD (ici 8.1-RELEASE i386)

mkdir ~/freebsd && cd ~/freebsd
lftp -c "open ftp://ftp.fr.freebsd.org/pub/FreeBSD/releases/i386/8.1-RELEASE/; mirror base"
lftp -c "open ftp://ftp.fr.freebsd.org/pub/FreeBSD/releases/i386/8.1-RELEASE/; mirror kernels"
# Et si vous voulez les man
lftp -c "open ftp://ftp.fr.freebsd.org/pub/FreeBSD/releases/i386/8.1-RELEASE/; mirror manpages"

Ensuite on crée sa pool zfs sur la partition cible (en forçant la version en 14, version de zfs sur FreeBSD)

sudo zpool create -o version=14 tank /dev/sda3
sudo zfs create tank/root
# Ici on peut créer tous les datasets qu'il nous faut

On extract tout ça :

cd ~/freebsd/base && cat base.?? | sudo bsdtar --unlink -xpzf - -C /tank/root
cd ~/freebsd/kernels && cat generic.?? | sudo bsdtar --unlink -xpzf - -C /tank/root/boot
cd ~/freebsd/manpages && cat manpages.?? | sudo bsdtar --unlink -xpzf - -C /tank/root

Les finitions :

# On utilisera le kernel GENERIC
sudo rmdir /tank/root/boot/kernel && sudo mv /tank/root/boot/GENERIC /tank/root/boot/kernel
# On copie le cache zpool pour que la freebsd retrouve "tank"
sudo cp /var/lib/zfs/zpool.cache /tank/root/boot/zfs/
# On évite un warning
sudo touch /tank/root/etc/fstab
# On se fait un rc.conf
cat << EOF | sudo tee /tank/root/etc/rc.conf
hostname="shen.philpep.org"
keymap="fr.iso.acc"
zfs_enable="YES"
EOF
# On met mountpoint / pour tank/root (comme ça tank/root/... se montera à partir de /)
sudo zpool export tank
sudo zpool import -R /mnt tank
sudo zpool set mountpoint=/ tank/root

Et maintenant le plus dur, grub2 :

menuentry 'FreeBSD' {
insmod zfs
search -s -l tank
kfreebsd /root@/boot/kernel/kernel
kfreebsd_module_elf /root@/boot/kernel/opensolaris.ko
kfreebsd_module_elf /root@/boot/kernel/zfs.ko
kfreebsd_module /root@/boot/zfs/zpool.cache type=/boot/zfs/zpool.cache
set kFreeBSD.vfs.root.mountfrom=zfs:tank/root
}

Donc avec cette syntaxe on peut charger des modules au boot et écrire dans des variables sysctl (chose qu’on fait dans /boot/loader.conf avec le bootloader de FreeBSD).

Ça juste marche, et je trouve ça bien pratique, surtout qu’on peut se servir du pool zfs depuis Debian, et on peut aussi monter l’ext3 depuis FreeBSD.

EDIT: Je ne peut pas garantir que ce soit très fiable tout ça. Prudence donc. Si vous avez des problèmes au boot de FreeBSD (truc du style “alloc magic is broken”) vous pouvez essayer de remplacer search -s -l tank par set root=(hd0,3) (avec la pool en /dev/sda3 chez moi).