8 years have already passed since I made a Root on ZFS environemnt with Legacy/GPT boot on FreeBSD 9.0-BETA3. I'm using it until now while upgrading the OS, but the boot environment is no change. I thought it wasn't cool even in 2019 nowdays, so I tried to migrate the boot method to UEF/GPT boot.
This how-to is “as-is” way based on my experiment which tried to manually install the FreeBSD UEFI environment or compare between it and a system built by bsdinstall
, so this UEFI environment may not fit into FreeBSD's official UEFI environment.
ada0
.
All you need is to make a EPS and put a UEFI boot loader on it.
Create the ESP((EFI System Partition) on a boot storage. The boot loader for UEFI will be put there, but securing the partition is the biggest hurdle to do it.
It is okay if the disk has enough space otherwise you have no choice but to replace it with new one. In this case, adding a new disk as ZFS mirror member to the system pool makes it easy to synchronize the data. You managed to create the partition by well thought out, please.
# gpart add -a 4k -t efi -s 200m ada0
The partition size is as you like. FYI, the FreeBSD installer makes as 200MB.
I had a prepared 512MB ESP (ada0p1
) in for this occasion, so used it.
> gpart show ada0 => 34 1099999933 ada0 GPT (525G) 34 6 - free - (3.0K) 40 1048576 1 efi (512M) 1048616 1024 2 freebsd-boot (512K) 1049640 251658240 3 freebsd-zfs (120G) 252707880 8388608 4 freebsd-zfs (4.0G) 261096488 8388608 5 freebsd-zfs (4.0G) 269485096 8388608 6 freebsd-zfs (4.0G) 277873704 629145600 7 freebsd-zfs (300G) 907019304 125829120 8 freebsd-zfs (60G) 1032848424 41943040 9 freebsd-zfs (20G) 1074791464 25208503 - free - (12G)
Format the ESP for FAT32.
For 512 bytes per sector devices: # newfs_msdos -F 32 -S 512 -c 4 ada0p1 /dev/ada0p1: 1044464 sectors in 261116 FAT32 clusters (2048 bytes/cluster) BytesPerSec=512 SecPerClust=4 ResSectors=32 FATs=2 Media=0xf0 SecPerTrack=63 Heads=16 HiddenSecs=0 HugeSectors=1048576 FATsecs=2040 RootCluster=2 FSInfo=1 Backup=2 For 4096 bytes per sector devices: # newfs_msdos -F 32 -S 4096 -c 1 ada0p1 /dev/nvd0p1: 130812 sectors in 130812 FAT32 clusters (4096 bytes/cluster) BytesPerSec=4096 SecPerClust=1 ResSectors=4 FATs=2 Media=0xf0 SecPerTrack=63 Heads=255 HiddenSecs=0 HugeSectors=131072 FATsecs=128 RootCluster=2 FSInfo=1 Backup=2
Mount the created ESP.
$ mkdir /tmp/esp # mount -t msdosfs /dev/ada0p1 /tmp/esp
Make a folder and put a UEFI boot loader on the ESP.
$ mkdir -p /tmp/esp/efi/boot $ cp /boot/boot1.efi /tmp/esp/efi/boot/BOOTx64.efi
Write a UEFI shell script for boot.
$ echo 'BOOTx64.efi' >> /tmp/esp/efi/boot/startup.nsh
It is okay that a file structure on the ESP looks like below:
$ cd /tmp/esp/ $ find . . ./efi ./efi/boot ./efi/boot/BOOTx64.efi ./efi/boot/startup.nsh
Surely unmount the ESP.
$ cd # umount /tmp/esp
Reboot your system.
# reboot
Change boot method “Legacy” to “UEFI” on your machine BIOS. I think the setting menu or the config name is different with each machine, so please somehow find it out.
Save the config, reboot your system again, then the FreeBSD will boot under the UEFI environment.
It may be success when display shows boot screen with a message “FreeBSD EFI boot block” like above.