Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 17 Aug 2022 17:41:07 GMT
From:      Warner Losh <imp@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: ef8b872301c5 - main - stand: Flesh out the zfs image creation
Message-ID:  <202208171741.27HHf7RC011136@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch main has been updated by imp:

URL: https://cgit.FreeBSD.org/src/commit/?id=ef8b872301c5fbeeea3b0410b369b8f36584cd65

commit ef8b872301c5fbeeea3b0410b369b8f36584cd65
Author:     Warner Losh <imp@FreeBSD.org>
AuthorDate: 2022-08-17 17:33:58 +0000
Commit:     Warner Losh <imp@FreeBSD.org>
CommitDate: 2022-08-17 17:39:53 +0000

    stand: Flesh out the zfs image creation
    
    Move the mbr non-geli zfs cases to no-priv creation with makefs / mkimg.
    Add comments about the weird thing we do for MBR + ZFS + Legacy.  Add
    comments about other architectures. Still need to think through how to
    leverage a completed universe to do all the architectures...
    
    Sponsored by:           Netflix
---
 tools/boot/rootgen.sh | 150 ++++++++++++++++++--------------------------------
 1 file changed, 54 insertions(+), 96 deletions(-)

diff --git a/tools/boot/rootgen.sh b/tools/boot/rootgen.sh
index f087afa5ad49..06e8a1ec8245 100755
--- a/tools/boot/rootgen.sh
+++ b/tools/boot/rootgen.sh
@@ -214,35 +214,21 @@ mk_nogeli_mbr_zfs_legacy() {
     bios=$7
     pool=nogeli-mbr-zfs-legacy
 
-    dd if=/dev/zero of=${img} count=1 seek=$((200 * 1024 * 1024 / 512))
-    md=$(mdconfig -f ${img})
-    gpart create -s mbr ${md}
-    gpart add -t freebsd ${md}
-    gpart set -a active -i 1 ${md}
-    gpart create -s bsd ${md}s1
-    gpart add -t freebsd-zfs ${md}s1
-    # install-boot will make this bootable
-    zpool create -O mountpoint=none -R ${mntpt} ${pool} ${md}s1a
-    zpool set bootfs=${pool} ${pool}
-    zfs create -po mountpoint=/ ${pool}/ROOT/default
-    # NB: The online guides go nuts customizing /var and other mountpoints here, no need
-    cpsys ${src} ${mntpt}
-    # need to make a couple of tweaks
-    cat >> ${mntpt}/boot/loader.conf <<EOF
-cryptodev_load=YES
-zfs_load=YES
-EOF
-    cp /boot/kernel/acl_nfs4.ko ${mntpt}/boot/kernel/acl_nfs4.ko
-    cp /boot/kernel/cryptodev.ko ${mntpt}/boot/kernel/cryptodev.ko
-    cp /boot/kernel/zfs.ko ${mntpt}/boot/kernel/zfs.ko
-    # end tweaks
-    zfs umount -f ${pool}/ROOT/default
-    zfs set mountpoint=none ${pool}/ROOT/default
-    zpool set bootfs=${pool}/ROOT/default ${pool}
-    zpool set autoexpand=on ${pool}
-    zpool export ${pool}
-    ${SRCTOP}/tools/boot/install-boot.sh -g ${geli} -s ${scheme} -f ${fs} -b ${bios} -d ${src} ${md}
-    mdconfig -d -u ${md}
+    zfs_extra $src $dst
+    makefs -t zfs -s 200m \
+	-o poolname=${pool} -o bootfs=${pool} -o rootpath=/ \
+	${img}.s1a ${src} ${dst}
+    # The old boot1/boot2 boot split is also used by zfs. We need to extract zfsboot1
+    # from this image. Since there's no room in the mbr format for the rest of the loader,
+    # it will load the zfsboot loader from the reserved for bootloader area of the ZFS volume
+    # being booted, hence the need to dd it into the raw img later.
+    # Please note: zfsboot only works with partition 'a' which must be the root
+    # partition / zfs volume
+    dd if=${src}/boot/zfsboot of=${dst}/zfsboot1 count=1
+    mkimg -s bsd -b ${dst}zfsboot1 -p freebsd-zfs:=${img}.s1a -o ${img}.s1
+    dd if=${src}/boot/zfsboot of=${img}.s1a skip=1 seek=1024
+    mkimg -a 1 -s mbr -b ${src}/boot/mbr -p freebsd:=${img}.s1 -o ${img}
+    rm -rf ${dst}
 }
 
 mk_nogeli_mbr_zfs_uefi() {
@@ -255,36 +241,14 @@ mk_nogeli_mbr_zfs_uefi() {
     bios=$7
     pool=nogeli-mbr-zfs-uefi
 
-    dd if=/dev/zero of=${img} count=1 seek=$((200 * 1024 * 1024 / 512))
-    md=$(mdconfig -f ${img})
-    gpart create -s mbr ${md}
-    gpart add -t efi -s ${espsize}k ${md}
-    gpart add -t freebsd ${md}
-    gpart set -a active -i 2 ${md}
-    gpart create -s bsd ${md}s2
-    gpart add -t freebsd-zfs ${md}s2
-    # install-boot will make this bootable
-    zpool create -O mountpoint=none -R ${mntpt} ${pool} ${md}s2a
-    zpool set bootfs=${pool} ${pool}
-    zfs create -po mountpoint=/ ${pool}/ROOT/default
-    # NB: The online guides go nuts customizing /var and other mountpoints here, no need
-    cpsys ${src} ${mntpt}
-    # need to make a couple of tweaks
-    cat >> ${mntpt}/boot/loader.conf <<EOF
-cryptodev_load=YES
-zfs_load=YES
-EOF
-    cp /boot/kernel/acl_nfs4.ko ${mntpt}/boot/kernel/acl_nfs4.ko
-    cp /boot/kernel/cryptodev.ko ${mntpt}/boot/kernel/cryptodev.ko
-    cp /boot/kernel/zfs.ko ${mntpt}/boot/kernel/zfs.ko
-    # end tweaks
-    zfs umount -f ${pool}/ROOT/default
-    zfs set mountpoint=none ${pool}/ROOT/default
-    zpool set bootfs=${pool}/ROOT/default ${pool}
-    zpool set autoexpand=on ${pool}
-    zpool export ${pool}
-    ${SRCTOP}/tools/boot/install-boot.sh -g ${geli} -s ${scheme} -f ${fs} -b ${bios} -d ${src} ${md}
-    mdconfig -d -u ${md}
+    zfs_extra $src $dst
+    make_esp_file ${img}.s1 ${espsize} ${src}/boot/loader.efi
+    makefs -t zfs -s 200m \
+	-o poolname=${pool} -o bootfs=${pool} -o rootpath=/ \
+	${img}.s2a ${src} ${dst}
+    mkimg -s bsd -b ${dst}zfsboot1 -p freebsd-zfs:=${img}.s2a -o ${img}.s2
+    mkimg -a 1 -s mbr -b ${src}/boot/mbr -p efi:=${img}.s1 -p freebsd:=${img}.s2 -o ${img}
+    rm -rf ${dst}
 }
 
 mk_nogeli_mbr_zfs_both() {
@@ -297,36 +261,21 @@ mk_nogeli_mbr_zfs_both() {
     bios=$7
     pool=nogeli-mbr-zfs-both
 
-    dd if=/dev/zero of=${img} count=1 seek=$((200 * 1024 * 1024 / 512))
-    md=$(mdconfig -f ${img})
-    gpart create -s mbr ${md}
-    gpart add -t efi -s  ${espsize}k ${md}
-    gpart add -t freebsd ${md}
-    gpart set -a active -i 2 ${md}
-    gpart create -s bsd ${md}s2
-    gpart add -t freebsd-zfs ${md}s2
-    # install-boot will make this bootable
-    zpool create -O mountpoint=none -R ${mntpt} ${pool} ${md}s2a
-    zpool set bootfs=${pool} ${pool}
-    zfs create -po mountpoint=/ ${pool}/ROOT/default
-    # NB: The online guides go nuts customizing /var and other mountpoints here, no need
-    cpsys ${src} ${mntpt}
-    # need to make a couple of tweaks
-    cat >> ${mntpt}/boot/loader.conf <<EOF
-cryptodev_load=YES
-zfs_load=YES
-EOF
-    cp /boot/kernel/acl_nfs4.ko ${mntpt}/boot/kernel/acl_nfs4.ko
-    cp /boot/kernel/cryptodev.ko ${mntpt}/boot/kernel/cryptodev.ko
-    cp /boot/kernel/zfs.ko ${mntpt}/boot/kernel/zfs.ko
-    # end tweaks
-    zfs umount -f ${pool}/ROOT/default
-    zfs set mountpoint=none ${pool}/ROOT/default
-    zpool set bootfs=${pool}/ROOT/default ${pool}
-    zpool set autoexpand=on ${pool}
-    zpool export ${pool}
-    ${SRCTOP}/tools/boot/install-boot.sh -g ${geli} -s ${scheme} -f ${fs} -b ${bios} -d ${src} ${md}
-    mdconfig -d -u ${md}
+    zfs_extra $src $dst
+    make_esp_file ${img}.s1 ${espsize} ${src}/boot/loader.efi
+    makefs -t zfs -s 200m \
+	-o poolname=${pool} -o bootfs=${pool} -o rootpath=/ \
+	${img}.s2a ${src} ${dst}
+    # The old boot1/boot2 boot split is also used by zfs. We need to extract zfsboot1
+    # from this image. Since there's no room in the mbr format for the rest of the loader,
+    # it will load the zfsboot loader from the reserved for bootloader area of the ZFS volume
+    # being booted, hence the need to dd it into the raw img later.
+    # Please note: zfsboot only works with partition 'a' which must be the root
+    # partition / zfs volume
+    dd if=${src}/boot/zfsboot of=${dst}/zfsboot1 count=1
+    mkimg -s bsd -b ${dst}zfsboot1 -p freebsd-zfs:=${img}.s2a -o ${img}.s2
+    dd if=${src}/boot/zfsboot of=${img}.s1a skip=1 seek=1024
+    mkimg -a 1 -s mbr -b ${src}/boot/mbr -p efi:=${img}.s1 -p freebsd:=${img}.s2 -o ${img}
 }
 
 mk_geli_gpt_ufs_legacy() {
@@ -779,7 +728,7 @@ fi
 for arch in amd64; do
     for geli in nogeli; do # geli
 	for scheme in gpt mbr; do
-	    for fs in ufs ; do # zfs
+	    for fs in ufs zfs; do
 		for bios in legacy uefi both; do
 		    make_one_image ${arch} ${geli} ${scheme} ${fs} ${bios}
 		done
@@ -787,6 +736,7 @@ for arch in amd64; do
 	done
     done
 done
+    # We should also do a cd image for amd64 here
 echo ${IMGDIR}/all.sh
 
 rmdir ${MNTPT}
@@ -800,24 +750,32 @@ for arch in i386; do
 	for scheme in gpt mbr; do
 	    for fs in ufs zfs; do
 		for bios in legacy; do
+		    # The legacy boot is shared with amd64 so those routines could
+		    # likely be used here.
 		    make_one_image ${arch} ${geli} ${scheme} ${fs} ${bios}
 		done
 	    done
 	done
     done
 done
+    # We should also do a cd image for i386 here
 
 for arch in arm aarch64; do
+    geli=nogeli		# I don't think geli boot works / is supported on arm
     for scheme in gpt mbr; do
-	fs=ufs
-	bios=efi
+      for fs in ufs zfs; do
+	bios=efi # Note: arm has some uboot support with ufs, what to do?
 	make_one_image ${arch} ${geli} ${scheme} ${fs} ${bios}
+      done
     done
 done
 
-for arch in powerpc powerpc64; do
-    for scheme in ppc-wtf; do
-	fs=ufs
+# It's not clear that the nested looping paradigm is best for powerpc
+# due to its diversity.
+for arch in powerpc powerpc64 powerpc64le; do
+    geli=nogeli
+    for scheme in apm gpt; do
+	fs=ufs # zfs + gpt might be supported?
 	for bios in ofw uboot chrp; do
 	    make_one_image ${arch} ${geli} ${scheme} ${fs} ${bios}
 	done
@@ -826,7 +784,7 @@ done
 
 for arch in riscv; do
     geli=nogeli
-    fs=ufs
+    fs=ufs		# Generic ZFS booting support with efi?
     scheme=gpt
     bios=efi
     make_one_image ${arch} ${geli} ${scheme} ${fs} ${bios}



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202208171741.27HHf7RC011136>