开机进入chroot吗?


13

我在硬盘驱动器上安装了Linux(Debian Jessie)。驱动器- sda1,ext4fs和sda2-交换

我有一个/chroot文件夹。/chroot文件夹中安装了另一个系统。

题:

如何告诉bootmanager,要引导的不是主系统(主要是Debian Jessie),而是要引导/ chroot中的系统?也许,改变/menu.lst/chroot/etc/fstab?(vmlinuz root=/dev/sda1/chroot?)

或另一个问题的变体:是否可能不在分区的根目录中而是在文件夹中安装linux?(/another_linux/bin/another_linux/home/another_linux/etc,...)


1
vmlinuz root=/dev/sda1/chroot将无法正常工作。可能可以使用与中所使用的方法类似的方法对此进行模拟initrd。参见例如这里。您安装/new_root与那里描述,然后,而不是cd /new_rootcd /new_root/chroot和继续。
n。代词

Answers:


7

引导加载程序或内核无法完成此操作。内核root选项(例如in)的参数root=/dev/sda1看起来像是标准的Unix路径名,但是这种路径名是根据当前安装的文件系统来解释的。在root解释该选项时,没有已挂载的文件系统。好吧,几乎没有。在内核初始化时,有一个最小ramfs文件系统的实例,称为最小文件系统rootfs,它是运行初始进程的根start_kernel()rootoption参数的实际解释是在称为的例程中完成的name_to_dev_t()。受支持的语法之一是/dev/name格式,其中通过在文件系统中临时挂载文件系统来解释名称sysfsrootfsroot,然后在下方查找与名称匹配的块设备条目/sys/block。此过程将在此处更详细地说明。

所描述的设置需要首先引导到一个最小环境(例如由)提供的环境,然后initrd/dev/sda1一个临时挂载点挂载实际的根文件系统,例如/mnt/rootfs,然后将根目录更改为/mnt/rootfs/chrootusing pivot_root(8)

这有点类似于如何设置LinuX容器LXC)的根文件系统。LXC是Linux的操作系统级虚拟化实现。操作系统级虚拟化通常在虚拟主机环境中使用,作为由管理程序管理的完全虚拟化的轻量级替代方案。在操作系统级虚拟化中,单个操作系统内核在多个隔离的用户空间实例之间共享。每个实例(通常称为容器,监狱,虚拟专用服务器(VPE)或虚拟环境(VE))本质上是一个单独的操作系统安装,位于主机系统上自己的目录中。


6

我遇到了相同的问题,并最终编写了此文件,以使其在不同的系统(当前为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,然后它可能会与它不同步。

有关详细信息,请参见boot_chroot


3

是的,您可以使用Btrfs子卷来解决问题

首先,您需要按照此处所述将ext4转换为btrfs

如果尚未将chroot转换为subvilume,请执行以下操作:

 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

现在,您有了名为path / to / chroot的子卷。你可以用sudo btrfs subvol list /

现在,您可以在grub中创建引导到子卷记录。只需rootflags=subvol=path/to/chroot在grub菜单项中添加到linux内核加载字符串,或使用来自动探测。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.