A couple of days ago, after switching on my laptop, the
boot process stopped early within the FreeBSD boot loader
showing an obscure message
ZFS: i/o error - all block copies unavailable:
No further interaction was possible, so it basically
“paniced” within the boot loader. And of course, I did
panic too (at least a bit), as the last full backup was
before I left home about two month ago. The night before
the crash, I was doing a forceful package update using
pkg upgrade -f, mainly because the update to FreeBSD
13.2-RELEASE did not went too well thanks to my own
stupidity of updating the packages before doing the second
freebsd-update install. Most likely, during
pkg upgrade -f, the ZFS filesystem got exhausted and for
some unknown reason destroyed the boot loader. Or some
other obscure corruption happend.
Fixing the corrupt boot loader
So what did I do to fix the corrupt boot loader?
The article Recover a FreeBSD system using a liveUSB helped a lot.
First step: Get a FreeBSD live USB image (FreeBSD 13.1, as 13.2 did not boot properly) and boot into it.
Then: I first checked if I can mount my ZFS root filesystem and data partitions:
# The root ZFS file system is on my NVME SSD (nvd0) # located in the 4th GPT partition (nvd0p4). # It is `geli` encrypted, so we first need to attach it. geli attach /dev/nvd0p4 # Import the zroot pool zpool import -fR /mnt zroot # Mount the ROOT filesystem mount -t zfs zroot/ROOT/default /mnt
Luckily, this did not show any corruption. So I continued with re-initializing the boot loader as can be seen on the second half of the following screenshot:
Or in text form:
# Show where freebsd-boot resides gpart show nvd0 # Re-initialize it (partition 2) gpart bootcode -b /boot/zfsboot -i 2 nvd0
After this I was able to boot normally into FreeBSD.