The code for auto detect of root device on EFI is https://git.savannah.gnu.org/cgit/grub.git/tree/grub-core/kern/efi/init.c#n130 . It will have no problem detecting right device even if there are similar devices. The only case I know of, where it's unreliable is if partition module for partition in question is missing but the disk is always detected correctly unless firmware lies or we have a crazy bug.
Le dim. 15 sept. 2024, 14:07, adrian15sgd <adrian15...@gmail.com> a écrit : > I actually have an specific question for Grub developers / maintainers / > contributors so if you are one of them you can skip to: (2) . > > 1) INTRODUCTION > > 1.1) I am working on liveid ( https://github.com/rescatux/liveid ), this > is sort of an earmark for live cds. > I am currently trying to push some changes onto the live-build and > live-boot packages from Debian GNU/Linux distribution. > > I was quite convinced I knew how Grub booted from a Debian's ElTorito > image bundled into a Debian Live CD but as it turns out I was wrong. > > > 1.2) The current way this is implemented from a Debian point of view > (based on GRUB 2.06) can be described in two steps. > 1.2.1) The first step is creating a gcdx64.efi file that has an embedded > memdisk with a custom grub.cfg. > > So... the gcdx64.efi image is created thanks to a custom Debian script > named `build-efi-images` . > > A memdisk image is being created first: > ( > > https://salsa.debian.org/grub-team/grub/-/blob/c5fc69927aefefb713d43a3753a7e7062c20ffa9/debian/build-efi-images#L57-76 > ) > and then it's being used on the final gcdx64.efi file: > ( > > https://salsa.debian.org/grub-team/grub/-/blob/c5fc69927aefefb713d43a3753a7e7062c20ffa9/debian/build-efi-images#L217-227 > ) > . > > Please note that the embedded grub.cfg contents are: > ``` > if [ -z "\$prefix" -o ! -e "\$prefix" ]; then > if ! search --file --set=root /.disk/info; then > search --file --set=root /.disk/mini-info > fi > set prefix=(\$root)/boot/grub > fi > if [ -e \$prefix/$platform/grub.cfg ]; then > source \$prefix/$platform/grub.cfg > elif [ -e \$prefix/grub.cfg ]; then > source \$prefix/grub.cfg > else > source \$cmdpath/grub.cfg > fi > ``` > . > > So, as you can see it tries to find the kernel and initrd thanks to info > and mini-info files. > > 1.2.2) The second step is that the Debian live cd is going to have an > ElTorito image inside of it ( boot/grub/efi.img ) which it's essentially > a FAT partition. > You can find the specific code for that creation on: > > https://salsa.debian.org/live-team/live-build/-/blob/ccf1f49bb9d185b2bb426ae1d4e84f4c4e4547ff/scripts/build/binary_grub-efi#L287-296 > > Basically a FAT partition image is created reusing some SecureBoot > signed EFI images (if available, otherwise you would be using non-signed > EFI images). > In the end what the FAT partition image contents are is somewhat similar > to: > > ``` > EFI > EFI/boot > EFI/boot/bootx64.efi > EFI/boot/grubx64.efi > boot > boot/grub > boot/grub/grub.cfg > ``` > > The grubx64.efi file that you see above is actually a copy of the > gcdx64.efi file created above in (1.2.1). > > 1.3) How does Debian image boot thanks to this ElTorito image from an > UEFI CD boot? > > UEFI firmware reads whatever defines ElTorito image and finds the > contents of boot/grub/efi.img . > UEFI firmware only loads into memory EFI/boot/bootx64.efi on the > ElTorito image. > This is usually shim which will boot onto grub. > But let's suppose that this is grub itself for the sake of simplicity. > > When EFI/boot/grubx64.efi ( which it's actually a copy of gcdx64.efi ) > is loaded into RAM as it has an embedded memdisk, its prefix gets set to > the memdisk image and then the snippet mentioned above that searches for > `/.disk/info` and `/.disk/mini-info` files is run. > > Please note that whatever `boot/grub/grub.cfg` file was inside of the > ElTorito image gets **ignored**. > Also please note that we are not reading information about the CD unless > the CD has such files and it is found first in the Grub devices search. > In other words if you have a `/.disk/info` file in your internal hard > disk or another device this might get messed up. > > So, usually what happens is that the `/.disk/info` is found on the (cd0) > device and then everything boots correctly. > > 1.4) Building a barebones ElTorito image. > > So I have modified both Debian live-build's package and Debian grub > `build-efi-images` script. > > 1.4.1) From the point of view of ElTorito image you only get: > > ``` > EFI > EFI/boot > EFI/boot/bootx64.efi > ``` > > with the modified `gcdx64.efi` contents. > > 1.4.2) And what about `gcdx64.efi`, well, it's no longer created with a > embedded memdisk so it just boots and that's it. > > 1.4.3) My only test suggests that somehow Grub knows that its root is > `(cd0)` and prefix is changed onto the usual `(cd0)/boot/grub` . > > So that's very great because you can run the `/boot/grub/grub.cfg` file > in the cdrom. That's what we all wanted all of the way down. > > 2) If I build a grub image with cdrom modules without any embedded > memdisk and I use it inside of an ElTorito image and I boot from an UEFI > firmware CD... Grub knows how to autodetect itself from RAM and finds > (cd0). > > QUESTION: Can you please point me to the Grub source code where that > autodetection is coded? > > I want to make sure this autodetection won't fail detecting another > quite similar cd (cd0) instead of (cd1) if booted from (cd1). > > ElTorito image which it's usually found in `boot/grub/efi.img` would > have had: > > ``` > EFI > EFI/boot > EFI/boot/bootx64.efi > ``` > contents. > > That bootx64.efi is a grub image created thanks to this command ( Yes, > it's actually a copy of gcdx64.efi ): > ``` > "obj/grub-pc/grub-mkimage" -O "x86_64-efi" -o > "obj/monolithic/grub-efi-amd64/gcdx64.efi" -d > "obj/grub-efi-amd64/grub-core" -p /boot/grub --sbat > "/tmp/tmp.OGhv28NUZq/sbat.debian.csv" all_video boot btrfs cat chain > configfile echo efifwsetup efinet ext2 fat font f2fs gettext gfxmenu > gfxterm gfxterm_background gzio halt help hfsplus iso9660 jfs jpeg > keystatus loadenv loopback linux ls lsefi lsefimmap lsefisystab lssal > memdisk minicmd normal ntfs part_apple part_msdos part_gpt > password_pbkdf2 png probe reboot regexp search search_fs_uuid > search_fs_file search_label serial sleep smbios squash4 test true video > xfs zfs zfscrypt zfsinfo cpuid linuxefi play tpm > ``` > . > > 3) QUESTION: Do you know if Grub could autodetect its device if a > regular grubx64.efi image is being loaded from 'Boot from file' UEFI > option? > Or are we supposed to add an embedded memdisk with an embedded grub.cfg > that helps the image find the rest of it? (This is for a live cd finding > itself). > > Actually I think this is the reason why the current Debian > implementation is done in that embedded way. > If Grub manages to find itself consistently in a cd I'll send a pull > request to Debian project about using this rediscovered method of using > Grub for cds. > > adrian15 > > _______________________________________________ > Grub-devel mailing list > Grub-devel@gnu.org > https://lists.gnu.org/mailman/listinfo/grub-devel >
_______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel