grub2 如何在 EFI 引导中找到它的配置文件?

Uwe*_*der 10 grub2 uefi

网上有无数的 grub2/EFI 线程,但我发现很难找到上述问题的答案。我们被告知在 grub2 中的配置文件是 /boot/grub/grub.cfg。但是当出现引导问题时,grub2 可能会在没有任何错误消息的命令提示符(又名紧急 shell)中结束。因此,在能够解决任何问题之前,最好先了解 grub2 如何准确地尝试定位其配置文件。

Uwe*_*der 8

首先要明白,没有固定的方法。grub2 可以在安装过程中进行不同的配置,并且名称 grub.cfg 绝不是硬编码的。第二个学习是没有单一的配置文件,例如我在撰写本文时的 Ubuntu 系统按顺序使用 2 个不同的文件,它们实际上都命名为 grub.cfg。

默认情况下,grub2 在启动时会做 2 件重要的事情:

  1. 将前缀变量设置为 grub2 安装期间内置的值
  2. 继续配置文件 $prefix/grub.cfg 如果存在

(有关更多详细信息,请参阅http://www.gnu.org/software/grub/manual/grub.html#GRUB-only-offers-a-rescue-shell

“如果它存在”条件是令人讨厌的条件:如果文件不存在(例如,因为 $prefix 没有指向正确的位置)没有错误消息它试图做什么,你只是在命令提示符下结束.

如果您最终进入紧急 shell,首先要检查的是前缀变量的值(使用 set 命令)和该目录的内容(使用 ls 和 cat 命令)。

(默认行为可能会被内置配置文件覆盖,但我认为我没有看到在实践中使用过。)

Ubuntu 将前缀设置为用于安全启动的 grubx64.efi 和 shimx64.efi 所在的位置。所以第一个配置文件 grub.cfg 是从这些 EFI 二进制文件所在的同一目录加载的。从 Linux 的角度来看,路径是 /boot/efi/EFI/ubuntu,从 grub2 的角度来看 (hd0,gpt1)/efi/ubuntu(驱动器和分区号可能会有所不同,具体取决于您的 ESP 即 EFI 系统分区所在的位置,grub2 中的文件名似乎不区分大小写,所以 Linux 显示的 EFI 被 grub2 显示为 efi)。

第一个 grub.cfg 文件只包含 3 条语句:

  1. 通过 UUID 定位包含根文件系统的分区(在使用单独引导文件系统的系统中,改为定位引导文件系统)
  2. 将前缀设置为 $root/boot/grub 的新值(使用在上一步中确定的 $root 值,对于具有单独引导分区的系统,这应该是 $root/grub)
  3. 从 $prefix/grub.cfg 位置执行配置文件

后者是我们通常被告知的 Linux 位置 /boot/grub/grub.cfg。