Booting FreeBSD from ZFS
Here are my notes on how to configure a full ZFS-based FreeBSD system. In this particular case, the system is “FreeBSD 9.0-CURRENT #0: Thu May 12 15:34:46 UTC 2011” and it runs on a Dell Inspiron Mini 1012 (Intel Atom N450) with 1GB of RAM. This is just a P.O.C. as it is said that ZFS would required at least 2GB of RAM to perform nicely.
Get the media
I grabbed the FreeBSD-9.0-CURRENT-201105-amd64-memstick.img
image from my
nearest mirror and burned it onto an USB stick:
# sudo dd if=FreeBSD-9.0-CURRENT-201105-amd64-memstick.img of=/dev/rdisk2 bs=1m
Stick the USB pen into the laptop and boot from it. When asked the task to perform, just select “”.
Summon the daemon
Log in as “root”. On the Live CD, there is no password set.
Run the sysinstall
command and configure your keyboard layout ; then exit.
Should you ask yourself, I used “Keymap” / “French ISO (accent)”, then “X Exit
Install”.
Find the name of your disks. I only have one local:
# sysctl kern.disks
kern.disks: da1 da0 ada0
# gpart list | egrep "Geom|Mediasize"
Geom name: ada0
Mediasize: 200038809600 (186G)
Geom name: da0
Mediasize: 65536 (64k)
Mediasize: 735173120 (701M)
Mediasize: 1025506304 (978M)
According to the reported sizes, my local disk is “ada0”. Clean the disk:
# gpart destroy ada0
ada0 destroyed
In my case, the disk contained previous partition layout from various testings
and the gpart destroy
command didn’t work. I had to wipe the disk out first:
# dd if=/dev/zero of=/dev/ada0 count=64
# gpart destroy ada0
ada0 destroyed
Create the partition table and the slices:
# gpart create -s gpt ada0
# gpart add -s 128K -t freebsd-boot -l boot ada0
ada0p1 added
# gpart add -s 2G -t freebsd-swap -l swap ada0
ada0p2 added
# gpart add -t freebsd-zfs -l tank ada0
ada0p3 added
Install the boot code to be able to actually boot from the ZFS root:
# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada0
bootcode written to ada0
Load the ZFS modules to be able to create and populate the filesystems:
# kldload opensolaris.ko
# kldload zfs.ko
(...)
ZFS filesystem version 5
ZFS storage pool version 28
Create the ZFS pool using the single disk:
# zpool create tank /dev/gpt/tank
# zpool set bootfs=tank tank
Create the FreeBSD tree:
# zfs set checksum=fletcher4 tank
# zfs create -o compression=on -o exec=on -o setuid=off tank/tmp
# chmod 1777 /tank/tmp
# zfs create -o compression=gzip -o dedup=on tank/usr
# zfs create tank/usr/home
# cd /tank; ln -s /usr/home home
# mkdir /tank/var
# cd /tank/var; ln -s /tmp tmp
Have a look at the “source” link below to get smarter directory layout.
Install the FreeBSD content:
# cd /usr/freebsd-dist
# sh -c 'for FIC in *txz; do cat ${FIC} | tar --unlink -xpJf - -C /tank/; done'
Configure FreeBSD:
# chroot /tank
# echo 'zfs_enable="YES"' > /etc/rc.conf
# cat > /boot/loader.conf
vfs.zfs.prefetch_disable="1"
vfs.root.mountfrom="zfs:tank"
zfs_load="YES"
^D
# echo "/dev/gpt/swap none swap sw 0 0" >> /etc/fstab
# passwd root
# tzsetup
# cd /etc/mail; make aliases
# exit
Save the ZFS cache-file:
# cd /boot/zfs
# zpool export tank && zpool import tank
# cp /boot/zfs/zpool.cache /tank/boot/zfs/
Configure the filesystem mount points:
# zfs unmount -a
# zfs set mountpoint=legacy tank
# zfs set mountpoint=/tmp tank/tmp
# zfs set mountpoint=/usr tank/usr
# zfs set mountpoint=/usr/home tank/usr/home
Reboot into FreeBSD and enjoy:
# reboot
Note that the keyboard layout is configured as US on reboot…
Use “sysinstall” to configure the rest of the system.
BTW, the ZFS system goes like this:
# zpool list
NAME SIZE ALLOC FREE CAP DEDUP HEALTH ALTROOT
tank 184G 1.03G 183G 0% 1.14x ONLINE -
# zfs list -r -o name,used,avail,refer,mountpoint,compressratio
NAME USED AVAIL REFER MOUNTPOINT RATIO
tank 1.10G 180G 324M legacy 2.02x
tank/tmp 35K 180G 35K /tmp 1.00x
tank/usr 735M 180G 735M /usr 2.57x
tank/usr/home 38.5K 180G 38.5K /usr/home 1.04x
That’s All Folks!