====== Installing Redports Slaves with FreeBSD 9.x Root on ZFS using GPT ======
===== Starting off =====
- Go through the procedure in [[clusteradm/NYINetinstall]] up to but not including "do the install" in the "machines which will boot from hard drive" section.
===== Creating a bootable ZFS Filesystem =====
- pxeboot the %%FreeBSD%% Install image
- Choose %%LiveCD%% when asked
- Mount Root filesystem read-writeable to prevent further problems
mount -rw /
- Create GPT Disk
Fixit# gpart create -s gpt da0
**Note:**
If the disk already contains a partitioning scheme, and this scheme would first need to be destroyed using:
Fixit# gpart destroy da0
- Create the boot, swap and zfs partitions
Fixit# gpart add -b 40 -s 88 -t freebsd-boot da0
Fixit# gpart add -s 4G -t freebsd-swap -l swap0 da0
Fixit# gpart add -t freebsd-zfs -l disk0 da0
This creates 3 partitions. The first partition will contains the gptzfsboot loader which will be able to load /boot/loader or /boot/zfsloader (9.0-CURRENT) from a [[/ZFS]] partition. The second partition is a 4 GB swap partition. The third partition is dedicated to the ZFS zpool and uses the remaining space on the disk.
**Note:**
- While a [[/RootOnZFS|ZFS Swap Volume]] can be used instead of the freebsd-swap partition, crash dumps can't be saved to the ZFS Swap Volume.
- Install the Protected MBR (pmbr) and gptzfsboot loader
Fixit# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 da0
This may fail with an "operation not permitted" error message, since the kernel likes to protect critical parts of the disk. If this happens for you, run:
Fixit# sysctl kern.geom.debugflags=0x10
- Load ZFS kernel module
Fixit# kldload opensolaris.ko
Fixit# kldload zfs.ko
- Create ZFS Pool zroot
**Note:**
zroot is the name of the ZFS Pool, it could be anything (i.e. tank, data, ...)
Fixit# zpool create zroot /dev/gpt/disk0
:!: We will work around it if you get the error "cannot mount '/zroot': failed to create mountpoint".
Fixit# zpool set bootfs=zroot zroot
- Confirm that you have successfully created it via
Fixit# zpool status
:!: For the following "create" steps, ignore the error "filesystem successfully created, but not mounted"
- Create ZFS filesystem hierarchy.\\ \\
The **fletcher4** algorithm should be more robust than the **fletcher2** algorithm.
Fixit# zfs set checksum=fletcher4 zroot
Fixit# zfs create -o compression=on -o exec=on -o setuid=off zroot/tmp
Fixit# zfs create zroot/usr
Fixit# zfs create zroot/usr/home
Fixit# zfs create -o compression=lzjb -o setuid=off zroot/usr/ports
Fixit# zfs create -o compression=off -o exec=off -o setuid=off zroot/usr/ports/distfiles
Fixit# zfs create -o compression=off -o exec=off -o setuid=off zroot/usr/ports/packages
**Note:**
If you use nullfs or nfs to mount /usr/ports to different locations/servers, you will also need to nullfs/nfs mount /usr/ports/distfiles and/or /usr/ports/packages.
Fixit# zfs create -o compression=lzjb -o exec=off -o setuid=off zroot/usr/src
Fixit# zfs create zroot/var
Fixit# zfs create -o exec=off -o setuid=off zroot/var/db
Fixit# zfs create -o compression=lzjb -o exec=on -o setuid=off zroot/var/db/pkg
Fixit# zfs create -o exec=off -o setuid=off zroot/var/empty
Fixit# zfs create -o compression=lzjb -o exec=off -o setuid=off zroot/var/log
Fixit# zfs create -o compression=lzjb -o exec=on -o setuid=off zroot/var/tmp
**Note:**
- Compression may be set to on, off, lzjb, gzip, gzip-N (where N is an integer from 1 (fastest) to 9 (best compresion ratio. gzip is equivalent to gzip-6).
- Compression will cause some latency when accessing files on the [[/ZFS]] filesystems. Use compression on [[/ZFS]] filesystems which will not be accessed that often.
- Mount filesystems to /mnt
Fixit# zfs set mountpoint=/mnt zroot
Fixit# zfs set mountpoint=/mnt/tmp zroot/tmp
Fixit# zfs set mountpoint=/mnt/usr zroot/usr
Fixit# zfs set mountpoint=/mnt/var zroot/var
Fixit# zfs mount -a
- Fine-tune the contents of the filesystems:
Fixit# chmod 1777 /mnt/tmp
Fixit# chmod 1777 /mnt/var/tmp
Fixit# ln -s /mnt/usr/home /mnt/home
===== Installing FreeBSD to the ZFS filesystem =====
- Install %%FreeBSD%% to zroot using bsdinstall
- When asked about Partitioning choose "shell"
- Just
Fixit# exit
to skip the Partitioning step.
- Continue with the install up to the "last chance" step.
===== Finish install =====
- Exit to the shell. You should see
This shell is operating in a chroot in the new system.
- Enter
Fixit# exit
to leave the chroot.
- Edit /mnt/etc/rc.conf
Fixit# echo 'zfs_enable="YES"' >> /mnt/etc/rc.conf
- Create /mnt/boot/loader.conf
Fixit# echo 'zfs_load="YES"' > /mnt/boot/loader.conf
Fixit# echo 'vfs.root.mountfrom="zfs:zroot"' >> /mnt/boot/loader.conf
Fixit# echo 'console="comconsole,vidconsole"' >> /mnt/boot/loader.conf
- Create /mnt/etc/fstab
Fixit# cat << EOF > /mnt/etc/fstab
# Device Mountpoint FStype Options Dump Pass#
/dev/gpt/swap0 none swap sw 0 0
EOF
- Unmount all zfs filesystems
Fixit# zfs unmount -a
- Further fine-tune the contents of the filesystems:
Fixit# zfs set readonly=on zroot/var/empty
- If /tmp is not r/w, make it so (e.g. via an ''%%mdconfig%%''.)
- Copy the metadata to the desired destination.\\ \\ :!: You will **not** be able to ZFS boot without this!
Fixit# cd /tmp
Fixit# zpool export -f zroot
Fixit# zpool import -o cachefile=/tmp/zpool.cache zroot
- Change mount points for zroot pool
Fixit# zfs set mountpoint=legacy zroot
Fixit# zfs set mountpoint=/tmp zroot/tmp
Fixit# zfs set mountpoint=/usr zroot/usr
Fixit# zfs set mountpoint=/var zroot/var
- Exit Fixit mode, and then bsdinstall.
===== Finishing Up =====
- Go through the the remaining steps in the procedure in [[clusteradm/NYINetinstall]] after the "do the install" step in the "machines which will boot from hard drive" section. When you reboot the first time, the system should boot using the ZFS root.