如果我在启用 GPT 的分区上使用 GRUB 2,加载程序如何“知道”在哪里可以找到它的配置文件和其他第二阶段的文件?
注意:我发现一些关于配置文件的提及,该配置文件位于与 GRUB 的 EFI 加载程序相同的文件夹中,并且包含来自指定分区的“主要”配置文件的链式加载,但这绝对不是真的;只有一个“something.efi”文件。
实际上有几种方法可以发生这种情况:
grub-mkimage
(由 grub-install
调用)执行时间确定的路径加载配置文件。后者可能是你真正需要的功能,它是默认配置文件名(
grub.cfg
),prefix(默认/boot/grub
,但可以显式指定为grub-mkimage
)的组合以及前缀所在分区的 GRUB 分区名称。
如果我在我当前的工作站上运行
strings /boot/efi/EFI/debian/grubx64.efi | tail -1
,它会打印出存储的值:(,gpt2)/boot/grub
,告诉 grubx64.efi
在 GPT 分区 2 上的 /boot/grub 中查找其配置文件。逗号之前的位( GRUB 磁盘设备名称)在运行时根据 grubx64.efi
图像本身从哪个磁盘加载。
动态加载的模块也将在此位置下搜索,但在特定于体系结构/平台的目录中 - 在这种情况下
/boot/grub/x86_64-efi
.
对于 EFI 映像,我发现
grub-install
或 grub-mkimage
将 always 将 early configuration 嵌入到生成的 EFI 二进制文件中,无论您是否指定了 --config FILE
选项。
如果您不指定
--config FILE
选项,它将尝试嵌入/boot/grub/x86-64_efi/load.cfg
.
这个早期的配置文件是这样的:
search.fs_uuid 8ef704aa-041d-443c-8ce6-71ac7e7f30da root hd0,gpt1
set prefix=($root)'/boot/grub'
configfile $prefix/grub.cfg # This line seems can be omitted, because
# it seems to be the default next action
uuid
表示文件系统的 UUID,而不是分区的 UUID。你可以使用 blkid 列出它。hd0,gpt1
只是一个提示。set root=hd0,gpt1
自动嵌入的默认行为与 BIOS 模式不同。后者默认只嵌入像
(,gpt3)/boot
这样的前缀字符串,而不用担心 search.uuid.
我还发现 Ubuntu 18.04(Bionic Beaver)EFI 映像嵌入了早期配置,如 build-efi-images
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
cmdpath
是 EFI 二进制文件的目录,因此它将回退到 EFI 二进制文件同一目录中的 grub.cfg 文件,如您所见。