EFI ZFS loader success story

Ganael Laplanche ganael.laplanche at corp.ovh.com
Wed Aug 12 12:05:19 UTC 2015

Hi folks, hi Eric,

Using the patch from this post :


against -CURRENT (r286279), I've been able to boot my ZFS-root system, yeah!

For those interested, here are the steps needed to get a working system. This 
should be done on a live system to be able to operate freely on the hard disk.

First, create the partitions :

We will work on a single disk, detected as ada0.

# gpart create -s gpt ada0
# gpart add -s 800K -t efi ada0
# gpart add -t freebsd-zfs ada0
# gpart show
=>        34  3907029101  ada0  GPT  (1.8T)
          34        1600     1  efi  (800K)
        1634  3907027501     2  freebsd-zfs  (1.8T)

We use two partitions : the first one will host the loader and the second one, 
the zpool.

Create the zpool, ZFS and mount the root FS :

# zpool create -f -m none -o altroot=/mnt root ada0p2
# zfs create root/ROOT
# zfs create root/ROOT/default
# zfs set mountpoint=/ root/ROOT/default
# zpool set bootfs=root/ROOT/default root
# zfs mount -a
# mkdir /mnt/dev
# mount -t devfs none /mnt/dev

Install the system :

Now it is time to install the system within /mnt.

[ not detailed here, use your favourite method ]

You can then unmount and export the zpool.

# umount /mnt/dev
# zpool export root

Prepare the EFI partition :

We copy the (patched) loader.efi (*not* boot1.efi, which did not work for me) 
to efi/boot/BOOTx64.efi and set currdev within loader.rc :

# newfs_msdos ada0p1
# mount -t msdosfs /dev/ada0p1 /mnt
# mkdir -p /mnt/efi/boot/
# cp loader-zfs.efi /mnt/efi/boot/BOOTx64.efi
# mkdir -p /mnt/boot
# cat > /mnt/boot/loader.rc << EOF
set currdev=zfs:root/ROOT/default:
load boot/kernel/kernel
load boot/kernel/zfs.ko
# (cd /mnt && find .)
# umount /mnt

Now, reboot and enjoy you new system :)

Pushing the limits :

Using this method, it is even possible to get a system bootable from UEFI *or* 
legacy BIOS.

Just insert a freebsd-boot (64K) partition between the efi and freebsd-zfs 
ones and install the pmbr + gptzfsboot loaders :

# gpart bootcode -b /mnt/boot/pmbr -p /mnt/boot/gptzfsboot -i 2 ada0

Finally, modify the /boot/loader.conf file within the ZFS root filesystem 
(mounted on /mnt) :

# cat >> /mnt/boot/loader.conf << EOF

Now, you can reboot either from BIOS or UEFI, the system will handle both.

Given the following partition scheme :

1  efi  (800K)
2  freebsd-boot  (64K)
3  freebsd-zfs  (1.8T)

The boot process will use the following paths :

Boot from BIOS -> MBR (pmbr) -> 2 (gptboot) -> 3 (loader) -> 3 (kernel) -> zfs 
root mounted
Boot from UEFI -> 1 (BOOTx64.efi, a.k.a patched loader.efi) -> 3 (kernel) -> 
zfs root mounted

Eric, thanks for your great work, I hope your patch will be committed soon :)


Ganaël LAPLANCHE <ganael.laplanche at corp.ovh.com>

More information about the freebsd-hackers mailing list