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