是否可以将 Grub2 的 boot.img 放在 MBR 中,并让其从单独的启动分区加载 core.img?

是否可以将 Grub2 的 boot.img 放在 MBR 中,并让其从单独的启动分区加载 core.img?

我有一个多引导系统,我想使用 Grub 来管理。我的 Linux 发行版附带的 Grub 版本是 Grub2,它会将其 1.5-2 阶段的等效版本 core.img 安装到 MBR 之后但第一个分区之前的第一个磁道上的剩余扇区中。不幸的是,另一个程序需要这些扇区。

我有一个单独的主 /boot 分区。如果我可以只保留 boot.img 作为我的 MBR,但让它在 /boot 分区中查找 core.img,而不是在 MBR 后面的扇区中查找嵌入的 core.img,那么一切都会正常。grub2 能做到这一点吗?

答案1

可以在 BIOS 模式下配置 GRUB2 从分区启动而不嵌入到 MBR 之后的区域,但是存在一些复杂情况:

  1. 您必须/boot在普通分区上(可以是主分区或逻辑分区,但不能使用软件 RAID (md) 或 LVM)。单独的分区/boot不是绝对必要的,但如果/boot存储在根文件系统上,则相同的分区限制将适用于根文件系统分区。

  2. 使用的文件系统/boot必须支持阻止列表安装模式。最常用的 Linux 文件系统支持此功能;重要的例外是btrfsxfs(但是,btrfs有足够大的引导加载程序区域可以嵌入core.img其中,因此在那里安装 GRUB2 仍然可以工作)。同样,如果您没有单独的分区/boot,这些限制将适用于您的根文件系统。

    GRUB2 开发人员不推荐使用阻止列表安装模式,因为在此模式下,文件作为纯文件core.img存储在文件系统中,但实际上它是使用存储在由 GRUB 生成的分区引导扇区中的扇区号(以及其自身)进行访问的,因此对该文件执行任何文件操作都可能导致引导中断。这是使用此模式时使用单独分区的另一个原因— 您执行会影响的文件系统操作的可能性较小。/bootcore.img/bootcore.img

  3. 如果/boot位于逻辑分区上,则必须有某种方法从分区引导扇区启动引导加载程序代码 — 许多版本的 MBR 代码仅支持从主分区引导。一种解决方案是使用Syslinux 中的 MBR 代码,它甚至支持从逻辑分区启动。

假设您的/boot分区是/dev/sda2;那么您应该使用以下命令在那里安装 GRUB2:

grub-install --force /dev/sda2

您需要使用该--force选项,因为如果没有该选项,最近的 GRUB2 版本将拒绝使用黑名单安装模式。

然后您应该使用fdisk /dev/sda将分区 2 标记为活动分区。

最后,如果 MBR 中有一些非默认的引导代码(例如,较旧的 GRUB 安装),则需要安装从活动分区加载引导扇区的代码 — — 例如,您可以mbr.bin从 Syslinux 中获取:

dd bs=440 count=1 conv=notrunc if=mbr.bin of=/dev/sda

当使用逻辑分区时/boot,您还可以考虑使用altmbr.binSyslinux,它从 MBR 中的一个字节中获取启动分区号,而不是查找活动分区,这样您计算机上的任何非 Linux 操作系统就不会被标记为活动的逻辑分区所混淆。

答案2

据我所知,无法配置 Grub2 使得 MBR 中的代码在其 core.img 的下一个扇区以外的任何地方查找。

但是,您可以将所有 Grub 加载到 /boot 分区中。这样就无需干预磁盘开头存储的任何数据。默认情况下,MBR 中的代码将找到活动分区并将控制权转移到该分区的第一个扇区。如果您需要合适的 MBR,则随附了一个系统Linux

这确实假定您的 /boot 分区是一个正常的主分区。

相关内容