我在硬盘上安装了 Linux (Debian Jessie)。驱动器 - sda1
、ext4fs 和sda2
- 交换
我有一个/chroot
文件夹。文件夹中安装了另一个系统/chroot
。
问题:
如何告诉启动管理器启动不是主系统(主要,Debian Jessie),但系统在/chroot?可能,改变/menu.lst
和/chroot/etc/fstab
? (vmlinuz root=/dev/sda1/chroot
?)
或者问题的另一种变体:是否有可能将Linux安装到文件夹中而不是分区的根目录中? ( /another_linux/bin
, /another_linux/home
, /another_linux/etc
, ...)
答案1
我遇到了同样的问题并结束了写这个让它在不同的系统上轻松工作(目前是 debian、ubuntu):
运行make_chroot_initrd
脚本以从现有镜像创建一个新的启用 chroot 的 initrd 镜像:
# ./make_chroot_initrd /chroot/trusty/boot/initrd.img-3.13.0-32-generic
making new initrd: /chroot/trusty/boot/initrd.img-3.13.0-32-generic.chroot
新映像将完全相同,只是现在它可以处理chroot=
启动参数。
使用 grub2 作为引导加载程序,您可以添加一个条目/boot/grub/grub.cfg
:(
或者也许更好/etc/grub.d/40_custom
)
menuentry "ubuntu trusty, (linux 3.13.0-32) (chroot)" {
insmod ext2 # or whatever you're using ...
set root='(hd0,7)' # partition containing the chroot
set chroot='/chroot/trusty' # chroot path
linux $chroot/boot/vmlinuz-3.13.0-32-generic root=/dev/sda7 chroot=$chroot rw
initrd $chroot/boot/initrd.img-3.13.0-32-generic.chroot
}
(更改文件/分区以匹配您的)
系统范围内的安装
一旦您对此感到满意,您就可以使更改永久化
(直到 initramfs-tools 软件包升级)。
在 chroot 系统中:
# cd /usr/share/initramfs-tools
# cp -pdrv . ../initramfs-tools.orig # backup
# patch -p1 < path_to/boot_chroot/initrd.patch
# rm *.orig */*.orig
# update-initramfs -u
从现在开始,常规 initrd 映像将支持 chroot 启动。
无需使用单独的 initrd.chroot,否则可能会与其不同步。
看启动chroot了解详情。
答案2
这是引导加载程序或内核无法完成的。内核选项的参数root
(例如 in )root=/dev/sda1
看起来像标准 Unix 路径名,但此类路径名是根据当前安装的文件系统进行解释的。在root
解释该选项时,没有挂载的文件系统。嗯,几乎没有。在内核初始化时,有一个ramfs
称为rootfs
Mounted 的最小文件系统实例,作为初始运行进程的根start_kernel()
。选项参数的实际解释root
是在名为 的例程中完成的name_to_dev_t()
。支持的语法之一是格式/dev/name
,其中姓名sysfs
通过在根目录中临时挂载文件系统rootfs
并查找匹配的块设备条目来解释姓名在下面/sys/block
。这个过程有更详细的解释这里。
所描述的设置需要首先启动到最小环境(例如由 提供的环境) ,从临时安装点initrd
安装真正的根文件系统,例如,然后将根目录更改为使用/dev/sda1
/mnt/rootfs
/mnt/rootfs/chroot
pivot_root(8)
。
这有点类似于根文件系统的方式Linux容器(LXC) 已设置。 LXC 是 Linux 的操作系统级虚拟化实现。操作系统级虚拟化通常用于虚拟托管环境中,作为虚拟机管理程序管理的完全虚拟化的轻量级替代方案。在操作系统级虚拟化中,单个操作系统内核在多个隔离的用户空间实例之间共享。每个实例,通常称为容器、监狱,虚拟专用服务器(VPE) 或虚拟环境(VE) 本质上是一个单独的操作系统安装,位于主机系统上自己的目录中。
答案3
首先你需要按照此处所述将 ext4 转换为 btrfs。
如果尚未将 chroot 转换为子卷:
sudo mv /path/to/chroot /path/to/chroot-tmp
sudo btrfs subvol create /path/to/chroot
sudo mv /path/to/chroot-tmp/* /path/to/chroot
sudo mv /path/to/chroot-tmp/* /path/to/chroot -r # for directories
现在你已经有了名为的子卷路径/到/chroot。你可以检查它sudo btrfs subvol list /
现在您可以在 grub 中创建引导到子卷记录。只需rootflags=subvol=path/to/chroot
在 grub 菜单项中添加到 linux 内核加载字符串或使用这自动探测。