我已经很久没有读过关于 UEFI 的文章了,忘记了一些部分是如何连接的。我忘记了 UEFI 和 Grub 引导加载程序是如何协同工作的。我会讲出我记得的内容,如果我错了,请纠正我:
- UEFI 独立于操作系统,无论磁盘数量有多少,都通过单个 ESP 分区来工作。
- ESP 分区是新操作系统通过在其自己的文件夹中添加引导加载程序和分区引用来“订阅”UEFI 进程的地方。基本上,每个安装的操作系统在 /boot/efi 中都有一个文件夹。
- 引导加载程序以序列形式存储在 NVRAM 中。
现在我使用的机器安装了 Ubuntu、Windows 和 Arch。每个操作系统都有自己的引导加载程序,但每当我的机器显示“引导条目”时,我实际上都在查看 Ubuntu 的 Grub 配置。这就像我使用 Ubuntu 的 grub 来加载机器中的任何操作系统一样。
所以问题是:UEFI 如何知道 Ubuntu 是我的“主”引导加载程序。为什么每次启动我的机器时都没有显示 Windows 或 Arch 引导加载程序?
答案1
UEFI 是系统固件,而 GRUB 是为了符合固件而构建的引导加载程序。
带有 BIOS 的 GRUB 采用 MBR 内和第一个分区之前的引导代码形式。使用 UEFI,GRUB 可以采用grubx64.efi
ESP 分区内单个文件的形式。GRUB 架构标识符适用于 BIOSi386-pc
和 64 位 x86 硬件上的 UEFI x86_64-efi
。
UEFI 一无所知 - 它通常只会为找到的引导加载程序显示一个菜单。如果它只找到一个引导加载程序,它就不会显示菜单,然后会不问任何问题就启动该引导加载程序。
在您的情况下,Grub 显然是唯一存在的引导加载程序,因此它会在启动时立即执行。
EFI 固件选择 Grub 进行启动有两种方法:
UEFI 启动变量存储在系统 NVRAM 中。在 Linux 中,您可以使用 编辑它们
efibootmgr
;在 Windows 中,bcdedit /enum FIRMWARE
您可以列出它们,然后编辑它们。当未定义 UEFI 引导变量时,UEFI 固件会在 ESP 分区内查找引导加载程序。对于您的情况,它可能会查找
\EFI\boot\bootx64.efi
64 位硬件。