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

17
如果我在启用GPT的分区上使用GRUB 2,加载程序如何“知道”在哪里找到其配置文件和其他第二阶段的文件?
备注:我发现一些提到一个配置文件的文章,该文件位于与GRUB的EFI loader相同的文件夹中,并包含了从指定分区的“主”配置文件的链接,但这绝对不是真实的;只有一个“something.efi”文件。
2个回答

15

这可以通过以下几种方式实现:

  • 加载嵌入式配置文件。
  • 从与 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

所以他们为每个安装制作了一个独特的加载器可执行文件(补丁)。但在这种情况下,他们如何签名以进行安全启动? - Sap
它们只能使用GPT分区索引,而不能使用UID。但是对于GPT,这些索引并不是恒定的。GPT有用于此类目的分区UID。 - Sap
所有支持UEFI安全启动的Linux发行版都附带了一个名为“shim”的实用程序,它本身使用UEFI持有的密钥进行签名,并管理本地密钥库。https://github.com/mjg59/shim关于GPT索引没有什么评论,只是我猜想,由于预期的工作流程是如果更改分区,则重新运行grub-install,因此仍将得到解决。无论分区方案如何,它的工作方式都是相同的。 - unixsmurf
安全启动签名的UEFI GRUB 二进制文件通常会将其前缀设置为/efi/<发行版名称>,使用磁盘和分区的运行时默认值 - 而这些默认值是“grubx64.efi加载所在的任意磁盘和分区”。 - telcoM

3
对于EFI镜像,我发现无论您是否指定了--config FILE选项,grub-installgrub-mkimage都会将一个早期配置嵌入到生成的EFI二进制文件中。始终如此。 如果您没有指定--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 文件,正如你所发现的那样。


你从哪里得到这个的?我怎么检查这个早期配置文件? - alecov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接