chroot 是Linux/Unix系统中一个非常经典且基础的操作。它的名字来源于"Change Root"(更改根目录),它可以把某个特定目录变成当前进程及其子进程的“新根目录”(即/),从而实现目录级别的隔离。
一个在 chroot 环境中运行的程序,将被限制只能访问这个新根目录及其子目录中的文件,无法触及外部的系统文件。
基本使用
使用 chroot 的基本命令格式如下:
chroot /path/to/new/root /bin/bash
这条命令的意思是把 /path/to/new/root 作为新的根目录(/),并在其中启动/bin/bash Shell。如果不指定命令,它会默认尝试运行 $SHELL。
不过,实际操作比这要稍复杂一些。为了让 chroot 环境能够正常工作,通常需要手动准备几件事:
准备新根目录:这个目录必须包含一套完整的、最小化的 Linux 文件系统,比如 /bin, /lib, /etc, /usr 等,以及你需要的命令和它们依赖的库文件。
挂载虚拟文件系统:为了让环境里的进程能正常工作,需要手动将主系统的 /proc、/sys 和 /dev 等目录挂载到 chroot 环境内对应的位置。例如:
mount -t proc /proc /path/to/new/root/procmount -t sysfs /sys /path/to/new/root/sysmount -o bind /dev /path/to/new/root/dev
以上操作可以用一个脚本实现
配置网络:如果需要联网,还需要将主系统的 DNS 配置文件复制进去:
cp /etc/resolv.conf /path/to/new/root/etc/
之后按照本地系统操作即可
temp下是arm64版本的ubuntu文件系统目录,从上面的输出可以看到内核是一样的,但是平台不一样。理论上arm64的软件是不能在x86平台运行的,但是上面的命令却能正常运行,是因为用到了qemu这个模拟器。
在原环境中运行下面命令
sudo apt-get install qemu-user-staticcp /usr/bin/qemu-aarch64-static temp/usr/bin
通过上面的操作就可以让一台电脑(比如x86_64 PC)能够直接运行为另一种 CPU 架构(比如 ARM)编译的程序。
在操作完成后使用exit命令可以退出chroot环境,之后会回到原来的系统环境,然后依次卸载掉之前挂载的目录。
制作根文件系统
这个ARM的Ubuntu文件系统可以进一步制作成镜像文件,下载到嵌入式系统中使用
查看temp大小
制作镜像
mkdir rootfsdd if=/dev/zero of=linuxroot.img bs=1M count=1000mkfs.ext4 linuxroot.imgsudo mount linuxroot.img rootfs/sudo cp -rfp temp/* rootfs/sudo umount rootfs/e2fsck -p -f linuxroot.imgresize2fs -M linuxroot.img

这样 linuxroot.img 就是最终的根文件系统映像文件了。
这项技术非常实用,主要有以下几个应用场景:
系统抢救与修复:当系统无法正常启动时,可以用一个 Live CD 启动,然后把硬盘上的系统根分区通过 chroot 切换过去。这样就能在这个“被困住”的系统里执行命令,比如重新安装引导加载程序、重建 initramfs 镜像、重置忘记的密码等。
构建干净的测试环境:如果想测试一个新软件会不会影响现有系统,或者想严格控制软件包的构建依赖,可以在 chroot 环境里进行。所有操作都被限制在内,不会弄脏主系统。
隔离应用程序以增强安全:对于一些面向网络的服务(如早期的 FTP、Apache),可以将其运行在 chroot 环境中。即便攻击者利用程序漏洞攻破了该服务,也会因为被困在“监狱”里,无法访问系统的其他关键部分,从而将损害降到最低。
在64位系统上运行32位程序:通过创建一个包含32位运行库的 chroot 环境,可以在64位的主系统上运行32位的旧软件。
制作根文件系统:如前文所述,可以制作各种文件系统镜像。
附:
用chroot制作Ubuntu根文件系统
https://wiki.lckfb.com/zh-hans/tspi-rk3566/sdk-compilation/linux-compilation.html#ubuntu-%E6%A0%B9%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%E5%88%B6%E4%BD%9C