skr*_*pki 15 startup chroot directory
我在硬盘上安装了 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
, ...)
这不能由引导加载程序或内核完成。内核root
选项的参数如 inroot=/dev/sda1
看起来像一个标准的 Unix 路径名,但这些路径名是根据当前安装的文件系统来解释的。在root
解释选项时,没有挂载的文件系统。嗯,几乎没有。在内核初始化时,有一个最小ramfs
文件系统的实例,称为rootfs
挂载为初始进程运行的根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),本质上是一个单独的操作系统安装,位于主机系统上它自己的目录中。
我遇到了同样的问题,最后写了这个,让它在不同的系统(目前是 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
Run Code Online (Sandbox Code Playgroud)
新映像将完全相同,但现在它可以处理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
}
Run Code Online (Sandbox Code Playgroud)
(更改文件/分区以匹配您的)
一旦您对它感到满意,您就可以使更改永久化
(直到 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
Run Code Online (Sandbox Code Playgroud)
从现在开始,常规的 initrd 映像将支持 chroot 引导。
不需要使用单独的 initrd.chroot ,它可能会与它不同步。
有关详细信息,请参阅boot_chroot。
是的,您可以使用 Btrfs subvolumes 来解决这个问题。
首先,您需要按照此处所述将 ext4 转换为 btrfs。
如果尚未将您的 chroot 转换为 subvolume:
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
Run Code Online (Sandbox Code Playgroud)
现在您有名为path/to/chroot 的子卷。你可以检查它sudo btrfs subvol list /
现在您可以在 grub 中创建引导到子卷记录。只需rootflags=subvol=path/to/chroot
在 grub 菜单项中添加到 linux 内核加载字符串或使用它来自动探测。