Mise à jour : une version plus récente, pour freebsd 9.2, est disponible sur ce blog (gegeweb)

Il s'agit surtout d'un aide mémoire pour une utilisation personnelle, je le mets en ligne au cas où il pourrait être utile. Tout ceci est très fortement inspiré par les deux documentations suivantes :

Préparation des disques

On crée trois partitions, une de boot, une de swap, et une de données. Cette dernière contiendra notre pool ZFS.

rescue-bsd# gpart destroy -F ada0
> ada0 destroyed
rescue-bsd# gpart create -s gpt ada0
> ada0 created
rescue-bsd# gpart add -s 64K -t freebsd-boot ada0
> ada0p1 added
rescue-bsd# gpart add -s 4G -t freebsd-swap -l swap ada0
> ada0p2 added
rescue-bsd# gpart add -t freebsd-zfs -l data ada0
> ada0p3 added

On installe un chargeur qui sait utiliser ZFS :

rescue-bsd# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada0
> bootcode written to ada0

Il faut maintenant créer le pool ZFS. Nous allons le monter dans /mnt :

rescue-bsd# zpool create -f -o altroot=/mnt -o cachefile=/var/tmp/zpool.cache zroot /dev/gpt/data
rescue-bsd# zpool export zroot
rescue-bsd# zpool import -o altroot=/mnt -o cachefile=/var/tmp/zpool.cache zroot 
rescue-bsd# zpool set bootfs=zroot zroot
rescue-bsd# zfs set checksum=fletcher4 zroot

Et maintenant, les partitions ! Sentez-vous libre d'improviser en explorant l'énorme panel d'options proposé par ZFS. Par exemple, ici, j'ai compressé les logs et les ports.

rescue-bsd# zfs create zroot/usr
rescue-bsd# zfs create zroot/usr/home
rescue-bsd# zfs create zroot/var
rescue-bsd# zfs create -o compression=on -o exec=on -o setuid=off zroot/tmp
rescue-bsd# zfs create -o compression=lzjb -o setuid=off zroot/usr/ports
rescue-bsd# zfs create -o compression=off -o exec=off -o setuid=off zroot/usr/ports/distfiles
rescue-bsd# zfs create -o compression=off -o exec=off -o setuid=off zroot/usr/ports/packages
rescue-bsd# zfs create -o compression=lzjb -o exec=off -o setuid=off zroot/usr/src
rescue-bsd# zfs create -o compression=lzjb -o exec=off -o setuid=off zroot/var/crash
rescue-bsd# zfs create -o exec=off -o setuid=off zroot/var/db
rescue-bsd# zfs create -o compression=lzjb -o exec=on -o setuid=off zroot/var/db/pkg
rescue-bsd# zfs create -o exec=off -o setuid=off zroot/var/empty
rescue-bsd# zfs create -o compression=lzjb -o exec=off -o setuid=off zroot/var/log
rescue-bsd# zfs create -o compression=gzip -o exec=off -o setuid=off zroot/var/mail 
rescue-bsd# zfs create -o exec=off -o setuid=off zroot/var/run
rescue-bsd# zfs create -o compression=lzjb -o exec=on -o setuid=off zroot/var/tmp

On ajuste un peu les droits d'accès, et on crée le lien symbolique /home :

rescue-bsd# chmod 1777 /mnt/tmp
rescue-bsd# cd /mnt ; ln -s usr/home home
rescue-bsd# chmod 1777 /mnt/var/tmp

Installation de FreeBSD

Nous sommes sur un système NFS en lecture seule. Il va falloir se faire un espace pour télécharger le système :

rescue-bsd# mkdir /root/sets
rescue-bsd# mount -t tmpfs -o size=300000000 dummy /root/sets

On se connecte sur le ftp de FreeBSD pour télécharger le système d'exploitation :

rescue-bsd# cd /root/sets
rescue-bsd# ftp ftp.freebsd.org
ftp> cd /pub/FreeBSD/releases/amd64/amd64/9.1-RELEASE
ftp> get base.txz
ftp> get kernel.txz
ftp> ^D

On décompresse FreeBSD dans notre nouvel environnement :

rescue-bsd# cat base.txz | tar --unlink -xpJf - -C /mnt
rescue-bsd# cat kernel.txz | tar --unlink -xpJf - -C /mnt

Configuration du système

On se "chroote" dans le nouvel environnement :

rescue-bsd# chroot /mnt

On va éditer quelques fichiers essentiels pour le prochain démarrage de la machine. Tout d'abord, le précieux fstab, presque vide, nous y déclarons que la swap :

root@rescue-bsd:/ # echo /dev/label/swap none swap sw 0 0 > /etc/fstab

On s'occupe ensuite du rc.conf...

root@rescue-bsd:/ # echo 'zfs_load="YES"' > /boot/loader.conf
root@rescue-bsd:/ # echo 'sshd_enable="YES"' > /etc/rc.conf
root@rescue-bsd:/ # echo 'hostname="mamachine"' >> /etc/rc.conf
root@rescue-bsd:/ # echo 'ifconfig_re0="DHCP"' >> /etc/rc.conf
root@rescue-bsd:/ # echo 'zfs_enable="YES"' >> /etc/rc.conf

...et de loader.conf

root@rescue-bsd:/ # echo 'vfs.root.mountfrom="zfs:zroot"' >> /boot/loader.conf

On donne un mot de passe au super-utilisateur root :

root@rescue-bsd:/ # passwd
> Changing local password for root
> New Password:
> Retype New Password:

Ensuite, il faut éditer sshd_config pour autoriser root à se connecter en ssh (nous allons utiliser vi, l'environnement de base de FreeBSD ne nous fournit pas d'éditeur convivial codé en lisp).

root@rescue-bsd:/ #  vi /etc/ssh/sshd_config
> PermitRootLogin yes

Ceci ne restera comme que jusqu'au premier démarrage de votre serveur : par la suite, il faudrait refuser que root se connecte en ssh et utiliser un utilisateur classique que vous mettrez dans le groupe wheel.

On sort du chroot :

root@rescue-bsd:/ # exit

Et on redémarre la machine...

rescue-bsd# reboot