GRUB2 UEFI 加载程序如何知道在哪里查找配置文件(或第二阶段的文件所在的位置)?

Posted

技术标签:

【中文标题】GRUB2 UEFI 加载程序如何知道在哪里查找配置文件(或第二阶段的文件所在的位置)?【英文标题】:How does the GRUB2 UEFI loader know where to look for the configuration file (or where the 2nd stage's files are located)? 【发布时间】:2016-05-18 03:11:57 【问题描述】:

如果我在启用 GPT 的分区上使用 GRUB2,加载程序如何“知道”在哪里可以找到其配置文件和其他第二阶段的文件?

注意:我发现一些关于与 GRUB 的 EFI 加载器位于同一文件夹中的配置文件的提及,并且包含来自指定分区的“主”配置文件的链式加载,但这绝对不是真的 - 只有一个“something.efi”文件。

【问题讨论】:

【参考方案1】:

这有几种实际发生的方式:

加载嵌入式配置文件。 在与 GRUB 二进制文件相同的目录中加载配置文件。 从在grub-mkimage(由grub-install 调用)执行时间决定的路径加载配置文件。

后者可能是您真正需要的功能 - 它是默认配置文件名 (grub.cfg)、前缀(默认为 /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

【讨论】:

因此他们为每次安装制作(补丁)一个现在唯一的加载程序可执行文件。但在这种情况下,他们如何签署安全启动协议? 而且他们也只能使用 GPT 分区索引,不能使用 UID。但是 GPT 的索引不是恒定的。 GPT 具有用于此类目的的分区 UID。 所有支持 UEFI 安全启动的 Linux 发行版都附带一个名为“shim”的实用程序,该实用程序本身使用 UEFI 持有的密钥进行签名,进而管理本地密钥库。 github.com/mjg59/shim GPT 索引真的没有评论,除​​了我猜之外,因为预期的工作流程是如果您更改分区重新运行 grub-install,这仍然会得到解决。无论分区方案如何,它的工作原理都是一样的。 安全引导签名的 UEFI GRUB 二进制文件通常会将其前缀设置为 /efi/<name of distribution>,使用磁盘和分区的运行时默认值 - 这些默认值是“无论磁盘和分区grubx64.efi 是从"加载的。【参考方案2】:

对于 EFI 图像,我发现 grub-installgrub-mkimage总是early config 嵌入结果 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 仿生 EFI 映像嵌入了这样的早期配置 https://source.puri.sm/pureos/core/grub2/blob/master/debian/build-efi-images#L64

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 二进制文件的 DIR,因此它会回退到与 efi 二进制文件相同的目录中的 grub.cfg,如您所见。

【讨论】:

以上是关于GRUB2 UEFI 加载程序如何知道在哪里查找配置文件(或第二阶段的文件所在的位置)?的主要内容,如果未能解决你的问题,请参考以下文章

编译UEFI版本Grub2引导多系统文件efi

GRUB2 制作 BIOS/UEFI 双模式启动的 Linux/Windows 安装U盘

教程在UEFI启动方式下,通过GRUB2引导,直接从硬盘ISO文件安装Windows10和Ubuntu双系统

如何创建 UEFI 只读变量?

UEFI 是如何工作的?

在 Grub 2.02 源代码中查找倒数计时器