术语: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 上的多重引导。