我想知道 grub 引导加载程序在硬盘中的确切位置。我知道 grub-install /dev/sda 来安装 grub,但这是否意味着它会在整个硬盘上安装 grub?
答案1
答案是:视情况而定。在传统的 MBR 磁盘上,第一部分 ( boot.img
) 写入引导扇区,下一部分通常写入引导扇区和第一个分区之间的扇区。第一个分区之前通常至少有 63 个扇区未使用空间。 GRUB 的其余部分存储在/boot/grub
.在 GPT(GUID 分区表)磁盘上,但使用非 UEFI (=BIOS) 固件时,BIOS 引导分区用于存储 GRUB 的第二部分。在 UEFI 系统上,GRUB 由grubx64.efi
ESP(EFI 系统分区)上的固件加载。
答案2
为了设置上下文,我们讨论 Linux 引导过程的第一阶段。最终,GRUB 在这个阶段会尝试执行最少的操作来查找和访问引导分区,然后加载内核并将其指向包含操作系统重要内容的初始 ramdisk 映像 (initrd)。
如果它是 MBR 系统上的 MBR 磁盘(经典场景),则扇区 0 的前 440 字节专用于引导代码。第一个扇区的尾部包含一些其他内容,例如分区表。 GRUB 中有一小段代码,但默认情况下它会跳转到扇区 1 及之后的扇区以获取更多代码。
此区域通常不包含在分区中。由于遗留原因(CHS 寻址、LBA 之前),系统通常将第一个分区放在扇区 63。后来的系统开始尝试更优化地对齐分区以适应底层介质,而不是假设每个扇区都相等。最初这是为了 RAID 阵列,后来是为了 AF 硬盘和固态磁盘中的页面/块大小,因此通常变为 1 MiB。
要点是这个通常未使用的区域由 GRUB 使用。如果您今天要在磁盘上进行 GRUB 的 i386-pc 安装,它将使用接下来的 109 个扇区来存储代码(如果可用)。 (即扇区 0 的前 440 个字节 + 扇区 1 到 110 的全部)它使用的扇区的确切数量将随着 GRUB 的变化而变化,并且还取决于它决定在那里需要哪些模块(例如用于启动分区等)。
如果它是 EFI 系统上的 GPT 磁盘,则 GRUB 根本不需要驻留在扇区 0 中。通常存在“保护性”MBR,但如果系统运行在越来越常见的操作系统中,则系统在启动期间不会使用它。纯EFI模式。相反,系统的 BIOS(用词不当,但它明白了这个想法)会查找它知道如何访问的所有磁盘,然后检查它们是否有 GPT 分区表,然后检查分区设置了 ESP 标志的磁盘,以及这些 ESP 分区在它知道如何解析的文件系统中格式化。 FAT32 支持是强制性的,但有时 BIOS 会包含适用于 NTFS 等其他格式的可选驱动程序。
一旦找到可以读取的 ESP 分区,它就会检查包含一些 EFI 启动文件的子文件夹。如果存在,您将在启动顺序列表中找到一个具有该文件夹名称的条目。 BIOS 将简单地执行该文件夹中的引导加载程序。由于它是文件系统上的文件,因此引导加载程序在介质上的物理位置的详细信息不再重要。