Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 12 May 2009 19:15:55 +0200
From:      Paul Schenkeveld <fb-embedded@psconsult.nl>
To:        freebsd-embedded@freebsd.org
Subject:   Re: nanobsd boot slice selection does not work
Message-ID:  <20090512171555.GA4985@psconsult.nl>
In-Reply-To: <200905121008.19196.jhb@freebsd.org>
References:  <200904201535.21191.nick@van-laarhoven.org> <200905110940.31187.jhb@freebsd.org> <20090512075254.GA88230@psconsult.nl> <200905121008.19196.jhb@freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Tue, May 12, 2009 at 10:08:18AM -0400, John Baldwin wrote:
> On Tuesday 12 May 2009 3:52:54 am Paul Schenkeveld wrote:
> > On Mon, May 11, 2009 at 09:40:31AM -0400, John Baldwin wrote:
> > > On Tuesday 05 May 2009 10:49:38 am Paul Schenkeveld wrote:
> > > > On Mon, Apr 20, 2009 at 03:55:23PM +0200, Matthias Teege wrote:
> > > > > Moin,
> > > > > 
> > > > > > I've seen this problem as well, but can't for the life of me 
> remember 
> > > what I 
> > > > > 
> > > > > I'm relieved to hear that.
> > > > 
> > > > Ok, a bit late (interrupt storm generated by device $WORK) but I just
> > > > tested with a clean 7.2-RELEASE source tree.  I too can report this
> > > > regression in boot0 which now looks at the active flag in a MBR table
> > > > entry instead of its own default partition byte when not choosing the
> > > > partition by pressing 1 or 2 at the prompt.  This is a regression.
> > > > 
> > > > The boot0 source code appears to have had a complete overhaul between
> > > > 7.1 and 7.2.
> > > > 
> > > > As a workaround, use the 7.1 boot0 source (or even use 7.1 completely
> > > > if you care about the anticipated eol of the release).
> > > > 
> > > > I hope Luigi will have some time to look at the default drive delection
> > > > algorithm again zome time soon.
> > > 
> > > I think you can simply re-enable the 'update' flag using boot0cfg in 7.2 
> to 
> > > fix this?
> > 
> > The update flag is on, besides it controls whether the first sector is
> > written back or not after selecting another slice than the default using
> > the keyboard.  The problem above shows that the 'default' slice variable
> > in sector 0 is not read anymore but the MBR records are searched for
> > an active flag.  Using the (M$DOS-compatible) active flag only slices
> > 1-4 can be set as default, the boot0 default variable also allows for
> > selection 5 (next disk) and probably also 6 (pxe boot) to be saved as
> > default.
> 
> Err, so one of the things you need to keep in mind, is that boot1 re-reads the 
> MBR and uses the "active" flag to determine where to load boot2 from (and 
> where boot2 loads /boot/loader from and /boot/loader loads the kernel 
> and /etc/fstab from).  boot1 prefers an active slice to a non-active slice, 
> so if boot0 doesn't write back an updated MBR with the active slice changed, 
> then even if you load the boot1 from slice 2, it will still boot slice 1 if 
> the active flag is set on slice 1.  Note that this is not in boot0, but in 
> boot1.  However, having 'update' enabled should fix this.

But on a FB7.1 (and 7.0, 6.[43210]  and some 5.x and 4.x releases too)
it used to work like this (just tried on a live 7.1p5 system):

  # boot0cfg -v ad0
  #   flag     start chs   type       end chs       offset         size
  1   0x80      0:  1: 1   0xa5    333: 14:48           48       240432
  2   0x00    334:  1: 1   0xa5    667: 14:48       240528       240432
  3   0x00    668:  0: 1   0xa5    670: 14:48       480960         2160
  4   0x00    671:  0: 1   0xa5    693: 14:48       483120        16560

  version=1.0  drive=0x80  mask=0x3  ticks=182
  options=packet,update,nosetdrv
  default_selection=F1 (Slice 1)
  # boot0cfg -v -s 2 ad0
  #   flag     start chs   type       end chs       offset         size
  1   0x80      0:  1: 1   0xa5    333: 14:48           48       240432
  2   0x00    334:  1: 1   0xa5    667: 14:48       240528       240432
  3   0x00    668:  0: 1   0xa5    670: 14:48       480960         2160
  4   0x00    671:  0: 1   0xa5    693: 14:48       483120        16560

  version=1.0  drive=0x80  mask=0x3  ticks=182
  options=packet,update,nosetdrv
  default_selection=F2 (Slice 2)
  # reboot

Note that default_selection has changed, but slice 1 is still marked
active in the MBR.

After rebooting, the kernel in /dev/ad0s2a is loaded (verified by
uname -a, both slices have a kernel with a different timestamp) and:

  # boot0cfg -v ad0
  #   flag     start chs   type       end chs       offset         size
  1   0x00      0:  1: 1   0xa5    333: 14:48           48       240432
  2   0x80    334:  1: 1   0xa5    667: 14:48       240528       240432
  3   0x00    668:  0: 1   0xa5    670: 14:48       480960         2160
  4   0x00    671:  0: 1   0xa5    693: 14:48       483120        16560

  version=1.0  drive=0x80  mask=0x3  ticks=182
  options=packet,update,nosetdrv
  default_selection=F2 (Slice 2)
  #

The active marker has moved from slice 1 to slice 2, most likely this
was done by boot0 but I cannot verify this easily.

Trying the same on FB7.2 will show that default_selection has changed
and slice 1 still marked active in the MBR after 'boot0cfg -v -s 2 ad0'
just like on FB7.1 but during the reboot the kernel from slice 1 gets
loaded and ad0s1a becomes the root partition.

I just cannot but conclude that this is a regression from 7.1 and before.
Unfortunately my x86 assembly knowledge is not enough to completely
understaand boot0.S (I tried to compare the 7.1 and 7.2 source but had
to give up) but boot0.S appears to have changed quite a lot in 7.2 so
I'll keep pointing my finger at the boot0.S changes until proven wrong.

> -- 
> John Baldwin

Paul Schenkeveld



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