Chroot 是一个非常强大且奇妙的命令,它和 Docker 非常相像。

我们可以在挂载一个文件系统(一般是根文件系统)后,利用 chroot 将根目录设置到挂载点,就像进入了一个 docker 一样,如下所示:

sudo mount <rootfs.img> mnt
# ... some other code
sudo chroot mnt /bin/bash

chroot 需要指定根目录(也就是 mnt )和要运行的命令,这个命令是在新的根文件系统下的。

chroot 不仅会改变根目录,同时还会改变 user_id, group_id ,默认是对新根目录拥有 root 权限,这点和 docker 也非常类似。

但是 chroot 并不会像 docker 一样主动分配设备资源,所以需要我们手动分配,利用的是 Mount 的绑定挂载机制。本质就是根本没有分配,将原来 OS 的资源(以文件的形式呈现)直接共享给新的根文件系统。

sudo mount --bind /sys mnt/sys
sudo mount --bind /proc mnt/proc
sudo mount --bind /dev mnt/dev

所以总结下来就是:

sudo mount new.img mnt
sudo mount --bind /sys mnt/sys
sudo mount --bind /proc mnt/proc
sudo mount --bind /dev mnt/dev
sudo chroot mnt /bin/bash

在卸载的时候,也需要依次卸载:

sudo umount mnt/sys
sudo umount mnt/proc
sudo umount mnt/dev
sudo umount mnt