[Bug 271262] bsdinstaller in AutoZFS + MBR mode always wipes disklabel - rendering system non-bootable

From: <bugzilla-noreply_at_freebsd.org>
Date: Sat, 01 Jul 2023 01:00:11 UTC
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=271262

--- Comment #11 from R. Christian McDonald <rcm@rcm.sh> ---
https://reviews.freebsd.org/D40816


diff --git a/usr.sbin/bsdinstall/scripts/zfsboot
b/usr.sbin/bsdinstall/scripts/zfsboot
--- a/usr.sbin/bsdinstall/scripts/zfsboot
+++ b/usr.sbin/bsdinstall/scripts/zfsboot
@@ -106,6 +106,11 @@
 #
 : ${ZFSBOOT_BOOT_POOL_SIZE:=2g}

+#
+# Default offset for the boot pool when enabled (e.g., geli(8) or MBR)
+#
+: ${ZFSBOOT_BOOT_POOL_OFFSET:=2048}
+
 #
 # Default disks to use (always empty unless being scripted)
 #
@@ -1008,12 +1013,14 @@

                #
                # Always prepare a boot pool on MBR
-               # Do not align this partition, there must not be a gap
+               #
+               # Offset the boot pool in order to protect the disk label
+               # and zfsboot from being clobbered by ZFS
                #
                ZFSBOOT_BOOT_POOL=1
                f_eval_catch $funcname gpart \
                             "$GPART_ADD_ALIGN_INDEX_WITH_SIZE" \
-                            "" 1 freebsd-zfs ${bootsize}b ${disk}s1 ||
+                            "-b $ZFSBOOT_BOOT_POOL_OFFSET" 1 freebsd-zfs
${bootsize}b ${disk}s1 ||
                             return $FAILURE
                # Pedantically nuke any old labels
                f_eval_catch -d $funcname zpool "$ZPOOL_LABELCLEAR_F" \
@@ -1424,11 +1431,11 @@
                fi

                f_dprintf "$funcname: Updating MBR boot loader on disks..."
-               # Stick the ZFS boot loader in the "convenient hole" after
-               # the ZFS internal metadata
+               # The boot pool is offset from the beginning of the slice in
order
+               # to protect the disk label and zfsboot from being clobbered by
ZFS
                for disk in $disks; do
                        f_eval_catch $funcname dd "$DD_WITH_OPTIONS" \
-                                    /boot/zfsboot /dev/$disk$bootpart \
+                                    /boot/zfsboot /dev/${disk}s1 \
                                     "skip=1 seek=1024" || return $FAILURE
                done

-- 
You are receiving this mail because:
You are the assignee for the bug.