chroot 中的挂载点

chroot 中的挂载点

我有一些设备(比如说/dev/sda1)安装在/home/user1。我下也有一个完整的Linux系统/tmp/chroot,并且该目录/tmp/chroot/home只包含一个名为user2.

如果我chroot/tmp/chroot、 mount/dev/sys那里/proc发出mount命令(或cat /proc/mounts),我仍然可以看到/dev/sda1安装在/home/user1,而该目录/home/user1甚至不再存在(在 chroot 中)。

我也尝试过withjchroot而不是chroot(这是一个界面类似的程序,chroot但创建了一个新的挂载命名空间和一个新的PID命名空间),但结果是相同的。

这是正常行为吗?我可以访问有关 chroot 之外的挂载点的信息,这听起来很奇怪。
有没有办法让它们消失/proc/mounts

答案1

这是 chroot 中的预期行为。 chroot 实际上只是将进程所看到的文件系统根目录“/”更改为与引导时挂载为“/”的目录不同的目录。该进程仍然对内核本身具有相同的全局访问权限,只是不能访问“/”文件系统。

内核不会对 /proc 或设备进行任何修复或模拟,以使 chroot 进程相信 chroot 是“真实的”。作为其副作用,在 chroot 中以超级用户身份运行的任何进程都可以通过多种方式轻易地突破 chroot(例如,挂载 /dev 并挂载 /dev/sdaX ,其中真正的 root 所在,或者甚至只是 mknod 一个新的设备进入并使用它挂载——内核不关心)。 chroot 进程甚至可以安装设备驱动程序并做任何它喜欢做的事情......

如果您希望“欺骗”一个进程,使其认为它在与当前运行的系统不同的系统上运行,或者提供安全层,那么 chroot 可能是错误的技术,我建议您研究用户模式 ​​Linux 或可能的 Linux集装箱

答案2

是的,您需要使用“unshare”来代替(或同时)chroot; chroot 仅更改进程的根目录。虽然在实践中很难达到高于它的任何目标,但有很多方法可以突破。这不是监狱。

有一些工具可以执行此操作,例如“lxc”(Linux 容器)

相关内容