配置 grub 以与 UEFI 或 PC BIOS 启动配合使用

配置 grub 以与 UEFI 或 PC BIOS 启动配合使用

有没有办法使用 GRUB 在仅以 UEFI 模式启动的系统中启动并且(不更改磁盘上的任何内容)也在仅以 PC BIOS(传统)模式启动的系统中启动?

我想构建一个可以在任一模式下启动的磁盘映像,而无需在将启动盘在不同计算机之间移动时重新配置任何内容。我正在考虑一种配置,它将首先尝试一种模式,如果第一种模式失败,则尝试另一种模式 - 比如 UEFI,然后是传统 PC BIOS(反之亦然)。

这通常用于启动 FreeBSD 或 Linux,但我认为这应该独立于最终加载的所需操作系统。

我目前使用 GPT 分区表,并且有一个 EFI 系统分区(ESP -/boot/efi例如,在启动到 Linux 时挂载),以及一个非 ESP 启动分区(/boot在启动到 Linux 时挂载)。还有一个用于 GRUB 的分区,GRUB 将其称为“BIOS 启动分区”(parted使用bios_grub该分区的标志)。[[1]]

我试图了解 GRUB 是否可以配置多个目标(如果指定了多个目标,它似乎grub2-install只选择最后--target一个)或者使用后备机制来实现这个目标(或者可以使用链式加载?)。

现在,grub2-install --target=x86_64-efi <disk>在将磁盘移至 UEFI 系统之前以及grub2-install --target=i386-pc <disk>移至传统 PC BIOS 系统之前,我必须运行。这样可以正常工作(无需更改任何其他内容),但我想知道是否有办法避免在移动磁盘之前进行该配置更改。

[[1]]编辑: 更具体地说明当前 GPT 配置...

ESP GPT GUID 是 C12A7328-F81F-11D2-BA4B-00A0C93EC93B(恰好是分区#2)。

BIOS 启动分区 GPT GUID 是 21686148-6449-6E6F-744E-656564454649(恰好是分区 #1)。

/boot 文件系统具有 GPT GUID EBD0A0A2-B9E5-4433-87C0-68B6B72699C7(恰好是分区#4,并且是 Linux 系统上的 ext4 文件系统)。

当使用该parted实用程序时,ESP 的“标志”是boot,BIOS 启动分区的“标志”是bios_grub,/boot 的“标志”是legacy_boot(我认为 GRUB 并不关心该legacy_boot标志,所以我认为它既不会帮助也不会损害我的目标)。

答案1

现在,我必须在将磁盘移至 UEFI 系统之前运行 grub2-install --target=x86_64-efi,在移至旧式 PC BIOS 系统之前运行 grub2-install --target=i386-pc。这样可以正常工作(无需更改任何其他内容),但我想知道是否有办法避免在移动磁盘之前进行该配置更改。

您已经可以同时执行这两项操作,它们不会覆盖彼此的文件:1)为 UEFI 安装;2)为 BIOS 安装;3)现在您有一个带有用于 UEFI 的 GRUB 的磁盘BIOS。

这是后续配置grub.cfg由 编写的grub-mkconfig)需要仔细编写才能在两个系统上运行。使用基于文件的启动(其中 GRUB 本身加载 Linux 内核)应该没问题,但对于某些操作系统,您可能需要使用 GRUB 的(非常类似 shell 的)条件手动创建自定义“菜单项”,以根据固件类型执行此操作或执行该操作 - 也就是说,您可能需要维护手写的 grub.cfg(或至少其中的一部分),而不是完全依赖 grub-mkconfig。

我不认为 GRUB 关心该 legacy_boot 标志

但事实并非如此;这直接等同于 MBR 的“active/bootable”标志(GRUB 在 MBR 中也不关心这个标志),实际上它仅由 Syslinux 的 GPT 兼容 MBR BIOS 引导代码(gptmbr.bin)使用。

相关内容