目录隔离chroot技术
chroot(change root) 是一种非常古老但极具工程智慧的 Linux/Unix 技术。它的核心思想很简单:
把某个进程的“根目录 / ”临时换成另一个目录。
chroot /opt/sandbox /bin/bash
那么 /opt/sandbox 在这个 shell 里就会变成 **新的 /**。
1.技术实现原理
Linux进程访问文件时依赖 VFS(Virtual File System)路径解析。
路径解析步骤大致:
/etc/passwd
↓
root inode
↓
etc
↓
passwd
chroot() 系统调用会修改:
task_struct -> fs -> root
也就是:
进程 root directory 指针
示意:
原来:
process
└─ root -> /
chroot后:
process
└─ root -> /opt/sandbox
所以:
/etc/passwd
会解析为:
/opt/sandbox/etc/passwd
2.基本使用
2.1创建一个最小 rootfs
mkdir -p /tmp/chroot/{bin,lib,lib64}
复制 bash:
cp /bin/bash /tmp/chroot/bin/
查看依赖:
ldd /bin/bash
复制依赖库:
cp /lib64/libtinfo.so.6 /tmp/chroot/lib64/
cp /lib64/libc.so.6 /tmp/chroot/lib64/
cp /lib64/ld-linux-x86-64.so.2 /tmp/chroot/lib64/
2.2进入chroot
sudo chroot /tmp/chroot /bin/bash
验证:
ls /
你只会看到:
bin
lib
lib64
真实系统其他目录完全消失。
3.典型应用场景
3.1软件构建环境隔离
早期 Linux 发行版编译软件经常用:
chroot build-rootfs
避免污染宿主系统。
例如:
- Debian buildd
- Gentoo stage build
3.2系统救援
当系统启动失败:
mount /dev/sda1 /mnt
chroot /mnt
然后修复系统:
grub-install
update-grub
3.3 FTP/SFTP 用户隔离
典型配置:
/home/user1
/home/user2
让用户只能访问自己目录:
chroot /home/user1
OpenSSH 配置:
ChrootDirectory /home/%u
4.容器技术的祖先
容器技术的核心思想其实是:
chroot + namespace + cgroup
对比:
| 技术 | 隔离能力 |
|---|---|
| chroot | 文件系统 |
| namespace | 进程/网络/用户 |
| cgroup | 资源限制 |
| container | 全部组合 |
Docker 的早期原型就是:
chroot jail