> Date: Mon, 14 Nov 2022 09:22:13 +0000
> From: Klemens Nanni <[email protected]>
> 
> On Tue, Sep 06, 2022 at 01:16:47AM +0000, Klemens Nanni wrote:
> > The installer considers a disk a root disk if 'a' is FFS and contains
> > expected files.
> > 
> > Furthermore, unattended upgrades will always install to the first root
> > disk that is found.
> > 
> > This works fine on machines with only one root disk, but it quickly
> > behaves unexpectedly when having multiple disks/installations in one
> > machine.
> > 
> > I run such machines, esp. since fiddling with softraid and installboot.
> > 
> > 
> > The installer/sysupgrade experience can definitely be improved here, but
> > that takes some consideration.
> > 
> > One requirement, imho, is knowing
> > 1. which disk we booted from, i.e.
> >    from which disk the kernel (/bsd.rd or /bsd.upgrade) was loaded
> > 2. which disk the root filesystem is on, i.e.
> >    likely the same disk holding /home where sysupgrade put the sets
> > 
> > 
> > The boot disk could be helpful inside installer, e.g. to check if
> > /bsd.ugpraded was booted from a valid root disk -- a good indicator for
> > rebooting from the same disk the user just ran sysupgrade on.
> > 
> > The root disk is of no help inside the installer as that will always be
> > the ramdisk.  But it could be used by sysupgrade to perhaps prefill
> > /auto_upgrade.conf to decide up-front which disk to upgrade.
> > This answer to the 'Which disk is the root disk' question is currently
> > answered inside the installer during unattended upgrades... and it will
> > always be the first valid root disk, which is not always correct.
> > 
> > So to make progress, here's a diff that exports readily available
> > disklabel DUIDs:
> > 
> >     # disklabel sd0 | grep duid
> >     duid: 98c0c47c3ffddeb4
> >     # sysctl hw | grep duid
> >     hw.bootduid=98c0c47c3ffddeb4
> >     hw.rootduid=98c0c47c3ffddeb4
> > 
> > Having that, working out the installer/sysupgrade bits should be easier.
> > 
> > I'm testing this on arm64 with two disks/installations.
> > 
> > Feedback? Objection? OK?
> 
> I'd like to get on with this, can also add sysctl.2 bits to document
> those before sending diffs using them.
> 
> Mark asked whether CTLTYPE_QUAD would be more suited, but I still don't
> understand how that is supposed to work and there was no answer in this
> thread's other mail.

So my thinking there was that DUIDs are 64-bit integers.  But it seems
they are always interpreted as an array of 8 bytes.  That probably
means that presenting it as a 64-bit integer (which is what
CTLTYPE_QUAD does) isn't a good idea.

> Anyone?

It is somewhat unfortunate that we are exporting binary data as a
string since it means that userland code will have to parse that
string again and turn it into an array of bytes.  We could export it
as CTLTYPE_STRUCT but then we'd need additional code to make sysctl(8)
display the data.

so ok kettenis@

> Index: sys/sys/sysctl.h
> ===================================================================
> RCS file: /cvs/src/sys/sys/sysctl.h,v
> retrieving revision 1.231
> diff -u -p -r1.231 sysctl.h
> --- sys/sys/sysctl.h  7 Nov 2022 14:25:44 -0000       1.231
> +++ sys/sys/sysctl.h  9 Nov 2022 12:06:31 -0000
> @@ -946,7 +946,9 @@ struct kinfo_file {
>  #define      HW_SMT                  24      /* int: enable SMT/HT/CMT */
>  #define      HW_NCPUONLINE           25      /* int: number of cpus being 
> used */
>  #define      HW_POWER                26      /* int: machine has wall-power 
> */
> -#define      HW_MAXID                27      /* number of valid hw ids */
> +#define      HW_BOOTDUID             27      /* string: DUID of boot disk */
> +#define      HW_ROOTDUID             28      /* string: DUID of root disk */
> +#define      HW_MAXID                29      /* number of valid hw ids */
>  
>  #define      CTL_HW_NAMES { \
>       { 0, 0 }, \
> @@ -976,6 +978,8 @@ struct kinfo_file {
>       { "smt", CTLTYPE_INT }, \
>       { "ncpuonline", CTLTYPE_INT }, \
>       { "power", CTLTYPE_INT }, \
> +     { "bootduid", CTLTYPE_STRING }, \
> +     { "rootduid", CTLTYPE_STRING }, \
>  }
>  
>  /*
> Index: sys/kern/kern_sysctl.c
> ===================================================================
> RCS file: /cvs/src/sys/kern/kern_sysctl.c,v
> retrieving revision 1.408
> diff -u -p -r1.408 kern_sysctl.c
> --- sys/kern/kern_sysctl.c    7 Nov 2022 14:25:44 -0000       1.408
> +++ sys/kern/kern_sysctl.c    9 Nov 2022 12:06:30 -0000
> @@ -770,6 +770,12 @@ hw_sysctl(int *name, u_int namelen, void
>       case HW_SMT:
>               return (sysctl_hwsmt(oldp, oldlenp, newp, newlen));
>  #endif
> +     case HW_BOOTDUID:
> +             return (sysctl_rdstring(oldp, oldlenp, newp,
> +                 duid_format(bootduid)));
> +     case HW_ROOTDUID:
> +             return (sysctl_rdstring(oldp, oldlenp, newp,
> +                 duid_format(rootduid)));
>       default:
>               return sysctl_bounded_arr(hw_vars, nitems(hw_vars), name,
>                   namelen, oldp, oldlenp, newp, newlen);
> 
> 

Reply via email to