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

问题描述 投票:0回答:2

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

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

boot uefi grub grub2 guid-partition-table
2个回答
13
投票

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

  • 加载嵌入式配置文件。
  • 在与 GRUB 二进制文件相同的目录中加载配置文件。
  • 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
.


2
投票

对于 EFI 映像,我发现

grub-install
grub-mkimage
alwaysearly 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 文件,如您所见。

© www.soinside.com 2019 - 2024. All rights reserved.