So the other day I attempted to upgrade my ZFS zpool on FreeBSD. After the move, it's been quite hecting and I have not had the time to do some TLC housekeeping on my BSD farm. The systems returned a message saying that I have to update my boot code. Unfortunately one of the systems had too small of a boot partition and there was not enough room to write the new bootcode.
$ sudo zpool upgrade tank This system supports ZFS pool feature flags. Enabled the following features on 'tank': sha512 skein device_removal obsolete_counts zpool_checkpoint If you boot from pool 'tank', don't forget to update boot code. Assuming you use GPT partitioning and da0 is your boot disk the following command will do it: gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 da0
$ sudo gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada0 gpart: /dev/ada0p1: not enough space
Well crap #1....We don't have enough space. Let's do some digging around.
$ gpart show => 34 250069613 ada0 GPT (119G) 34 6 - free - (3.0K) 40 1024 1 freebsd-boot (64K) 1064 8387712 2 freebsd-swap (4.0G) 8388776 241680864 3 freebsd-zfs (115G) 250069640 7 - free - (3.5K) $ du -sh /boot/gptzfsboot 117K /boot/gptzfsboot
Our current freebsd-boot partition is only 64K but the /boot/gptzfsboot file is 117K.
What do we do?
What we need to do is remove freebsd-boot and freebsd-swap partitions in order to create a larger freebsd-boot partition with 512K size. Easy Peasy. Let's try that...
Start off with disabling SWAP before we delete its partition:
$ swapoff -a swapoff: /dev/gptid/dc62e18d-25a7-11e6-9df9-50465d51d4d1: Cannot allocate memory
Well crap #2....
We can't disable swap partition temporarily as there is something in the swap memory already!
Alright alright. Take a deep breath. Moving on... -_-
Create a new ZFS-based swap filesystem.
$ zfs create -V 4G -o org.freebsd:swap=on -o checksum=off -o compression=off -o dedup=off -o sync=disabled -o primarycache=none tank/swap
Four gigs will do. Enable the partition and disable the old swap that we're trying to remove to gain some extra space.
$ swapon /dev/zvol/tank/swap $ swapoff /dev/gptid/dc62e18d-25a7-11e6-9df9-50465d51d4d1 $ swapctl -l
Delete the old boot and swap partition:
$ gpart delete -i 1 ada0 $ gpart delete -i 2 ada0
Great. That worked.
Add new partitions:
$ gpart add -b 40 -s 512K ada -t freebsd-boot ada0 $ gpart add -t freebsd-swap ada0
Print the partition table:
$ gpart show => 34 250069613 ada0 GPT (119G) 34 6 - free - (3.0K) 40 1024 1 freebsd-boot (512K) 1064 8387712 2 freebsd-swap (4.0G) 8388776 241680864 3 freebsd-zfs (115G) 250069640 7 - free - (3.5K)
Setup the bootloader on the new partition (you know, the thing we tried to do in the beginning):
$ gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada0 $ partcode written to ada0p1 $ bootcode written to ada0
Don't forget to disable ZFS-based swap partition and to update /etc/fstab with new swap!
$ swapon -F /etc/fstab /dev/gptid/618812bd-d1b9-11e8-b735-50465d51d4d1 $ swapoff /dev/zvol/tank/swap