Un petit mémo sur une installation clean de FreeBSD 9 avec :

  • partitionnement GPT (boot loader ZFS, swap & pool ZFS)
  • pool ZFS racine en miroir, avec alignement pour secteurs disque de 4k
  • miroir GEOM pour le swap
  • configuration LAN dualstack IPv4 et IPv6

Toute la procédure s’effectue depuis le CD de FreeBSD en mode live.

Partitionnement des disques

# gpart create -s gpt ada0
# gpart add -b 34 -s 94 -t freebsd-boot ada0
# gpart add -s 4G -t freebsd-swap -l swap0 ada0
# gpart add -t freebsd-zfs -l disk0 ada0
# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada0
# gpart create -s gpt ada1
# gpart add -b 34 -s 94 -t freebsd-boot ada1
# gpart add -s 4G -t freebsd-swap -l swap1 ada1
# gpart add -t freebsd-zfs -l disk1 ada1
# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada1

Création du miroir GEOM pour la swap

# kldload geom_mirror.ko
# gmirror label -F -h -b round-robin swap /dev/gpt/swap0 /dev/gpt/swap1

Création du pool ZFS racine

# kldload opensolaris.ko
# kldload zfs.ko
# gnop create -S 4096 /dev/gpt/disk0
# gnop create -S 4096 /dev/gpt/disk1
# zpool create -o altroot=/mnt -o cachefile=/var/tmp/zpool.cache zroot mirror /dev/gpt/disk0.nop /dev/gpt/disk1.nop
# zpool export zroot
# gnop destroy /dev/gpt/disk0.nop
# gnop destroy /dev/gpt/disk1.nop
# zpool import -o altroot=/mnt -o cachefile=/var/tmp/zpool.cache zroot
# zpool set bootfs=zroot zroot
# zfs set checksum=fletcher4 zroot
# zfs set atime=off zroot
# zfs create zroot/usr
# zfs create zroot/usr/home
# zfs create zroot/var
# zfs create -o compression=on -o exec=on -o setuid=off zroot/tmp
# zfs create -o compression=lzjb -o setuid=off zroot/usr/ports
# zfs create -o compression=off -o exec=off -o setuid=off zroot/usr/ports/distfiles
# zfs create -o compression=off -o exec=off -o setuid=off zroot/usr/ports/packages
# zfs create -o compression=lzjb -o exec=off -o setuid=off zroot/usr/src
# zfs create -o compression=lzjb -o exec=off -o setuid=off zroot/var/crash
# zfs create -o exec=off -o setuid=off zroot/var/db
# zfs create -o compression=lzjb -o exec=on -o setuid=off zroot/var/db/pkg
# zfs create -o exec=off -o setuid=off zroot/var/empty
# zfs create -o compression=lzjb -o exec=off -o setuid=off zroot/var/log
# zfs create -o compression=gzip -o exec=off -o setuid=off zroot/var/mail
# zfs create -o exec=off -o setuid=off zroot/var/run
# zfs create -o compression=lzjb -o exec=on -o setuid=off zroot/var/tmp
# chmod 1777 /mnt/tmp
# chmod 1777 /mnt/var/tmp
# cd /mnt; ln -s usr/home home

Installation du système

# sh
# 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

Configuration

# zfs set readonly=on zroot/var/empty
# cp /var/tmp/zpool.cache /mnt/boot/zfs/zpool.cache
# ee /mnt/etc/fstab
/dev/mirror/swap none swap sw 0 0
# ee /mnt/boot/loader.conf
geom_mirror_load="YES"
zfs_load="YES"
vfs.root.mountfrom="zfs:zroot"
# ee /mnt/etc/rc.conf
hostname="freebsd9"
keymap="fr.iso.acc"
zfs_enable="YES"

network_interfaces="lo0 em0"
defaultrouter="192.168.0.1"
ipv6_defaultrouter="fdcb:9921:3552:afd7::1"
ifconfig_em0="inet 192.168.0.2 netmask 255.255.255.0 polling"
ifconfig_em0_ipv6="inet fdcb:9921:3552:afd7::2 prefixlen 64"

clear_tmp_enable="YES"
tcp_drop_synfin="YES"

moused_enable="NO"
sendmail_enable="NONE"
sshd_enable="YES"
syslogd_flags="-ss"
# ee /mnt/etc/resolv.conf
nameserver 192.168.0.254
search my.domain
# echo 'daily_status_gmirror_enable="YES"' >> /mnt/etc/periodic.conf
# echo 'daily_status_zfs_enable="YES"'' >> /mnt/etc/periodic.conf
# echo 'daily_status_smart_devices="/dev/ada0 /dev/ada1"' >> /mnt/etc/periodic.conf
# echo 'daily_status_mail_rejects_enable="NO"' >> /mnt/etc/periodic.conf
# echo 'daily_status_include_submit_mailq="NO"' >> /mnt/etc/periodic.conf
# echo 'daily_submit_queuerun="NO"' >> /mnt/etc/periodic.conf]
# echo 'WRKDIRPREFIX=/usr/obj' >> /mnt/etc/make.conf
# chroot /mnt
# passwd
# tzsetup
# gpart status
# zpool status
# gmirror status
# exit
# shutdown -r now

L’installation étant terminée, on peut de suite effectuer un snapshot ZFS du pool :

# zfs snapshot -r zroot@default

Annexe : création d’un volume ZFS pour la swap

Au lieu d’une partition dédiée, la swap peut être stockée par un volume dans le pool ZFS. Le système d’exploitation ne pourra toutefois pas y stocker les coredumps.

# zfs create -V 4G zroot/swap
# zfs set org.freebsd:swap=on zroot/swap
# zfs set checksum=off zroot/swap