Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 19 Dec 2017 15:26:38 -0800
From:      Mark Millard <markmi@dsl-only.net>
To:        Warner Losh <imp@bsdimp.com>
Cc:        FreeBSD Current <freebsd-current@freebsd.org>
Subject:   Re: UEFI booting survey
Message-ID:  <F8D6B6DA-7B88-4238-8865-416F5D28F181@dsl-only.net>
In-Reply-To: <CANCZdfqFFZ-H1dYq0wV%2BGbfuxuXhfWWLVUEnmH2mZQJP7eoOig@mail.gmail.com>
References:  <60C20606-853E-43AE-9F90-44C65026A098@dsl-only.net> <CANCZdfo5=5vKZ2cY8k7K3L%2BbfEPQREr9yB=EsVPiMkAStCq_SA@mail.gmail.com> <DC81F8EE-FE36-4B4B-8A51-B9C0D7D6B727@dsl-only.net> <CANCZdfqFFZ-H1dYq0wV%2BGbfuxuXhfWWLVUEnmH2mZQJP7eoOig@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help

On 2017-Dec-19, at 1:49 PM, Warner Losh <imp at bsdimp.com> wrote:

>=20
>=20
> On Dec 19, 2017 10:58 AM, "Mark Millard" <markmi at dsl-only.net> =
wrote:
>> On 2017-Dec-18, at 2:37 PM, Warner Losh <imp at bsdimp.com> wrote:
>>=20
>> > . . .
>> >
>> > Or the following pseudo-code with all the weird special cases =
removed for clarity
>> >
>> > load loader.efi from ESP
>> > if BootXXXX uefi variable holds a second path, use that for =
root/kernel
>> > otherwise if an override variable holds a kernel/root path, use =
that
>> > otherwise scan for a usable ZFS pool, use that if it exists
>> > otherwise use the same partition loader.efi was booted from for =
root/kernel if it's usable
>> > otherwise use the first UFS partition on the ESP that's usable.
>> >
>> > A partition is usable if /boot/loader.rc exists on that path.
>>=20
>> What will be the role of /etc/fstab in establishing
>> were the kernel is loaded from? Where world is
>> loaded from? Where/how does use of /etc/fstab for
>> specifying the root file system mount fit in the
>> above pseudo-code?
>=20
> Same as today: it is what the boot loader passes to the kernel as the =
Unix name of /. I have no plans to change that. It's of almost no use to =
the boot loader, since it can't know what BIOS device da3 is, for =
example, if that's in fstab. Or even more complex examples like =
/dev/mirror/primary. Efibootmgr can take Unix devices and paths and turn =
them into UEFI paths so we know what devices to use for what. In the =
absence of those, or an equivalent fallback, we are quite limited in =
what we can do since we don't have the context needed to translate.
>=20
> Warner=20

Okay.

It sounds different then the results I get with ubldr.bin
on a rpi2 V1.1 . With the usdcard having a UFS / with
basically only:

/etc/fstab (redirecting to a USB SSD stick)
/boot/* (with /boot/kernel/ empty and /boot/dtb/ empty)

the result is that all 3 of the following come from the
USB SSD stick based on the "/" line from the /etc/fstab
from the usdcard:

/boot/kernel
/boot/dtb/bcm2836-rpi-2-b.dtb
/ (mounted root file system)

In other words: it appears that for ubldr.bin on
a rpi2 V1.1 /etc/fstab is read and used before
finding the kernel that is to be loaded. (It or
another /etc/fstab may be read again later.)

/usr/src/stand/common/boot.c does show an explicit
attempt to find a /etc/fstab:

# grep -r /etc/fstab /usr/src/stand/
. . .
/usr/src/stand/common/boot.c: * Try to find the /etc/fstab file on the =
filesystem (rootdev),
/usr/src/stand/common/boot.c:    sprintf(lbuf, "%s/etc/fstab", rootdev);
. . .

That is from getrootmount(char *rootdev):

int
getrootmount(char *rootdev)
{
    char        lbuf[128], *cp, *ep, *dev, *fstyp, *options;
    int         fd, error;

    if (getenv("vfs.root.mountfrom") !=3D NULL)
        return(0);
           =20
    error =3D 1;
    sprintf(lbuf, "%s/etc/fstab", rootdev);
    if ((fd =3D open(lbuf, O_RDONLY)) < 0)
        goto notfound;
. . .

Supporting detail for the example rpi2
boot context:

With /mnt being the / from the usdcard:

# find /mnt -print | more
/mnt
/mnt/.snap
/mnt/boot
/mnt/boot/defaults
/mnt/boot/defaults/loader.conf
/mnt/boot/dtb
/mnt/boot/firmware
/mnt/boot/kernel
/mnt/boot/modules
/mnt/boot/zfs
/mnt/boot/msdos
/mnt/boot/entropy
/mnt/boot/menu.rc.sample
/mnt/boot/ubldr
/mnt/boot/ubldr.bin
/mnt/boot/brand-fbsd.4th
/mnt/boot/logo-beastie.4th
/mnt/boot/logo-beastiebw.4th
/mnt/boot/logo-fbsdbw.4th
/mnt/boot/logo-orb.4th
/mnt/boot/logo-orbbw.4th
/mnt/boot/loader.conf
/mnt/boot/loader.efi
/mnt/boot/boot1.efi
/mnt/boot/boot1.efifat
/mnt/boot/beastie.4th
/mnt/boot/brand.4th
/mnt/boot/color.4th
/mnt/boot/check-password.4th
/mnt/boot/delay.4th
/mnt/boot/frames.4th
/mnt/boot/loader.4th
/mnt/boot/loader.help
/mnt/boot/menu.4th
/mnt/boot/menu-commands.4th
/mnt/boot/menusets.4th
/mnt/boot/screen.4th
/mnt/boot/shortcuts.4th
/mnt/boot/support.4th
/mnt/boot/version.4th
/mnt/boot/loader.rc
/mnt/boot/efi.4th
/mnt/boot/pcibios.4th
/mnt/boot/menu.rc
/mnt/etc
/mnt/etc/fstab
/mnt/COPYRIGHT
/mnt/lost+found

# more /mnt/etc/fstab
/dev/da0p1      /               ufs     rw,noatime      1 1
/dev/da0p2      none            swap    sw              0 0

May be this is somehow special to the rpi2 or to
ubldr.bin operation. (I've never managed to identify
accidents from deliberately working status in this
area.)


>> (For my particular interest the context uses UFS, not
>> ZFS.)
>>=20
>> > What is being deleted is one final step: "otherwise use the first =
UFS partition on any drive in a random order that's usable." which used =
to be at the end of the boot1.efi psuedo code. It's my belief that no =
such installations actually use this due to the random factor today =
(plug in a new USB drive and it might take over). If my belief is wrong, =
it's my belief that efibootmgr will solve it, and failing that, the =
fallback mechanism (for platforms that use u-boot + EFI where UEFI =
variables don't work) will allow the two or three people that are doing =
this today.
>>=20
>=20

=3D=3D=3D
Mark Millard
markmi at dsl-only.net




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?F8D6B6DA-7B88-4238-8865-416F5D28F181>