ZFS Upgraded pool, now can't boot

I upgraded my pool a while back, and when I eventually rebooted my system, it would no longer boot. I know the pool is still present and apparently intact, since I was able to inspect it using a live image, but it just won't boot back up.

I haven't seen this exact error in my searches, so I would be grateful for any help.


Bash:
BIOS drive C: is disk 0
BIOS drive D: is disk 1
BIOS drive E: is disk 2
BIOS drive F: is disk 3
zio_read error: 5
zio_read error: 5
zio_read error: 5
ZFS: i/o error - all block copies unavailable
ZFS: can't read MOS of pool tank

Can't find /boot/zfsloader

Can't find /boot/loader

Can't find /boot/kernel/kernel

FreeBSD/x86 boot
Default: /boot/kernel/kernel
boot:

FreeBSD/x86 boot
Default: /boot/kernel/kernel
boot:
 
If you're upgraded your pool to a version that your current freebsd version does not support, it may not boot. What was happening more clearly?
 
Create a bootable device with latest 15.0 FreeBSD, boot into that and then upgrade your bootcode from the live media.
You need to give more information as to booting: UEFI or oldfashioned BIOS/MBR?

The fundamental issue is your bootcode does not recognize/understand the updated zpool as bootable.

In the future, "never do zpool upgrade until I've done a bootcode update". Bootcode update first, zpool upgrade second.
 
this looks like a non efi boot
you need to rewrite gptzfsboot from 15. see gpart bootcode
alternatively you may reduce swap (if there is one) and create an efi part and install a more current efi loader
 
  • Like
Reactions: mer
In the future, "never do zpool upgrade until I've done a bootcode update". Bootcode update first, zpool upgrade second.
I wish I got such a warning.

Does it matter that this system is on 14?

I believe it is using BIOS/MBR.
 
boot from external media, 14 or 15 and stop the loader at the counter / menu
at the loader prompt type lsdev -v
if it shows your zpool then bootcode will probably fix it
 
  • Like
Reactions: mer
Just an idea (implementing it beyonds me), but something like below would be needed.
  • Special, fixed name (ideally throuout all OS'es with file structure and encodings) marker file at root directory containing
    the location/name of most recently built boot code (on FreeBSD, should be /boot/loader.efi or /boot/boot1.efi for UEFI and gptzfsboot for legacy BIOS),
    the location where it should be installed (on FreeBSD, \EFI\freebsd\ for UEFI and appropreate freebsd-boot type of partition that BIOS recognizes for legacy BIOS),
    list of all supported read-incompatible features by the bootcode
  • Special, fixed name marker file like above but containing info for currently installed bootcode
  • Add functionality to determine features the latest bootcode supports and drop any features that are NOT supported from candidates to enable on `zpool upgrade` and upgrading bootcode with regard to the marker file above.
Why root directory is because not all OS'es supporting ZFS (including something developed in the future) has /boot/ like in FreeBSD. So the root directory is the only safe place to put the marker files.
And why not embedding the data into the bootcodes is because of the strict limitations on legacy BIOS boot codes.
 
Back
Top