更新 EFI/grub,以便使用 btrfs 从单个驱动器双启动两个发行版

更新 EFI/grub,以便使用 btrfs 从单个驱动器双启动两个发行版

我正在尝试使用 openSuse (15.4) 和 Ubuntu (20.04) 创建双启动系统。

我将 Suse 安装在具有以下结构的驱动器上/dev/sda

/dev/sda
|- /dev/sda1
  |- /boot/efi              (vfat)
|- /dev/sda2
  |- /                      (btrfs subvol @/.snapshots/1/snapshot)
  |- /boot/grub2/x86_64-efi (btrfs subvol @/boot/grub2/x86_64-efi)
  |- /boot/grub2/i386-pc    (btrfs subvol @/boot/grub2/i386-pc)
  |- /home                  (btrfs subvol @/home)
  ...

这个想法是为 ubuntu 创建单独的子卷/,并共享所有其他子卷,例如/home

我已经创建了新的子卷@/ubuntu-root并将其安装到/mnt/ubuntu-root

|- /dev/sda2
  ...
  |- /mnt/ubuntu-root       (btrfs subvol @/ubuntu-root)

之后我debootstrap会进入它。

我可以成功chroot进入新安装的 ubuntu,但我无法想出正确更新 EFI 加载器和 grub 的方法。

我对所有 grub 的东西都很陌生,所有指南在哪些是先出现的、哪些应该手动更新、哪些应该由什么生成等方面都很混乱。而且,似乎没有一个指南提到 EFI。

update-grub提到这个问题的答案在 Suse 上不存在,os-prober似乎无法从 Suse 检测到 ubuntu,因此grub2-mkconfig不会改变任何东西。

是否有某个地方可以简明扼要地解释所有这些东西,或者也许有一个指南可以帮助我,但我在谷歌上找不到?

更新#1: 我已经安装了正确的内核 (5.4) 并update-initramfs -c -k 5.4.0-26-generic从 chroot 中完成。现在,grub-mkconfig从 ubuntu chroot 为 ubuntu 生成适当的配置,具有适当的菜单项和加载目标:

...
menuentry 'Ubuntu' ...
...
linux   /@/ubuntu-root/boot/vmlinuz-5.4.0-26-generic

但是,它没有看到现有的 openSuse(显然,我猜)

据我了解,事情发生按以下顺序进行:

  1. BIOS 加载 EFI,/dev/sda1其中/boot/efi/EFI/boot/bootx64.efi
  2. /boot/efi/EFI/boot/bootx64.efi/boot/efi/EFI/opensuse/grub.cfg有尝试加载的硬编码路径
  3. /boot/efi/EFI/opensuse/grub.cfg有以下内容
set btrfs_relative_path="yes"
search --fs-uuid --set=root {UUID}
set prefix=(${root})/boot/grub2
source "${prefix}/grub.cfg"

我认为它默认btrfs 子卷从 FS 启动,并从位于 opensuse 根子卷上的/dev/sda2 子卷加载下一个 grub 配置。/boot/grub2/grub.cfg

我可以手动更改该配置并插入 ubuntu 菜单项,但这些菜单项将位于未安装的子卷上,因为默认菜单项安装在该配置之外且在任何操作系统选择之前

我可以用操作系统根子卷中的一个来替换吗grub.cfg/boot/efi/EFI或者有什么工具可以帮我做这件事?!

相关内容