我有一个多引导系统,我想使用 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 之后的区域,但是存在一些复杂情况:
您必须
/boot
在普通分区上(可以是主分区或逻辑分区,但不能使用软件 RAID (md) 或 LVM)。单独的分区/boot
不是绝对必要的,但如果/boot
存储在根文件系统上,则相同的分区限制将适用于根文件系统分区。使用的文件系统
/boot
必须支持阻止列表安装模式。最常用的 Linux 文件系统支持此功能;重要的例外是btrfs
和xfs
(但是,btrfs
有足够大的引导加载程序区域可以嵌入core.img
其中,因此在那里安装 GRUB2 仍然可以工作)。同样,如果您没有单独的分区/boot
,这些限制将适用于您的根文件系统。GRUB2 开发人员不推荐使用阻止列表安装模式,因为在此模式下,文件作为纯文件
core.img
存储在文件系统中,但实际上它是使用存储在由 GRUB 生成的分区引导扇区中的扇区号(以及其自身)进行访问的,因此对该文件执行任何文件操作都可能导致引导中断。这是使用此模式时使用单独分区的另一个原因— 您执行会影响的文件系统操作的可能性较小。/boot
core.img
/boot
core.img
如果
/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.bin
Syslinux,它从 MBR 中的一个字节中获取启动分区号,而不是查找活动分区,这样您计算机上的任何非 Linux 操作系统就不会被标记为活动的逻辑分区所混淆。
答案2
据我所知,无法配置 Grub2 使得 MBR 中的代码在其 core.img 的下一个扇区以外的任何地方查找。
但是,您可以将所有 Grub 加载到 /boot 分区中。这样就无需干预磁盘开头存储的任何数据。默认情况下,MBR 中的代码将找到活动分区并将控制权转移到该分区的第一个扇区。如果您需要合适的 MBR,则随附了一个系统Linux。
这确实假定您的 /boot 分区是一个正常的主分区。