我正在尝试使用 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(显然,我猜)
据我了解,事情发生按以下顺序进行:
- BIOS 加载 EFI,
/dev/sda1
其中/boot/efi/EFI/boot/bootx64.efi
/boot/efi/EFI/boot/bootx64.efi
/boot/efi/EFI/opensuse/grub.cfg
有尝试加载的硬编码路径/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
或者有什么工具可以帮我做这件事?!