(UEFI) 从 GRUB 链式加载 GRUB

jig*_*jer 5 dual-boot boot-loader grub2 uefi

术语:ESP = 我的 FAT32 EFI 分区。

我想要:

  • 在我的 ESP 上安装一个独立的 GRUB,它会在我的发行版根文件系统 ( /)上链式加载另一个 GRUB 引导加载程序。我目前在我的分区上有几个没有安装 GRUB 的发行版。每个都完全安装在自己的 ext4 上/。我希望他们都有自己的辅助引导程序。
  • 主 ESP GRUB 也可以使用操作系统中的 grub.cfg 重新启动/重新加载。有效地对自身进行链式加载。

我试过的:

  • 我发现的示例包括从 GRUB2 引导 GRUB legacy,反之亦然,但它们不使用 UEFI 和 .efi 文件。GNU GRUB 文档甚至没有提到 UEFI,而 Arch/Ubuntu/Gentoo wiki 提供了设置基本(非链加载)安装的最少信息。

迄今为止:

  • 我已经安装GRUB到我的ESP使用grub-installgrub-mkconfig。测试的启动工程。这意味着我的/boot/grub文件夹是空的,我的 ESP 不需要在启动期间/之后安装。
  • 我试过在/boot/efi/and 中安装第二个 grub /boot/grub/,但 EFI 部分不会安装,grub-install抱怨目标不是 EFI 分区。但是因为我已经安装了主 GRUB,所以我的辅助 GRUB 在 ext4 rootfs 上应该没有关系吧?Grub 可以读取 ext4。我也试过这个--force选项。

所以看来我需要找到某种方法来说服安装程序可以grubx64.efi/boot/EFI......

如果有人对我如何安装主 GRUB 感到好奇,那只是grub-install对我的 ESP使用正确选项的问题。

Emm*_*osa 13

还有另一种方法:您可以创建一个菜单项,告诉 GRUB 加载另一个辅助 grub.cfg,例如来自另一个 Linux 发行版的 grub.cfg。

例如,我从 Gentoo Linux 开始,从中我将 GRUB2 安装到 MBR(机器对于 EFI 来说太旧了)。

然后我安装了 NixOS,我将其配置为在它自己的/boot(与 Gentoo 的/boot分开)中生成 grub.cfg,但没有安装 GRUB。

澄清grub-install一下,是从 Gentoo 执行的,而不是从 NixOS 执行的。

接下来,为了能够启动 NixOS,我将它添加到Gentoo 的/etc/grub.d/40_custom中:

#!/bin/sh
exec tail -n +3 $0
# This file provides an easy way to add custom menu entries.  Simply type the
# menu entries you want to add after this comment.  Be careful not to change
# the 'exec tail' line above.

menuentry 'NixOS' --class gnu-linux --class gnu --class os $menuentry_id_option 'nixos-0aca58bc-8fdb-4a07-aa2f-56406bcf19b7' {
        set root='hd0,msdos4'
        configfile /nixos/root/boot/grub/grub.cfg
}
Run Code Online (Sandbox Code Playgroud)

关键是configfile /nixos/root/boot/grub/grub.cfg线。它告诉 GRUB 加载另一个 grub.cfg。然后我grub-mkconfig从 Gentoo运行以应用更改。

现在,当我启动并选择NixOS 时,整个 GRUB 界面都会刷新以反映 NixOS grub.cfg,我可以从中启动操作系统。与链式加载不同,此配置使用 GRUB 的单一安装;它只是使用第二个配置。


jig*_*jer 7

我已经找到了如何.efi在我/的每个. 从主配置引用辅助 GRUB 链加载器很简单:

menuentry "GRUB chainloader" {
 #Load grub on partition 7 of a gpt formatted drive. 
 #It will reference its own modules and config.
 chainloader (hd0,gpt7)/path/to/bootloader/on/myOS/core.efi
}
Run Code Online (Sandbox Code Playgroud)

为了创建这个辅助.efi 我使用,grub-mkimage因为grub-install没有让我写入非 FAT 文件系统。语法非常挑剔,如果您使用错误的路径,它不会出错,因此请仔细检查参数:

grub-mkimage -o /path/to/mounted/targetOS/efidir/core.efi --format=x86_64-efi '--prefix=(hd0,gpt7)/boot/grub' ext2 part_gpt
Run Code Online (Sandbox Code Playgroud)

我尝试忽略 GPT 或 ext2 文件系统模块,但这不起作用,这两个模块是我系统的绝对最低要求(ext2 适用于 ext2/3/4)。

前缀目录是辅助引导加载程序查找其模块文件夹和配置文件的地方。因此,我/boot/grub/为每个包含x86_64-efi/文件夹的操作系统手动创建了一个(复制自/usr/lib/grub)grub.cfg我可以在grub-mkconfig禁用操作系统探测的情况下进行修改(或仅手动编辑它)。

我最初在没有 GRUB 的情况下安装了每个操作系统。这种方法允许我使用第一个操作系统或带有 GRUB 的 LiveCD 在所有操作系统上安装辅助 GRUB 引导加载程序。我可以独立更改每个操作系统的启动配置,没有污染风险,因为从未安装 ESP。