当我们安装新的Linux时,安装程序会在EFI分区安装引导加载程序(efi文件)并更新NVRAM的菜单项,并且很可能将新添加的引导加载程序设置为默认值。引导加载程序将读取 来/boot/grub/grub.cfg
加载内核和 initrd。
我的问题是,当 ESP 中有多个引导加载程序(.efi)时,它们是否相同?因为它们都是GRUB2。他们每个人都能发现系统中的所有内核吗?
由于每个操作系统的分区都有/boot/grub/grub.cfg
文件,那么默认引导加载程序正在读取哪一个分区?
答案1
我的问题是,当 ESP 中有多个引导加载程序(.efi)时,它们是否相同?因为它们都是grub2。他们都能发现系统中的所有内核吗?
如果磁盘上有多个 UEFI Linux 安装,它们通常使用相同的 EFI 系统分区 (ESP),但它们各自的 EFI 可执行文件位于 ESP 的不同子目录中,格式为EFI/bootloader-id
. EFI 可执行文件具有相同的名称;对于 64 位安装,它是grubx64.efi
.因此 EFI 变量将位于EFI/bootloader-id/grubx64.efi
这些可执行文件是通过grub-install
在各自的系统上运行来安装的,尽管您可能必须grub-install
使用 指向该分区--efi-directory
。并且您可能还必须选择bootloader-id
with的值--bootloader-id
。不同的 Linux 发行版有不同的默认值bootloader-id
。例如,Debian 默认为debian
.有关grub-install
选项的更多信息,请参阅man grub-install
。
grub-install
使用 UUID 将引导/根设备的名称硬连接到这些可执行文件中。
这些 EFI 可执行文件由主板上的 EFI 固件执行。由于 EFI 可执行文件知道其 Linux 安装的引导/根设备,并且根据定义,grub.cfg
具有相对于引导/根设备的固定位置,因此 EFI 可执行文件可以执行/boot/grub/grub.cfg
与该安装对应的操作。当然grub.cfg
还有启动所需的所有信息,包括系统上安装的内核的名称。
Arch Wiki GRUB 页面对这些问题有很好的报道。也可以看看Debian Wiki UEFI 页面。