我在两个独立的物理磁盘上安装了两个加密的 Ubuntu 安装 (20.10)。我想从第一个 grub 加载第二个安装的 grub。目前,我只能通过主 grub 中的菜单项(使用 grub 定制器添加)加载第二个安装的特定内核,使用以下启动顺序:
recordfail
load_video
gfxmode $linux_gfx_mode
insmod gzio
if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
insmod part_gpt
insmod ext2
set root='hd2,gpt3'
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd2,gpt3 --hint-efi=hd2,gpt3 --hint-baremetal=ahci2,gpt3 f54aac74-c88d-4963-a23f-84d5b27c2829
else
search --no-floppy --fs-uuid --set=root f54aac74-c88d-4963-a23f-84d5b27c2829
fi
linux /vmlinuz-5.8.0-33-generic root=/dev/mapper/vgubuntu-root ro
initrd /initrd.img-5.8.0-33-generic
当然,一旦第二次安装的内核更新,这将失败,因为它指向特定的内核。所以我想从第一次安装中加载第二次安装的 grub。我创建了下面的图片来说明这种情况:
我尝试了两个选项(启动顺序):
chainloader (hd3,gpt3)/grub/x86_64-efi/core.efi
产量:
error: invalid signature
并且(基于https://www.linuxquestions.org/questions/linux-software-2/grub2-chainloader-833236/)
search --fs-uuid --set f54aac74-c88d-4963-a23f-84d5b27c2829
multiboot /grub/x86_64-efi/core.img
产量:
error: file '/grub/x86_64-efi/core.img' not found
因此两者都不起作用。所以我的问题是如何创建 grub 条目来加载另一个 grub 实例?
更新:我尝试了@TSJNachos117 提供的解决方案,如下所示:我从 grub-customizer 切换到直接编辑以下文件:
/etc/grub.d/40_custom_proxy
指向/etc/grub.d/proxifiedScripts/custom
我添加了以下菜单项:
menuentry 'The Other Ubuntu' {
insmod chain
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd2,gpt3 --hint-efi=hd2,gpt3 --hint-baremetal=ahci2,gpt3 f54aac74-c88d-4963-a23f-84d5b27c2829
else
search --no-floppy --fs-uuid --set=root f54aac74-c88d-4963-a23f-84d5b27c2829
fi
#set root=(hd2,3)
configfile /boot/grub/grub.cfg
}
选择此菜单项时,我的屏幕变黑约 10 秒,然后再次显示相同的 grub 菜单。有什么提示吗?
这里的输出是lsblk -o name,type,uuid
:
NAME TYPE UUID
loop0 loop
loop1 loop
loop2 loop
loop3 loop
loop4 loop
loop5 loop
loop6 loop
loop7 loop
loop8 loop
loop9 loop
loop10 loop
sda disk
└─sda1 part d8c4609f-a602-44e8-b8e5-d88b3ab664c2
└─additional_disk_crypt crypt d07398f4-5f04-41bc-a31a-e44c112e3ae3
sdb disk
├─sdb1 part
├─sdb2 part DA91-B238
├─sdb3 part 9e57c5ea-219b-4b3a-8759-b98eb7d34c93
└─sdb4 part 8f45cd57-43c9-413f-b3c5-88f4f943554a
└─sda4_crypt crypt Qb93l3-3kQ4-cL0y-beud-DjZ0-RXef-MosuKX
├─vgubuntu-root lvm a206ae07-c959-434b-a8a4-4fd46afc2d77
└─vgubuntu-swap_1 lvm d7f15c2d-1f6b-4bd6-9536-426ec27a620e
sdc disk
├─sdc1 part
├─sdc2 part 0C57-CD8C
├─sdc3 part f54aac74-c88d-4963-a23f-84d5b27c2829
└─sdc4 part 86119b44-5b4a-4034-a761-52303f26b743
sdd disk
├─sdd1 part E0DC5287DC5257BC
├─sdd2 part AA1A58321A57FA31
└─sdd3 part 50B8C8FEB8C8E396
sr0 rom
答案1
unix.stackexchange.com 上的用户 Emmanual Rosa 有很好的答案:
menuentry 'The Other Ubuntu' {
insmod chain
set root=(hd0,3)
configfile /boot/grub/grub.cfg
}
在上面的例子中,我已将启动期间显示的选项设置为The Other Ubuntu
。您可以随意将其更改为您想要的任何内容,只需更改“menuentry”部分之后、“{”字符之前的第一行即可。
我觉得我应该提一下,我发现这种配置有时有点棘手,因为 GRUB 并不总是以相同的顺序看到我的存储设备。有一天,有问题的分区可能位于“hd0”,第二天可能是“hd1”、“hd2”等。通常,分区号是相同的,只是“hd 号”发生了变化。但是,如果您发现自己添加、移动或删除分区,您的分区号也可能会改变。由于这些原因,最好使用 UUID。这样做的代码有点复杂,但您会在下面找到一个示例。为简单起见,我们假设即将链式加载的 GRUB 实例的分区的 UUID 为 12345-abcdefg:
menuentry 'The Other Ubuntu' {
insmod chain
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt3 --hint-efi=hd0,gpt3 --hint-baremetal=ahci0,gpt3 12345-abcdefg
else
search --no-floppy --fs-uuid --set=root 12345-abcdefg
fi
configfile /boot/grub/grub.cfg
}
由于每次安装或删除内核时 Ubuntu 都会自动重建 GRUB 配置(并且 Canonical 会定期发布新内核),因此最好不要手动更改文件/boot/grub/grub.cfg
。相反,将代码添加到 的末尾/etc/grub/40_custom
,然后运行sudo update-grub
。
我个人可以保证这个解决方案,因为我实际上已经用它将 Arch 安装的 GRUB 添加到 Ubuntu 的 GRUB 中。由于没有简单的方法(据我所知)将 RESUME= 内核参数传递给 Arch(用于休眠)而不会使 Ubuntu 的grub.cfg
文件过于复杂,因此只需将其放入 Arch 的 GRUB(它不会像 Ubuntu 那样改变),然后将 Arch 的 GRUB 破解到 Ubuntu 的 GRUB 菜单中,事情就变得简单了。
PS:我知道 OP 知道他/她的第二个 GRUB 实例的 UUID,但是如果有人偶然发现这个答案,却不知道包含其他 grub 的分区的 UUID,则该lsblk
命令可能会有用。类似的东西lsblk -o name,size,label,type,uuid
应该可以让你找出哪个分区是哪个(特别是如果所述分区有标签),然后从那里复制/粘贴 UUID。