(UEFI) 从 GRUB 链式加载 GRUB

(UEFI) 从 GRUB 链式加载 GRUB

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

我想要:

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

我尝试过的:

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

迄今为止:

  • grub-install我已经 使用grub-mkconfig.Test boot将 GRUB 安装到了我的 ESP 上。这意味着我的/boot/grub文件夹是空的,并且我的 ESP 不需要在启动期间/启动后安装。
  • 我尝试将第二个 grub 安装到/boot/efi/和中/boot/grub/,但 EFI 部分无法安装,grub-install抱怨目标不是 EFI 分区。但由于我已经安装了主 GRUB,所以我的辅助 GRUB 位于 ext4 rootfs 上应该没什么关系吧? Grub 可以读取 ext4。我--force也尝试过这个选项。

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

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

答案1

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

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

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

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

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

#!/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
}

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

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

答案2

我已经找到了如何.efi在我的每个/设备上手动安装。从主配置引用辅助 GRUB chainloader 很简单:

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
}

为了创建这个辅助文件,.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

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

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

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

答案3

我正在尝试对 i386-pc grub 做类似的事情,并且 core.img 文件的 chainloader 无法工作,给出“错误:无效签名”

但我了解到 grub core.img 文件符合多重引导,因此我能够像以下那样引导 core.img:

multiboot (hd0,7)/core.img
boot

并成功获得新的grub,它的模块和初始配置。

我想您的 chainloader 命令在非 efi grub 的 efi 上失败,因此可以在 boot 命令之前检测到此失败并回退到 core.img 上的多重引导。

相关内容