chroot报“No such file or directory”本质是目标程序(如/bin/bash)依赖的动态库缺失,需用ldd查依赖并完整复制.so文件及动态链接器ld-linux-*.so.2,再挂载/proc、/dev、/sys虚拟文件系统,最后降权运行以防止逃逸。

chroot 本身不构成隔离环境,它只改根目录路径;真正可用的隔离必须叠加挂载、降权、资源限制三步动作,缺一不可。
chroot 命令报 “No such file or directory” 怎么办
这不是路径写错,而是目标程序(比如 /bin/bash)依赖的动态库缺失。即使复制了可执行文件,ldd 显示的每个 .so 文件都得手动拷进去。
- 先查依赖:
ldd /bin/bash,注意输出里所有=> /lib64/xxx.so.y行 - 在 chroot 目录里建好
lib64(或lib),用cp --parents复制完整路径,避免漏掉软链接指向的真实文件 - 别跳过
/lib64/ld-linux-x86-64.so.2——这是动态链接器,没它连bash都启动不了 - 更省事但重一点的做法:用
debootstrap(Debian)或dnf --installroot(RHEL)直接拉一个最小系统,比手动拼凑可靠
进入 chroot 后命令全挂:ps、id、ls /proc 都失败
因为 /proc、/dev、/sys 是虚拟文件系统,不挂载就等于没操作系统内核接口。chroot 目录里放再多二进制也没用。
- 必须在进入前挂载:
mount -t proc proc /path/to/chroot/proc -
mount --bind /dev /path/to/chroot/dev(若服务不碰硬件,可用mount --bind /dev/null /path/to/chroot/dev替代整个/dev) mount -t sysfs sysfs /path/to/chroot/sys- 挂完再进:
sudo chroot /path/to/chroot /bin/bash,进去后立刻mount看是否列出了这三项
为什么 root 用户在 chroot 里仍能逃逸
chroot 不隔离命名空间,root 权限下一条 chdir("/") + chroot(".") 就能跳出——Linux 内核允许 root 反复调用 chroot(),这是设计使然,不是 bug。
- 唯一有效防线是降权:用
--userspec启动,例如sudo chroot --userspec=untrusted:untrusted /path/to/chroot /bin/bash - 确保该用户在 chroot 内有合法 home 目录和 shell 配置,且
/etc/passwd里 uid/gid 匹配 - 进 jail 后第一件事是
ulimit -u 32 -n 64 -v 524288000,否则一个 fork bomb 就拖垮宿主 - 验证是否生效:
id输出 uid 必须非零,ls /etc/shadow应报No such file,ls /proc/1/ns/pid的值必须和宿主机不同(后者需前置unshare --pid,chroot 本身做不到)
最容易被忽略的是:很多人复制完 bash 和几个 .so 就以为“能用了”,却没验证 id、mount、ls /proc/1/ns 这三个命令——它们才是判断是否真受限的铁标尺。


















