UEFI booting survey

Mark Millard markmi at dsl-only.net
Wed Dec 20 04:06:48 UTC 2017


[The usdcard in my rpi2 example does not contain any kernel files,
nor any dtb files. Only the USB SSD stick does. The kernel and dtb
do not come from the usdcard. This is what I'm not sure if it is
generally supported or not.]

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

> On Dec 19, 2017 4:26 PM, "Mark Millard" <markmi at dsl-only.net> wrote:
> 
>> . . .
>> 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.)
>> 
>> It is read. It is literally only used to set the root for userland. That is all. Nothing else. 
>> 
>> /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") != NULL)
>>         return(0);
>> 
>> So if you set vfs.root.mountfrom in /boot/loader.conf, we don't read rootdev:/etc/fstab for the value to set vfs.root.mountfrom to.
>> 
>>     error = 1;
>>     sprintf(lbuf, "%s/etc/fstab", rootdev);
>>     if ((fd = 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.)
>> 
> So you load /boot/loader and the kernel from the sdcard.

No: There are no kernel files on the usdcard. See the complete
file list of its only UFS partition above. No dtb files either.

[On a rpi2 ubldr.bin is copied to the msdosfs, where it
is actually put to use.]

> /etc/fstab on the card points to the usb drive for /.

True. And that is were the kernel and dtb come from,
not the usdcard.

For reference loader.config has:

# more /mnt/boot/loader.conf
geom_label_load="YES"           # File system labels (see glabel(8))
#
kern.cam.boot_delay="10000"
vfs.mountroot.timeout="10"
dumpdev="/dev/da0p2"

(So no vfs.root.mountfrom .)

> This is all standard loader behavior.

I'm not sure avoiding the kernel and dtb being on the usdcard
is standard-supported behavior. It might be a lucky,
limited-context accident rather than a general property as a
technique.

> It won't change. In your case, you aren't even using UEFI, so it doubly won't change.

I also have access to an rpi3 and a pine64+ 2GB, which are
UEFI based. But I'd not yet tried a similar configuration
to what I'd recently done on the rpi2 V1.1 .

The list notices made me unsure if I should even try. It
is this part that I'm trying to figure out, both for now
and for after the changes.

> UEFI has more direct ways of doing this, but this setup would work there because it is explicit. It doesn't depend on the current boot1.efi behavior...

The lack of depending on the "random order" status may well
be true.

But I'm still not sure if the the lack of a kernel and dtb
file on the usdcard puts the technique out of bounds for
the rpi2 and pine64+ 2GB.

> Warner
>> 
>> >> (For my particular interest the context uses UFS, not
>> >> ZFS.)
>> >>
>> >> > 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.
>> >>
>> >
> 

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





More information about the freebsd-current mailing list