目录隔离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