Re: Using loader to switch kernel and root device on Pi2
Date: Mon, 31 Mar 2025 07:04:03 UTC
On Mar 30, 2025, at 22:55, Mark Millard <marklmi@yahoo.com> wrote: > [This is just a resend with the subject line fixed. > How/when I had turned into just "UORE", I do not > know.] > > On Mar 30, 2025, at 21:17, bob prohaska <fbsd@www.zefox.net> wrote: > > Note: My initial wording is based on not doing > any hacking to form a work around. Later I have > notes based on hacking a work around based on > your providing more description of your overall > issue. > >> On Sun, Mar 30, 2025 at 06:49:48PM -0700, Mark Millard wrote: >>> On Mar 30, 2025, at 16:40, bob prohaska <fbsd@www.zefox.net> wrote: >>> >>>> An old Raspberry Pi2 v1.1 (so, armv7) has quit booting from USB when >>>> using the "bootcode.bin" method (that file only on the MSDOS partition, >>>> the usual layout on the USB disk). The machine gets stuck in a netboot >>>> loop. >>>> >>>> However, it appears possible to boot using the microSD card, then load >>>> the kernel and mount the root filesystem from USB at the loader prompt: >>>> >>>> Hit [Enter] to boot immediately, or any other key for command prompt. >>>> Booting [/boot/kernel/kernel] in 10 seconds... >>>> >>>> Type '?' for a list of commands, 'help' for more detailed help. >>>> OK lsdev >>>> disk devices: >>> >>> The below disks look like they might be 2 >>> separate media, each separately being >>> bootable. >>> >>>> disk0: 1953525168 X 512 blocks >>>> disk0s1: DOS/Windows >>> >>> Does this have a bootcode.bin and other >>> RPi* firmware related files? U-Boot? >>> >>> The above being a EFI msdsofs, likely with >>> its own EFI/BOOT/*.efi file. >>> >>>> disk0s2: FreeBSD >>>> disk0s2a: FreeBSD UFS >>> >>> The above being a UFS-based / file system, >>> likely with its own /boot/ . >>> >>>> disk0s2b: FreeBSD swap >>>> disk0s2d: FreeBSD UFS >>> >>> It is unclear if the above also has a /boot/ >>> as well. >>> >>>> disk1: 125042688 X 512 blocks (removable) >>>> disk1s1: DOS/Windows >>> >>> Does this also have a bootcode.bin ? If yes, >>> the same vintage as above? What about other >>> RPi* firmware related files? U-Boot? >>> >>> The above also being another EFI msdsofs, >>> likely with its own EFI/BOOT/*.efi file? >>> >>>> disk1s2: FreeBSD >>>> disk1s2a: FreeBSD UFS >>> >>> The above being another UFS-based / file >>> system, likely with its own /boot/ ? >>> >>> >>> It that the case? The below is only for for the >>> context: "yes" to there being multiple variants >>> of various directories and files used in booting, >>> which might not be the actual type of context. >>> >> >> Both disks are complete FreeBSD installations. >> Disk0 is a USB mechanical hard disk. Disk1 is >> a microSD card with a FreeBSD image downloaded >> from snapshots. > > Ahh, that USB vs. microsd card context is > important to interpreting things for your > problem. (Later notes by you make it even > more so.) > >> Files from that image populated >> the usb disk initially, before updating via source. > > Ahh. The RPi2 v1.1 has a means of controlling > microsd vs. USB being first. But USB here is a > bus, not a specific device (unless there is only > one USB storage media present on the USB bus). > > The way I read the following, bootcode.bin (and > possibly timeout) are the only RPi* firmware files > that should be on the microsd card (in standard > places) in order to then do a RPI* firmware > based USB host boot: > > QUOTE > Format an SD card as FAT32 and copy over the latest bootcode.bin. > The SD card must be present in the Raspberry Pi for it to boot. > Once bootcode.bin is loaded from the SD card, the Raspberry Pi > continues booting using USB host mode. > > This is useful for the Raspberry Pi 1, 2, and Zero models, which > are based on the BCM2835 and BCM2836 chips, and in situations > where a Raspberry Pi 3 fails to boot (the latest bootcode.bin > includes additional bugfixes for the Raspberry Pi 3B, compared > to the boot code burned into the BCM2837A0). > If you have a problem with a mass storage device still not > working, even with this bootcode.bin, then add a new file called > "timeout" to the SD card. This will extend to six seconds the > time for which it waits for the mass storage device to initialise. > END QUOTE > > If you have more of the RPi* firmware files on the > microsd card, it may try to boot from the microsd > card instead. > > NOTE added later: > Later notes are tied to having the FreeBSD > world loaded from USB by a FreeBSD kernel not > boot-time loaded from USB but from the microsd > card. Note that such is not an example of the > RPi* firmware booting from USB at all. Until > later my notes are generally based on presuming > a RPI* firmware based USB boot. > >> The numbering seems backwards to me, I'd expect >> disk0 to be microSD and usb to be disk1, but no. > > I expect that the disk0 vs. disk1 part of the > naming is from U-Boot's naming assignments. > >>> If yes, then how do you expect the RPi2 to >>> pick which EFI msdosfs it uses each time? (That >>> is just one type of example "pick" operation.) >>> Does it need to be more stable than random for >>> which it picks? >>> >> >> In practice, the Raspberry Pi boots from the microSD >> card, even if a second bootable device is present. > > For an RPi firmware based USB boot, things are > different than hacking in a non-RPI* firmware > based USB boot that does a partial USB based > boot in a later stage. > > >>> Once it picks, how do you expect the loader to >>> pick which UFS-based /boot/ it should use? Does it >>> need to be more stable than random? >>> >> >> I pick which ufs is used, via the >> OK set currdev="disk0s2a" >> OK set vfs.root.mountfrom="ufs:/dev/da0s2a" > > That is only via a manual intervention, not the > automatic boot handling. > >>> Note that which /boot/loader.conf file would be >>> used depends on which /boot/ is used if there are >>> multiple /boot/ directories present. >> >> Disk 1 (microSD) is active at the time of booting, >> so its /boot/loader.conf will contain the modifications. > > I'll have more realted notes later. > >>> As I understand things, whichever EFT/BOOT/*.efi >>> is used, a /boot/ from the same media (not the >>> same partition or file system) is used. If there >>> is more than one such /boot/ on that media >>> (via distinct file systems on the media), then >>> the question of which /boot/ is picked is >>> repeated. >>> >>> Can you make the disk1s1 such that is not a valid >>> RPi2* firmware source and not a valid EFI msdosfs? >>> An example could be renaming the EFI/BOOT/*.efi >>> file to be a name that is not one that would be >>> found as a standard .efi file name to be used --so >>> that it would be ignored. >> >> No, because that is the firmware and loader that the >> Pi is able to start. It won't even try to boot usb. > > The only 2 files that are needed on the microsd card > for an RPi* firmware based USB boot are: bootcode.bin > and, possibly, timeout . > > It is the bootcode.bin file that enables the RPi* > fimrware based USB boot. No other files contribute > (other than timeout leading to a longer delay). > > However, you later provide notes indicating that > you need the USB activity to be in a later stage > than the RPi* firmware doing the USB activity. > >>>> http: (unknown) >>>> net devices: >>>> net0: >>>> OK unload >>>> OK show currdev >>>> disk1s2a: >>>> OK set currdev="disk0s2a" >>>> OK show currdev >>>> disk0s2a >>>> OK load kernel >>>> /boot/kernel/kernel text=0x1b4 text=0x6df178 text=0x1f9cb8 data=0xc37a8 data=0x0+0x254000 0x4+0xb1af0+0x4+0x134365| >>>> OK set vfs.root.mountfrom="ufs:/dev/da0s2a" >>> >>> You did not first show the value of >>> vfs.root.mountfrom from before you >>> changed it. Which /boot/ would it >>> have found if you had not changed >>> the value? >> >> By default the Pi boots from the microSD, disk1 in >> this context. Presumably that means the value of >> vfs.root.mountfrom would have been /dev/mmcsd0s2a >> or some equivalent label pointing to the same device. > > A probably hypothesis, given disk1 being the > microsd card that has a lot of files that it > should not have on it for USB booting: just > bootcode.bin and, possibly, timeout relative > to RPi* firmware (in places were it such > would be found). > >>>> OK boot -s >>>> Using DTB provided by EFI at 0x39f23000. >>>> Kernel entry at 0x33e00200... >>>> Kernel args: -s >>>> ..... >>>> >>>> The machine comes up with kernel and root from the USB disk, as desired. >>>> >>>> It appears that the >>>> currdev="disk0s2a" >>>> and >>>> vfs.root.mountfrom="ufs:/dev/da0s2a" >>>> >>>> could be placed in /boot/loader.conf, >>>> but where would the unload and load >>>> commands go? >>> >>> Is there more than one /boot/ and, so, more >>> than one /boot/loader.conf that might be >>> used from one boot attempt to the next? If >>> yes, how do you know which /boot/loader.conf >>> to edit? >>> >>> Getting which EFI/BOOT/*.efi and /boot/ >>> picking to be stable and as-desired is >>> something to have in place before worrying >>> about the content of any specific >>> /boot/loader.conf or other such file. >>> (Presumes you do not make all the various >>> examples [if multiple] be duplicates of >>> each other for all the files would end up >>> involved.) >>> >>>> Without them the machine >>>> is stuck with the microSD's kernel. >>> >>> You should only have one RPI* firmware >>> soruce and only one EFI/BOOT/*.efi (that >>> has the right filenaming convention) and >>> only one /boot/ in normal usage contexts. >>> Having only one /boot/ means having only >>> one /boot/kernel/kernel as well. There >>> should not be alternatives that might >>> instead be found and used. >>> >> That harks back to having bootcode.bin alone on >> the microSD dos partition, which then finds and >> boots the usb disk. That's how the system started >> out and worked through several cycles of self-hosting. >> After an upgrade bootcode.bin couldn't find the usb >> disk and got stuck in a netboot loop from which it >> couldn't be extricated. A fresh install behaved the >> same way; worked fine through a few builworld/kernel >> cycles, then started trying only to netboot. > > I think the above context was missing in the earlier > information (above and the prior Email). > > This a different problem: hacking a workaround > so that a later, non-RPi* firmware stage, does > a partial USB based boot after some stages of > microsd card based boot activity. > >> The usual suspects (power supplies, bad cables, bad >> usb-sata bridges and faulty microSD cards) were ruled >> out by experiment. > > Did your testing include testing with the timeout > file being present? > >> A correspondent on comp.sys.raspberry-pi suggested >> that maybe the FreeBSD loader installed on the >> microSD could be coaxed into booting the usb disk, >> since booting the microSD works reliably. That seems >> to be true, at least for now. > > I've used USB hardware that the FreeBSD kernel > could handle but the prior U-Boot stage could > not. (It was not an RPi* context.) Such things > lead to hacks to make things limp along. > > In that case I duplicated /boot/ (and a few more > files) onto the microsd card in a UFS file > system and had the RPi* firmware, U-Boot, and > EFI/BOOT/*.efi in the microsd card's msdosfs. > (I did not want later modules to be loaded from > the microsd card but from the USB media.) One > of the duplicated files had the vfs.root.mountfrom > to use to find the USB media. > > I did not duplicate the rest of the world: that > was only on the USB media. > > Every update needed to make sure that things > were duplicated accurately. Some files had to > be handled specially. > >> currdev="disk0s2a" >> and >> vfs.root.mountfrom="ufs:/dev/da0s2a" >> both look like easy additions to /boot/loader.conf >> on the microSD card. >> >> The question that's gone unanswered is where to put >> the "unload" command to clear out the kernel picked >> up during loader startup so that it will be replaced >> by the new kernel from the usb disk. > > What I did had no unload or reload required: I used > the duplication of content in to 2 places to avoid > such activity being needed. The initial load of > the kernel was exactly the right content and compatible > with any later kernel module loads done from the USB > media. > >> It's evident my question is somewhat out of left field. >> All I really meant to ask was how to configure an >> unload command via loader.conf. The man page does not >> mention "unload", must it go elsewhere? > > I suggest avoiding the need to unload and reload > by setting up to have the initial load have the > correct content in the first place. The tradeoff > is needing to keep the duplicated information > on the microsd card up to date at every update. > > Note: Eventually U-Boot updated to handled the > USB context that it originally did not and I was > able to stop using the hackish technique. > > So it has been a while since I've last dealt with > this sort of thing. I no longer have media organized for the kernel-stage USB world part of the boot for the Rock64. Nor do I seem to have a copy of the old instructions/reminders file that I used while updating. Some of the below words things as-if the Rock64 context was more like the RPi* context than it actually was. Some old notes indicate: Having a UFS file system in a partition/slice on the microsd card in order for it to contain: ) A recursive copy of /boot/ ) But I avoided keeping a copy of /boot/entropy on the microsd card as I remember. This could be a security issue. ) A copy of /etc/hostid (as that path is accessed very early, much like /boot/loader.conf is accessed very early, before the normal root file system mount). I used rsync with a delete option and an exclude option to deal with the recursive copies as I remember. The /boot/loader.conf had a: vfs.root.mountfrom="ufs:/dev/gpt/Rock64root" One of the considerations was if the tree at /usr/lib/debug/boot/ should also be copied to the microsd card's UFS partition in order to have better problem analysis context for kernel boot failures. I can not claim to know if the above notes are complete vs. not. === Mark Millard marklmi at yahoo.com