7

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

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

4

2 回答 2

10

实际上有几种方法可以发生这种情况:

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

于 2016-02-08T13:53:11.293 回答
1

对于 EFI 图像,我发现grub-installorgrub-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
  • 表示文件系统的uuiduuid,不是分区的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 二进制文件的目录,因此它会回退到 efi 二进制文件的同一目录中的 grub.cfg,如您所见。

于 2019-06-06T09:51:02.030 回答