是的,GRUB 不会将其所有引导加载程序代码都存储在 /boot/grub 中。它使用 多阶段架构,其中引导加载程序的不同部分存储在不同的位置,这对于使用 MBR 和 GPT 分区方案的系统至关重要,尤其是在 BIOS 模式 下启动时。(GRUB 不仅可以引导多系统,还可以引导多内核,还可以引导多个 snapshot-从而实现恢复)
GRUB 的多阶段架构说明
GRUB 的启动过程分为几个阶段,每个阶段都存储在不同的位置,具体取决于分区方案(MBR 或 GPT)和启动模式(BIOS 或 UEFI)。以下是细分:
1. GRUB 第 1 阶段
- 位置:存储在 MBR(主引导记录)或 GPT 系统中的 保护性 MBR(protective MBR) 中。
- 大小:仅 446 字节(磁盘前 512 字节的一部分)。
- 功能:阶段 1 的唯一目的是加载 GRUB 的下一阶段(阶段 1.5 或阶段 2)。由于阶段 1 非常小,因此它无法执行读取文件系统等复杂任务。
2. GRUB 阶段 1.5
- 位置:
- 在 MBR 磁盘 上:存储在 后 MBR 间隙(post-mbr gap)(MBR 和磁盘上第一个分区之间的小空间)中。
- 在 GPT 磁盘 上:存储在专用的 BIOS 启动分区(通常大小为 1-2 MB)中。
- 功能:阶段 1.5 包含必要的 文件系统驱动程序 和从分区(例如
/boot/grub)读取所需的其他代码。它弥补了阶段 1(最小)和阶段 2(功能齐全)之间的差距。 - 如果没有阶段 1.5,GRUB 将无法找到并读取存储在
/boot/grub目录中的实际文件,因为阶段 1 本身缺乏理解文件系统(例如 ext 4、Btrfs 等)的能力。
3. GRUB 阶段 2
- 位置:存储在分区(通常是 /boot 分区或操作系统的根分区)上的
/boot/grub/目录中。 - 功能:阶段 2 是完整的引导加载程序,它:
- 显示 GRUB 菜单(如果有多个操作系统或内核)。
- 允许用户选择要引导的操作系统或内核。
- 将 操作系统内核 加载到内存中(例如 Linux 内核)。
- 将控制权传递给操作系统。
当我们在多启动系统上看到 GRUB 菜单时,我们经常与 Stage 2 交互。它可以自定义,可以提供图形界面,并处理启动操作系统的更复杂任务。
GRUB 为什么需要 Stage 1.5?
Stage 1.5 的主要原因是 Stage 1 太小,无法包含对不同文件系统的支持。如果没有 Stage 1.5,GRUB 的 Stage 1 将无法理解从分区中加载 Stage 2 的位置或方式,因为分区通常使用复杂的文件系统(如 ext 4、XFS 等)。Stage 1.5 包括文件系统驱动程序,允许 GRUB 在分区上找到 /boot/grub 目录,并从中加载 Stage 2。
- 带有 Stage 1.5 的 MBR:在 MBR 系统上,Stage 1.5 存储在 MBR 后间隙中,这为其提供了足够的空间来存储必要的文件系统驱动程序。
- 带有 Stage 1.5 的 GPT:在 GPT 系统上,不存在 MBR 后间隙,因此 Stage 1.5 存储在 BIOS 启动分区中。这是 **GRUB 在 GPT 上以 BIOS 模式运行所必需的。
摘要
- Stage 1(存储在 MBR 中)非常小,仅用于加载 Stage 1.5 或 Stage 2。
- Stage 1.5(存储在 MBR 的 MBR 后间隙中或 GPT 的 BIOS 启动分区中)是加载文件系统驱动程序和继续启动过程所必需的。
- 第 2 阶段(存储在
/boot/grub/中)是功能齐全的引导加载程序,它显示 GRUB 菜单、允许选择操作系统并加载操作系统内核。
因此,GRUB 不仅将引导代码存储在 /boot/grub/ 中;它还将关键的引导加载程序代码存储在 MBR(第 1 阶段)中,如果是 GPT 磁盘上的 BIOS 模式,则存储在 BIOS 引导分区(第 1.5 阶段)中。这种架构使 GRUB 能够正确加载和引导操作系统。