Re: System not booting after upgrade 14.3->14.4 with "ZFS: unsupported feature: com.klarasystems: vdev_zaps_v2"

Johan Helsingius <[email protected]> Sun, 3 May 2026 12:34:59 +0200
Newsgroups gmane.os.freebsd.questions
Message-ID <[email protected]>
Hi Mark,

Great instructions! Thanks!

	Julf

On 02/05/2026 10:57 pm, Mark G. wrote:
> On 4/30/26 02:28, Johan Helsingius wrote:
>> Hi all,
>>
>> Was doing an upgrade from 14.3-R7 to 14.4, and after the freebsd-update
>> install, the reboot fails with "ZFS: unsupported feature:
>> com.klarasystems: vdev_zaps_v2"
>>
>> Any idea what that feature is, and how to recover?
>>
>>       Julf
>>
> 
> Here are my notes for when I had to solve the klara issue:
> 
> Disclaimer:  MAKE SURE TO USE YOUR DRIVE NAMES AND PARTITION NUMBERS
> 
> 6.1 Updating Boot Loaders (ZFS)
> 
> I had a failure to boot after an update from FreeBSD 14.2-p3 to 14.2-p4, which had an
> upgraded zfs.ko kernel module. Here is the error and boot failure.
> 
> =====
> Consoles: EFI console
> ZFS: unsupported feature: com.klarasystems:vdev_zaps_v2
> FreeBSD/amd64 EFI loader, Revision 1.1
> ...
> Failed to find bootable partition
> Press any key to interrupt reboot in 3 seconds
> can’t load ’kernel’
> Type ’?’ for a list of commands, ’help’ for more detailed help.
> OK
> =====
> 
> The fixes required boot into single user mode via an USB bootable drive.
> The drive contained FreeBSD 14.2 as an installer with single user
> mode as well.
> 
> Once the USB is booted into single user mode, set the root partition to be mounted
> read-write:
> 
> # mount -u /
> 
> The change from FreeBSD version 13.x to 14.x required updating the boot loaders (in
> various ways) based on zfs-on-root installations. I had failed to do this at the time and
> got bit for it.
> 
> The FreeBSD 14 release notes 1 document this as quoted below.
> 
> [1] https://www.freebsd.org/releases/14.0R/relnotes/
> 
> =======
> "There have been a number of improvements in the boot loaders, and up-
> grading the boot loader on the boot partition is recommended in most cases,
> in particular if the system boots via EFI. If the root is on a ZFS file system,
> updating the boot loader is mandatory if the pool is to be upgraded, and
> the boot loader update must be done first. Note that ZFS pool upgrades are
> not recommended for root file systems in most cases, but updating the boot
> loader can avoid making the system unbootable if the pool is upgraded in
> the future. The bootstrap update procedure depends on the boot method
> (EFI or BIOS), and also on the disk partitioning scheme. The next several
> sections address each in turn.
> 
> Notes for systems that boot via EFI, using either binary or source up-
> grades: There are one or more copies of the boot loader on the MS-DOS
> EFI System Partition (ESP), used by the firmware to boot the kernel. The
> location of the boot loader in use can be determined using the command
> efibootmgr -v. The value displayed for BootCurrent should be the number of
> the current boot configuration used to boot the system. The corresponding
> entry of the output should begin with a + sign, such as
> 
> +Boot0000* FreeBSD HD(1,GPT,f859c46d-19ee-4e40-8975-3ad1ab00ac09,
> 0x800,0x82000)/File(\EFI\freebsd\loader.efi)
> nda0p1:/EFI/freebsd/loader.efi (null)
> 
> The ESP may already be mounted on /boot/efi. Otherwise, the parti-
> tion may be mounted manually, using the partition listed in the efibootmgr
> output (nda0p1 in this case): mount msdosfs /dev/nda0p1 /boot/efi. See
> loader.efi(8) for another example.
> 
> The value in the File field in the efibootmgr -v output, \EFI \freebsd\loader.efi
> in this case, is the MS-DOS name for the boot loader in use on the ESP. If the
> mount point is /boot/efi, this file will translate to /boot/efi/efi/freebsd/loader.efi.
> (Case does not matter on MS-DOSFS file sytems; FreeBSD uses lower case.)
> Another common value for File would be \EFI\boot\bootXXX.efi, where
> XXX is x64 for amd64, aa64 for aarch64, or riscv64 for riscv64; this is the
> default bootstrap if none is configured. Both the configured and default boot
> loaders should be updated by copying from /boot/loader.efi to the correct
> path in /boot/efi.
> 
> For systems that boot via BIOS and use the GPT partition scheme, boot-
> strap upgrades are optional unless a ZFS root pool will be upgraded (which
> is discouraged). Upgrades are only possible if the freebsd-boot partition is
> at least 180K. (512K is now standard.) The device name and the partition
> index can be identified using the command gpart show, such as:
> 
>       =>  34  246162605  ada0 GPT   (224G)
>       34  1024     1 freebsd-boot   (512K)
> 
> When using ZFS, the bootcode can be updated by running the command
> gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada0. If up-
> dating with a UFS root, the bootcode can be updated by running the com-
> mand gpart bootcode -b /boot/pmbr -p /boot/gptboot -i 1 ada0, al-
> though this should not be necessary. Note that the freebsd-boot partition
> size is running up against a hard limit, and this scheme may not be support-
> able in the future. Users of such systems should consider an upgrade to EFI,
> possibly by carving space from an existing swap partition.
> 
> If the system boots via BIOS and uses the MBR partition scheme, or has
> a GPT freebsd-boot partition smaller than 180K, then it is not possible to
> update the bootcode, and therefore to upgrade the root ZFS storage pool."
> =======
> 
> There are two instances that I had to deal with.
> 
> 6.1.1 UEFI Boot Loader
> 
> Most of my newer mini PCs used a UEFI layout for booting and thus have disks
> partitioned similar to this:
> 
> user@think:~ % gpart show
> =>      40  3907029088  nda0  GPT  (1.8T)
>           40      532480     1  efi  (260M)
>       532520        1024     2  freebsd-boot  (512K)
>       533544         984        - free -  (492K)
>       534528    33554432     3  freebsd-swap  (16G)
>     34088960  3872940032     4  freebsd-zfs  (1.8T)
> 3907028992         136        - free -  (68K)
> 
> 
> The partition of interest is the first one (1) with a type of efi.
> This is actually an msdos based partition and can be mounted as such.
> 
> user@think:~ % cat /etc/fstab
> # Device Mountpoint FStype Options Dump Pass#
> /dev/gpt/efiboot0 /boot/efi msdosfs rw 2 2
> 
> The /dev/gpt/efiboot0 device is equivalent to /dev/nda0p1, in this case.
> 
> root@dmz1:~ # mount /boot/efi
> root@dmz1:~ # mount
> ...
> /dev/gpt/efiboot0 on /boot/efi (msdosfs, local)
> 
> To update the boot loader to a FreeBSD 14.x version, the above file system should be
> mounted and its contents will look like:
> 
> user@think:~ % ls -laR /boot/efi
> user@think:~ % ls -laR /boot/efi
> total 25
> drwxr-xr-x   1 root wheel 16384 Dec 31  1979 .
> drwxr-xr-x  15 root wheel    71 Jul  6 20:22 ..
> drwxr-xr-x   1 root wheel 16384 Feb 12 18:49 efi
> 
> /boot/efi/efi:
> total 48
> drwxr-xr-x  1 root wheel 16384 Feb 12 18:49 .
> drwxr-xr-x  1 root wheel 16384 Dec 31  1979 ..
> drwxr-xr-x  1 root wheel 16384 Feb 12 18:49 boot
> drwxr-xr-x  1 root wheel 16384 Feb 12 18:49 freebsd
> 
> /boot/efi/efi/boot:
> total 688
> drwxr-xr-x  1 root wheel  16384 Feb 12 18:49 .
> drwxr-xr-x  1 root wheel  16384 Feb 12 18:49 ..
> -rwxr-xr-x  1 root wheel 660992 Feb 12 18:49 bootx64.efi
> 
> /boot/efi/efi/freebsd:
> total 688
> drwxr-xr-x  1 root wheel  16384 Feb 12 18:49 .
> drwxr-xr-x  1 root wheel  16384 Feb 12 18:49 ..
> -rwxr-xr-x  1 root wheel 660992 Feb 12 18:49 loader.efi
> 
> We have to update both paths:
> 
> /boot/efi/efi/boot/bootx64.efi
> /boot/efi/efi/freebsd/loader.efi
> 
> with the file found in /boot/loader.efi. To whit (make some copies of the old ones
> first):
> 
> root@metal:~ # cp /boot/efi/efi/freebsd/loader.efi loader.efi.from13.x
> root@metal:~ # cp /boot/efi/efi/boot/bootx64.efi bootx64.efi.from13.x
> root@metal:~ # cp /boot/loader.efi /boot/efi/efi/freebsd/loader.efi
> root@metal:~ # cp /boot/loader.efi /boot/efi/efi/boot/bootx64.efi
> 
> 
> There is a command called efibootmgr which can supply some information:
> 
> root@dmz1:~ # efibootmgr -v
> Boot to FW : false
> BootCurrent: 0000
> Timeout    : 1 seconds
> BootOrder  : 0000, 0001
> +Boot0000* FreeBSD HD(1,GPT,9ccacd8f-5c7a-11f0-bfc4-5847ca753c56,
>     0x28,0x82000)/File(\EFI\FREEBSD\LOADER.EFI)
>     ada0p1:/EFI/FREEBSD/LOADER.EFI (null)
> 
> Boot0001* UEFI OS HD(1,GPT,9ccacd8f-5c7a-11f0-bfc4-5847ca753c56,
>     0x28,0x82000)/File(\EFI\BOOT\BOOTX64.EFI)
>     ada0p1:/EFI/BOOT/BOOTX64.EFI (null)
> 
> Boot0001* UEFI OS HD(1,GPT,9ccacd8f-5c7a-11f0-bfc4-5847ca753c56,
> 0x28,0x82000)/File(\EFI\BOOT\BOOTX64.EFI)
> ada0p1:/EFI/BOOT/BOOTX64.EFI (null)
> 
> The plus (+) sign indicates the file currently in use.
> 
> 
> 6.1.2 BIOS GPT Boot Loader
> 
> The second variant I have is an old Lenovo non-UEFI BIOS based system which has a
> partition scheme similar to this:
> 
> root@gate:~ % gpart show
> =>     40  468862048  ada0  GPT  (224G)
>          40       1024     1  freebsd-boot  (512K)
>        1064        984        - free -  (492K)
>        2048    4194304     2  freebsd-swap  (2.0G)
>     4196352  464664576     3  freebsd-zfs  (222G)
> 468860928       1160        - free -  (580K)
> 
> 
> Note the lack of an efi partition.
> 
> The update here is:
> # gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada0
> 
> If drives are mirrored and have the same gpart setup, use the same command for each
> drive: ada1, ada2, and so on.
> 
> 
> 
> 
> 
> 
>