chroot 监狱似乎只是一个不同的世界,与实际文件系统没有交互。因此,整个环境必须在 chroot 内复制,这意味着在其中完整安装系统。
但是,是否有某种方法可以使 chroot Jail 具有对主文件系统的读取权限?此外,我还希望 chroot 能够优先选择自己的文件。例如,如果/usr/bin/wget
它存在于其中,那么它应该优先于系统的/usr/bin/wget
.
(我实际上正在寻找类似的东西沙盒.)
以上是否可行?
答案1
您可以使用以下命令将目录绑定安装到 chroot 根目录中:
mount -o bind /x/y /chroot/x/y
(看man mount
,“绑定安装”部分)。从现在开始,任何访问都/chroot/x/y
与访问完全相同/x/y
:相同的文件列表、相同的内容、相同的索引节点。
但请注意,这会将整个目录按原样放置:chroot 内的一个进程可以写入该目录将能够写入“真实”目录外部。如果要使 chroot 内的挂载为只读,则需要在绑定后显式重新挂载为只读:
mount -o remount,ro /chroot/x/y
原始 /x/y 将保持读写状态,但副本现在将是只读的。
更喜欢文件的内部副本,或者要允许写入某些现有文件或目录而不影响原始文件或目录,您可以使用联合文件系统。这些使您可以将多个目录树相互叠加,指定写入的位置以及解析读取的顺序。 Linux 的常见联合文件系统包括奥夫斯,联合文件系统, 和UnionFS熔断器。其中前两个是内核模块,而最后一个则使用保险丝在用户空间中运行文件系统。内核模块通常速度更快,但 FUSE 版本可能更容易设置,尽管您可能希望避免使用 chroot 中的外部用户空间工具。您可以准备所需的联合文件系统,然后 chroot 到它们中。
在每种情况下,基本方法都是相同的,例如:
unionfs-fuse -o cow /jail/bin:/other/bin:/bin /chroot/bin
这将创建一个联合挂载,其中如果/chroot/bin
文件/jail/bin
存在,则给出优先级,然后尝试/other/bin/
,否则显示来自的文件/bin
。-o cow
使其成为写时复制:尝试写入,例如,/chroot/bin/foo
将复制/bin/foo
到/jail/bin/foo
并保存修改。如果您不希望出现这种行为,请忽略该选项。其他文件系统的配置略有不同,但原理是相同的。
无论您采用哪种方式设置,您都可以:
chroot /chroot
并让一切按照您想要的方式运行。
答案2
mount -o bind 应该对完整目录执行此操作。
mount -o bind /bin /chroot/bin
chroot /chroot
最终会在 chroot 中得到系统 /bin 的副本。
要让您的 bash 副本取代 /chroot/bin/bash 以与我们今天相同的方式处理它,请将其放入 /chroot/usr/local/bin 并相应地设置 PATH。