Another approach would be to make installboot(8) -p to retain existing
EFI Sys partitions instead of always recreating them.

This way, it was nothing to do with softraid, but installing on machines
like Apple arm64 depends on existing non-OpenBSD partitions and files on
them.

We hacked 'installboot -p' to do the 'try mount, fsck, retry mount, newfs'
dance it does in its normal mode (no '-p'), but that its own design choice
spilling over to all supported installboot architectures.

For this apple case, it'd be nice to have a sort of idempotent
'installboot -p', but at this point it seems overkill and I prefer to fix
it like caspar did down in the arm64 apple specific installer bits.

This is nicely contained and has no behaviour changes for machines without
APFS ISC.

On Thu, Apr 27, 2023 at 12:31:09PM +0100, Caspar Schutijser wrote:
> I was trying to install OpenBSD on the arm64 MacBook Air with
> softraid crypto (that's the "Encrypt the root disk?" question in the
> installer). Right now that does not work out of the box.
> 
> In a regular install, md_prep_fdisk is careful and leaves the EFI Sys
> partition alone with the "if disk_has $_disk gpt apfsisc" check.
> 
> However, in the "encrypt the root disk" case, the installer goes through
> md_prep_fdisk twice. The second time, it's called on the softraid crypto
> disk, which does not have the special EFI Sys partition. So there we
> don't hit the special "if disk_has $_disk gpt apfsisc" case. Instead,
> we go to a more regular case where we end up running "installboot -p".
> 
> Because it's a softraid disk, installboot also looks at the "chunks"
> that the softraid volume resides on. I.e., it also looks at sd0 and
> there "installboot -p" will newfs the EFI Sys partition, which is
> something we don't want on the Mac.
> 
> This diff addresses this problem. The first time we go through
> md_prep_fdisk, we keep track of whether we're in this special Mac
> case by setting KEEP_EFI_SYS. Then when we go through md_prep_fdisk
> for the second time to prepare the softraid disk, we can check this
> variable to see if we should avoid running "installboot -p".
> 
> Debugged with help from and came up with a fix with kn@, thanks!
> 
> Comments or OKs?
> 
> Caspar
> 
> ---
> 
> arm64 install.md: fix softraid crypto installation on Mac
> 
> Make sure we don't newfs the EFI Sys partition on systems that have an
> "apfsisc" partition in the case we're installing with softraid crypto.
> 
> Debugged with help from and came up with a fix with kn@
> 
> 
> Index: install.md
> ===================================================================
> RCS file: /cvs/src/distrib/arm64/ramdisk/install.md,v
> retrieving revision 1.46
> diff -u -p -r1.46 install.md
> --- install.md        27 Apr 2023 10:03:49 -0000      1.46
> +++ install.md        27 Apr 2023 11:26:56 -0000
> @@ -36,6 +36,7 @@ MDBOOTSR=y
>  NCPU=$(sysctl -n hw.ncpufound)
>  COMPATIBLE=$(sysctl -n machdep.compatible)
>  MOUNT_ARGS_msdos="-o-l"
> +KEEP_EFI_SYS=false
>  
>  md_installboot() {
>       local _disk=$1 _chunks _bootdisk _mdec _plat
> @@ -109,6 +110,11 @@ md_prep_fdisk() {
>               [wW]*)
>                       echo -n "Creating a ${bootfstype} partition and an 
> OpenBSD partition for rest of $_disk..."
>                       if disk_has $_disk gpt apfsisc; then
> +                             # On Apple hardware, the existing EFI Sys
> +                             # partition contains boot firmware and MUST NOT
> +                             # be recreated.
> +                             KEEP_EFI_SYS=true
> +
>                               # Is this a boot disk?
>                               if [[ $_disk == @($ROOTDISK|$CRYPTOCHUNK) ]]; 
> then
>                                       fdisk -Ay -b "${bootsectorsize}" 
> ${_disk} >/dev/null
> @@ -119,13 +125,20 @@ md_prep_fdisk() {
>                               # Is this a boot disk?
>                               if [[ $_disk == @($ROOTDISK|$CRYPTOCHUNK) ]]; 
> then
>                                       fdisk -gy -b "${bootsectorsize}" 
> ${_disk} >/dev/null
> -                                     installboot -p $_disk
> +
> +                                     # With root on softraid,
> +                                     # 'installboot -p' on the root disk
> +                                     # nukes EFI Sys on the chunks.
> +                                     $KEEP_EFI_SYS || installboot -p $_disk
>                               else
>                                       fdisk -gy ${_disk} >/dev/null
>                               fi
>                       else
>                               fdisk -iy -b 
> "${bootsectorsize}@${bootsectorstart}:${bootparttype}" ${_disk} >/dev/null
> -                             installboot -p $_disk
> +
> +                             # With root on softraid, 'installboot -p' on
> +                             # the root disk nukes EFI Sys on the chunks.
> +                             $KEEP_EFI_SYS || installboot -p $_disk
>                       fi
>                       echo "done."
>                       return ;;
> 

Reply via email to