如何创建 grub 条目来加载另一个 grub 实例?

如何创建 grub 条目来加载另一个 grub 实例?

我在两个独立的物理磁盘上安装了两个加密的 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。我创建了下面的图片来说明这种情况: 所需的 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。

相关内容