我注意到所有 grub 资源(字体、图像等)都位于 中/boot/grub
,该分区通常存在于 Linux 文件系统分区中。当然还有另一个分区,它安装在 上/boot/efi
。我相信 gpt 会查找挂载并使用安装在 (Efi 系统分区) 上的分区,/boot/efi
因为它包含实际启动系统的 .efi 文件。
我的问题是:如果 gpt 指向 efi 分区,并且 grub 启动管理器的所有资源都位于不同的分区中,那么如何加载启动菜单的所有资源?如果 gpt 指向 efi 分区,操作系统是否不应该在没有任何菜单的情况下启动,因为该分区仅包含 efi 启动文件?
答案1
现在我相信 gpt 会查找、挂载并使用分区
GPT 只是分区表;它不查找任何东西,也不挂载任何东西。系统固件(UEFI)负责完成所有查找工作。
如果 gpt 指向 efi 分区,并且 grub 启动管理器的所有资源位于不同的分区,那么如何加载启动菜单的所有资源?
GRUB 内置有自己的文件系统驱动程序;它能够使用 UEFI“原始设备访问”功能来访问各种文件系统的内容 - 非常像操作系统。(事实上,与真正的操作系统非常相似,GRUB 甚至有自己的 PCI、SATA、NVMe 等驱动程序,因此它不需要依赖固件。)
当您执行此操作时grub-install
,它会构建 GRUB“核心映像”(grubx64.efi),该映像由 GRUB 内核和访问 /boot 所需的所有必要驱动程序模块组成,由 grub-install 确定。(/boot 分区的位置也会嵌入到 grubx64.efi 中。)使用 运行它--verbose
可能会显示它将 part_gpt.mod、ext2.mod 等包含在最终的可执行文件中。
GRUB 实际上在 BIOS 上以相同的方式工作,只有“核心映像”存储在磁盘的其他位置(并通过 MBR 间接加载)。
话虽如此,UEFI 本身并不严格局限于一个分区;UEFI 程序可以访问固件识别的任何分区中的文件。另一个引导管理器 rEFInd 实际上加载UEFI 驱动程序对于需要访问的文件系统。