On Tue, Sep 06, 2022 at 10:14:02AM +0200, Mark Kettenis wrote:
> > Date: Tue,  6 Sep 2022 01:16:47 +0000
> > From: Klemens Nanni <[email protected]>
> > 
> > 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?
> 
> Wouldn't it make more sense to export these as CTLTYPE_QUAD?  Or does
> that bring endian-ness issues that we'd rather avoid?

Not sure I understand.  You want to export u_char bootduid[8] as int64_t
and then... do what in user-space?

Am I missing something?

As read-only string, we can simply use the printf helper to get a value
that's immediately comparable against disklabel output, fstab entries,
etc.

> 
> > Index: kern/kern_sysctl.c
> > ===================================================================
> > RCS file: /mount/openbsd/cvs/src/sys/kern/kern_sysctl.c,v
> > retrieving revision 1.406
> > diff -u -p -r1.406 kern_sysctl.c
> > --- kern/kern_sysctl.c      16 Aug 2022 13:29:52 -0000      1.406
> > +++ kern/kern_sysctl.c      5 Sep 2022 09:51:38 -0000
> > @@ -762,6 +762,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);
> > Index: sys/sysctl.h
> > ===================================================================
> > RCS file: /mount/openbsd/cvs/src/sys/sys/sysctl.h,v
> > retrieving revision 1.229
> > diff -u -p -r1.229 sysctl.h
> > --- sys/sysctl.h    16 Aug 2022 13:29:53 -0000      1.229
> > +++ sys/sysctl.h    5 Sep 2022 09:53:13 -0000
> > @@ -931,7 +931,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 }, \
> > @@ -961,6 +963,8 @@ struct kinfo_file {
> >     { "smt", CTLTYPE_INT }, \
> >     { "ncpuonline", CTLTYPE_INT }, \
> >     { "power", CTLTYPE_INT }, \
> > +   { "bootduid", CTLTYPE_STRING }, \
> > +   { "rootduid", CTLTYPE_STRING }, \
> >  }
> >  
> >  /*
> > 
> > 
> 

Reply via email to