在 Linux 系统的管理工具箱中,chroot 是一个强大却略显低调的命令。它的名字源自 Change Root,即“更改根目录”。对于初学者来说,它可能只是一个简单的目录切换命令;但对于系统管理员、开发者和安全专家而言,chroot 是系统修复、软件测试和环境隔离的强力工具。
本文将深入理解 chroot 的原理、作用、使用方法及典型应用场景。

chroot 的核心功能是为一个正在运行的进程及其子进程更改其可见的根目录。简单来说,它将一个指定的目录变成进程所能看到的文件系统的“根”(即 /)。
/ -> /home -> /usr -> /etc .../mnt/new_root 设置为新的根,那么该进程看到的 / 实际上就是宿主系统的 /mnt/new_root。它无法访问 /mnt/new_root 之外的任何文件路径。Linux 系统中的每个进程都有一个与之关联的“当前工作目录”和“根目录”的概念。chroot 通过系统调用(chroot())修改了进程的根目录属性。
关键点:
chroot 并不创建一个虚拟化的环境(如 Docker 或虚拟机)。它只是对文件系统视图进行了一个“裁剪”或“重定向”。chroot 的进程及其子进程。宿主系统的其他进程不受影响。chroot 最初并非为安全隔离而设计,有经验的用户可能通过特定方法(如获取 root 权限、访问特定设备文件等)“越狱”。因此,它不应被用作主要的安全沙箱。对于安全隔离,应使用 namespaces、cgroups 和 Seccomp 等现代容器技术(如 Docker 的实现基础)。尽管存在局限性,chroot 在众多场景下依然不可或缺:
/mnt/sysroot),然后 chroot 进去进行修复(例如重装引导程序、修复核心配置文件)。chroot 创建一个干净、无污染的基础环境,确保编译过程只依赖于明确指定的工具和库,提高构建结果的可重复性和可靠性。chroot,可以为其量身定制一个环境,而无需扰乱宿主系统。使用 chroot 通常需要 root 权限,并且需要提前准备好一个“根文件系统”。
chroot [OPTION] NEWROOT [COMMAND [ARG]...]
NEWROOT: 要作为新根目录的路径。COMMAND: 在新的根环境中要执行的命令。如果未指定,默认执行 $SHELL 环境变量指定的 shell,否则执行 /bin/sh。步骤 1:准备目标根文件系统这个系统可以是从另一个Linux系统复制而来,由debootstrap等工具构建,或是一个已挂载的磁盘分区。

步骤 2:挂载必要的虚拟文件系统chroot 环境需要访问核心的虚拟文件系统才能正常工作。
# 挂载 proc 文件系统(提供进程信息)
sudo mount -t proc /proc /mnt/new_root/proc
# 挂载 sys 文件系统(提供系统设备和驱动信息)
sudo mount -t sysfs /sys /mnt/new_root/sys
# 挂载 devtmpfs 文件系统(提供设备文件)
sudo mount -t devtmpfs /dev /mnt/new_root/dev
# 推荐也挂载 devpts(用于伪终端)和 tmpfs(用于临时文件)
sudo mount -t devpts /dev/pts /mnt/new_root/dev/pts
sudo mount -t tmpfs /tmp /mnt/new_root/tmp
# 如果需要使用网络,还需要复制宿主机的 resolv.conf 以获取DNS
sudo cp /etc/resolv.conf /mnt/new_root/etc/resolv.conf

步骤 3:执行 chroot现在可以进入准备好的环境了。
# 基本用法,进入新的根并启动一个 shell
sudo chroot /mnt/new_root
# 或者指定要运行的程序
sudo chroot /mnt/new_root /bin/bash

步骤 4:在 chroot 环境中工作此时,您就在一个“全新的”系统里了。可以安装软件、修改配置、运行服务等。
步骤 5:退出并清理完成工作后,退出 chroot shell,然后卸载之前挂载的文件系统。
# 退出 chroot 环境
exit
# 回到宿主机后,卸载虚拟文件系统
sudo umount /mnt/new_root/proc
sudo umount /mnt/new_root/sys
sudo umount /mnt/new_root/dev/pts
sudo umount /mnt/new_root/dev
sudo umount /mnt/new_root/tmp
# 最后再卸载根目录本身(如果它是一个独立分区)
sudo umount /mnt/new_root
从 Linux Live USB 启动。
挂载原来的根分区(假设为 /dev/sda1)到 /mnt。
sudo mount /dev/sda1 /mnt
挂载虚拟文件系统。
sudo mount --bind /dev /mnt/dev
sudo mount --bind /proc /mnt/proc
sudo mount --bind /sys /mnt/sys
Chroot 进入原系统。
sudo chroot /mnt
重新安装和配置 Grub。
grub-install /dev/sda
update-grub
退出、卸载、重启。
使用 debootstrap 为 Ubuntu 22.04 构建一个基础环境:
# 1. 安装 debootstrap
sudo apt install debootstrap
# 2. 构建最小根文件系统
sudo debootstrap jammy /opt/jammy-chroot http://archive.ubuntu.com/ubuntu
# 3. 进入该环境
sudo chroot /opt/jammy-chroot
chroot 必须由 root 用户执行。chroot 后要执行的命令所需的动态库,命令会失败。使用 ldd 命令可以检查二进制文件的依赖关系。/bin/bash 不存在,而是因为它依赖的库(如 libc.so.6)在新根环境中找不到。确保你的根文件系统是完整的。chroot 是一个通过改变进程根目录来实现文件系统层面隔离的基础工具。它虽然古老,但在系统修复、环境隔离和软件构建等领域依然发挥着不可替代的作用。理解其原理和正确的工作流程是有效使用它的关键。
然而,也必须认识到它并非万能的银弹,尤其是在安全性方面存在固有缺陷。对于更高级的隔离需求,现代容器技术(如 Docker、LXC)是更好的选择,它们正是在 chroot 的基础上,结合了 Namespace、Cgroup 等机制,提供了更完善、更安全的隔离环境。