从分区上的子目录启动 Linux 系统?

Aze*_*ale 13 linux filesystems chroot boot

我想尝试设置一台计算机,以便在同一个文件系统中安装多个 Linux。例如,filesytem将有3个文件夹:/Ubuntu_Precise/Ubuntu_Oneiric,和/Ubuntu_Natty

(我知道你可以用 BTRFS 和子卷来做到这一点,但我想使用 EXT4 来提高速度)。

我曾经使用 BTRFS 设置了多个不同发行版的安装,并且从运行开始,我知道 Grub 在从“非标准”路径启动 vmlinuz 和 initrd 映像方面做得很好。但是当我在做 BTRFS 的事情时,有rootflags=subvol=@<subvolume_name>一个告诉内核将该子卷挂载为文件系统中的 / 。是否有任何参数可以通过内核使其绑定挂载分区中的子文件夹作为 / 然后启动?

我认为对于其他部分,我相当接近。我知道如何在/etc/fstab. 此外,从我在 BTRFS 子卷中设置多个 linux 安装的系统时,我习惯于在 VM 中安装发行版,然后使用 rsync 迁移它,所以我不太担心我需要做什么获得正确的配置,我只是想找出正确的配置是什么。一旦我知道这一点,我应该能够轻松地迁移到子文件夹和文件编辑。

我已经了解虚拟化和分区,但这不是我要找的。目标计算机没有足够的能力进行虚拟化,并且分区不共享可用空间。我希望建立一个双/三/四/等引导Linux发行版的系统,但它是用一个文件系统完成的,因此不会出现“我有可用空间,但它在错误的分区中!”的情况。

如果有人建议如何编辑我的问题或其标题更清晰,我会全力以赴。

Ulr*_*gel 10

简短的回答——据我所知,没有现成的工作解决方案可以满足您的特定要求。您必须调整每个发行版的每个 initramfs 以支持您的特定需求。

长答案 - 是的,这是可能的。现在大多数 Linux 发行版都使用 initramfs,它会被引导加载程序加载到内存中,然后由内核解压。它将在那里运行/sbin/init,负责设置早期的用户空间(运行 udev、加载模块、启动 plymouth、要求加密密码短语、设置网络以进行网络安装,......你能说出它的名字)。因为您可以运行自己的脚本并评估自定义启动参数。

Debian 示例

如果您使用的是 Debian(应该与 Ubuntu 相同),您应该能够放置一个脚本,/etc/initramfs-tools/scripts/init-bottom/该脚本将在 init 启动之前执行。有关脚本、不同目录和布局的更多信息,请查看man initramfs-tools。您将不得不调整rootmnt和添加目标目录。

示例(未经测试)脚本应安装为/etc/initramfs-tools/scripts/local-bottom/00-myroot/usr/share/initramfs-tools/scripts/init-top/00-myroot

#!/bin/sh -e

PREREQS=""

prereqs() { echo "$PREREQS"; }

case "$1" in
  prereqs)
  prereqs
  exit 0
;;
esac

for opt in $(cat /proc/cmdline); do
  case $opt in
    rootdir=*)
      new_mntdir="${opt#rootdir=}"
      ;;
    esac
done

if [ -n "$new_mntdir" ] ; then
  echo rootmnt="$rootmnt/$new_mntdir" >> /conf/param.conf
fi
Run Code Online (Sandbox Code Playgroud)

这个想法是调整rootmnt 在 initramfsinit脚本中使用哪个来启动/执行真正的 init。由于根设备已经安装在init-bootom舞台上,您只需调整/更改目标目录即可。

要使用此脚本,只需添加一个新的引导参数,复制该脚本,使其可执行,重新生成您的 initramfs 并为您的 Linux 发行版添加一个引导参数,例如rootdir=/Ubuntu_Precise.