标题已经说明了一切。我真的很想了解 /boot 的位置是否硬编码到 grub 中还是什么?
如果 BIOS 查看第一个 512 并找到 grub...那么 grub 必须对其进行硬编码才能查看 /boot?
我说得准确吗?
答案1
它没有硬编码到 grub 中。如果您查看 GRUB 配置文件中的引导条目,如下所示:
title Red Hat Enterprise Linux (2.4.21-1.ent)
root (hd0,0)
kernel /vmlinuz-2.4.21-1 ro root=/dev/sda2
initrd /initrd-2.4.21-1.img
你会看到这条线root (hd0,0)
。在本例中,这是引导分区、硬盘 0、分区 0 的定义(在 Linux 中通常称为/dev/sda1
、/dev/hda1
或类似的名称,具体取决于硬件)。
当您运行时,grub-install
此配置将被读取并与 grub 二进制文件一起存储到引导加载程序区域中。但是,您可以在 GRUB 屏幕上编辑这些条目,以便从不同的分区引导。
将此分区挂载到/boot
路径上是 Linux/Unix 约定,请参阅文件系统层次结构标准。您可以将其安装在任何您想要的位置,但是您需要调整与内核和引导加载相关的软件包和工具,以使它们知道新位置。
答案2
的位置/boot
并没有太多硬编码,因为嵌入式在安装 GRUB 时写入 GRUB 的代码。
既然您提到“第一个 512”,我假设您正在考虑i386-pc
GRUB 的体系结构变体,即经典 BIOS 式引导的变体。
当 GRUB 安装在主引导记录中时,实际 MBR 中的代码仅足以再加载一个块(因为引导代码需要具有常规 BIOS 的所有旧版兼容性选项)。作为将 GRUB 安装到 MBR 过程的一部分,下一个块的块号会嵌入到 GRUB 的 MBR 代码中。
如果您使用经典的 MBR 分区,则下一个块通常是 MBR 后面的块(块 #1)。它将包含更多 GRUB 代码和更多要读取的块的列表。这些块将包含:
- GRUB 核心映像的剩余块
- 允许 GRUB 理解和访问分区表以及包含其余 GRUB 模块的文件系统(即通常包含目录的文件系统
/boot/grub
)所需的最小 GRUB 模块集 - GRUB 前缀,指示 GRUB 应在其中的哪个分区和目录中查找其配置文件以及必要时查找更多 GRUB 模块。
在 MBR 分区磁盘上,这些块将嵌入 MBR 和第一个分区开头之间通常不使用的空间中。阻止列表也是由grub-install
GRUB 安装时的进程生成的。
如果i386-pc
GRUB 安装在 GPT 分区的磁盘上,块 #0 和第一个分区开头之间的空间将被 GPT 分区表结构占用,因此专用的“biosboot”分区将用于 GRUB 的这些部分。
如果您想将/boot
目录名称更改为其他名称,只需使用 选项指定它--boot-directory=
,grub-install
它会自动调整嵌入到 GRUB 初始阶段使用的原始磁盘块中的前缀信息。
只是为了完整性:在具有安全启动的 UEFI 系统上,整个 GRUB 核心映像和全部引导过程所需的 GRUB 模块被写入 EFI 系统分区 (ESP) 上的单个文件中,通常命名为grubx64.efi
.这将是x86_64-efi
GRUB 的变体。
为了 UEFI 安全启动固件接受此文件,它需要是具有有效签名的 Microsoft PE+ 格式的二进制文件,该签名可以由系统固件接受的安全启动密钥之一或由安全启动兼容性提供商提供shim ( shimx64.efi
),或由系统管理员选择安装的机器所有者密钥 (MOK)。
越来越多的发行版似乎将 UEFI GRUB 的迷你配置文件放置到 ESP 中,名为grub.cfg
,与 位于同一目录中grubx64.efi
。该文件通常只包含几个配置行:足以识别包含实际 GRUB 配置的文件系统、目录和文件名。因此,在 UEFI 系统上,在许多发行版上,如果您想将 的名称更改/boot
为其他名称,只需编辑该文件,无需重新安装 GRUB 即可完成/boot/efi/EFI/<distro_name>/grub.cfg
。