For install, the root disk defaults to the first available [sw]d* disk.

The new encryption question creates a softraid volume for you, which is
obviously to be used as root disk.

But on systems with multiple disks, the next one available may be another.

        Available disks are: sd0 sd1.
        Encrypt the root disk? (disk, 'no' or '?' for details) [no] sd0
        ...
        Available disks are: sd1 sd2.
        Which disk is the root disk? ('?' for details) [sd1] ?
        sd0: VirtIO, Block Device  (5.0G)
        sd1: VirtIO, Block Device  (5.0G)
        sd2: OPENBSD, SR CRYPTO, 006  (5.0G)
        Available disks are: sd1 sd2.
        Which disk is the root disk? ('?' for details) [sd1] sd1

'Encrypt the root disk?' is asked if and only if no softraid volume is
assembled at that time, which means whatever volume exists afterwards is
the intended root disk.

Save and use it as default for the root question if set.

This is nicely contained and has no behaviour change except for interactive
crypto installs which now nail the default regardless of disk setup:

        Available disks are: sd1 sd2.
        Which disk is the root disk? ('?' for details) [sd2]

OK?

Index: install.sub
===================================================================
RCS file: /cvs/src/distrib/miniroot/install.sub,v
retrieving revision 1.1239
diff -u -p -r1.1239 install.sub
--- install.sub 2 Apr 2023 00:58:07 -0000       1.1239
+++ install.sub 2 Apr 2023 01:20:18 -0000
@@ -310,6 +310,11 @@ get_softraid_chunks() {
        bioctl $_device 2>/dev/null | sed -n 's/.*<\(.*\).>$/\1/p'
 }
 
+# Return list of softraid volumes.
+get_softraid_volumes() {
+       bioctl softraid0 | sed -n 's/^softraid0.*\(sd[0-9]*\).*/\1/p'
+}
+
 # Return disk devices found in hw.disknames.
 get_dkdevs() {
        scan_disknames "${MDDKDEVS:-/^[sw]d[0-9][0-9]* /s/ .*//p}"
@@ -2398,7 +2403,7 @@ is_rootdisk() {
 
 # Get global root information. ie. ROOTDISK, ROOTDEV and SWAPDEV.
 get_rootinfo() {
-       local _default=$(get_dkdevs_root) _dkdev
+       local _default=${CRYPTOVOLUME:-$(get_dkdevs_root)} _dkdev
        local _q="Which disk is the root disk? ('?' for details)"
 
        while :; do
@@ -3078,7 +3083,7 @@ encrypt_root() {
 
        # Do not even try if softraid is in use already,
        # e.g. auto-assembled at boot or done in (S)hell.
-       [[ -z $(get_softraid_chunks) ]] || return
+       [[ -z $(get_softraid_volumes) ]] || return
 
        while :; do
                echo "Available disks are: $(get_dkdevs | sed 's/^$/none/')."
@@ -3109,6 +3114,9 @@ __EOT
        done
 
         CRYPTOCHUNK=$_chunk
+       # No volumes existed before asking, but we just created one.
+       # Save it for later as sane root disk default.
+       CRYPTOVOLUME=$(get_softraid_volumes)
 }
 
 do_install() {
@@ -3581,6 +3589,7 @@ NIFS=0
 export PS1="$MODE# "
 PUB_KEY=/etc/signify/openbsd-${VERSION}-base.pub
 CRYPTOCHUNK=
+CRYPTOVOLUME=
 ROOTDEV=
 ROOTDISK=
 SETDIR="$VNAME/$ARCH"

Reply via email to