我正在尝试在单个 BTRFS 文件系统内安装不同的 Linux 发行版,每个发行版使用一个子卷,以避免使用不同的分区浪费可用空间。
我使用的是运行 UEFI 的笔记本电脑,并且我想使用以下分区方案:
sda1:EFI 引导,安装在所有系统上的 /boot/efi 上
sda2:交换
sda3:BTRFS 卷
然后 sda3 将被“分区”到以下子卷中:
/data:数据子卷
/snapshots:快照子卷
/os/DISTID:发行版 DIST 子卷(一个用于发行版)
每个发行版都会安装它的 GRUB2,而我会在 UEFI 中加载我需要的 GRUB,这样每个发行版就不需要知道其他发行版。
我能够安装 Arch 和 Funtoo,但无法将 OpenSUSE 设置为安装到 /os/suse 子卷。
我尝试了以下方法:
- 将后者设置为默认子卷(如前所述这里)并告诉 OpenSUSE 不要格式化该分区;看起来安装成功,但是无法启动
- 将子卷安装到安装实时系统中的 /mnt 并告诉 OpenSUSE 忽略这一事实;当尝试重新挂载分区进行实际安装时安装失败
- 在类似于笔记本电脑环境的虚拟机中安装 OpenSUSE,然后将整个系统复制到子卷,并对 grub 及其设置进行必要的调整(我必须使用 Arch 或 Funtoo 进行的调整); grub 已加载,但启动的系统陷入内核恐慌
我所写的对 GRUB 的调整意味着以下内容:
- 子卷中的 chroot(使用 arch-chroot 或gentoo/funtoo 安装过程)
- 将 grub 安装在
/boot/efi
EFI 系统分区(但保留 GRUB 的数据/boot
) - 运行
grub-mkconfig -o /boot/grug/grub.cfg
以更新引导加载程序
有人有什么想法吗?我错过了什么?
答案1
根据我的经验,OpenSUSE Leap 42.2 / 42.3 安装程序无法处理自定义(例如除了 snapper / @-notation 之外)子卷。更糟糕的是,某些工具(例如引导加载程序安装)存在问题。例如,在我的例子中,grub 核心指向 /boot/grub...,但从 chroot 更新时它应该只是 /grub..。您可以使用此工具检查当前设置:https://github.com/arvidjaar/bootinfoscript
无论如何,这是我在安装后进行设置或用于可启动备份的一种方法。
避免安装程序创建数十个子卷,只需安装在分区/默认子卷的根目录中(如果有效)。
安装完成后,启动救援系统并
- 将已安装的系统目录移动到所需的子卷,以便在该子卷下拥有常用的 Linux 文件系统树。如有必要,还要修复主文件夹。
- 修复 /etc/fstab,添加正确的 subvol=/myrootsubvol 选项
- 挂载带子卷的分区(未来/)、挂载boot、挂载boot/efi
现在在已安装的子卷之外创建第二个目录。将所有内容绑定安装到该目录中。
mount -o bind "/mnt/partition_root/sysroot_subvol" "/mnt/temp_sys_prep" mount -o bind "/mnt/partition_root/sysroot_subvol/boot" "/mnt/temp_sys_prep/boot" mount -o bind "/mnt/partition_root/sysroot_subvol/boot/efi" "/mnt/temp_sys_prep/boot/efi" mount -o bind /proc "/mnt/temp_sys_prep/proc" mount -o bind /sys "/mnt/temp_sys_prep/sys" mount -o bind /dev "/mnt/temp_sys_prep/dev"
现在使用通常的 chroot 方法
/mnt/temp_sys_prep
。在 chroot 中您可以使用grub2-install --no-nvram --recheck --efi-directory=/boot/efi /dev/disk/by-id/scsi-SATA...
,grub2-mkconfig -o /boot/grub2/grub.cfg
,mkinitrd
我不确定正确的顺序; mkinitrd 可能也调用 grub。
- 退出 chroot 并按相反顺序卸载。再次使用工具检查 grub2 core 现在是否指向正确的路径