目标是在主机 Linux 系统内的移位(重新定位)发行版(其 / 不得与全局 / 一致)中安装和运行程序。这些程序不适合使用不同的 / 。
fakechroot 不是一个完整的解决方案,因为它采用库替换而不是在系统调用级别上操作(因此不适合静态链接的二进制文件)。
答案1
该解决方案可能必须基于 ptrace 或命名空间(取消共享)。
基于 ptrace 的解决方案可能比基于名称空间/unshare 的解决方案效率低(但后一种技术是前沿技术,可能尚未得到很好的探索)。
基于 ptrace
UMView
至于基于 ptrced 的解决方案,感谢以下评论https://stackoverflow.com/a/1019720/94687,我发现了 UMView:
- http://wiki.virtualsquare.org/wiki/index.php/ViewFS
- http://wiki.virtualsquare.org/wiki/index.php/Virtual_installation_of_software
链接的文档描述了如何获得主机 fs 的“写入时复制视图”——这与执行 chroot 并不完全一样。关于如何在 umview 中实现 / 替换的确切说明如果能在我的问题的答案中得到很好的说明(如果您知道如何做到这一点,请写一个!)。
umview 必须是开源的,因为它包含在 Ubuntu 和 Debian 中 --http://packages.ubuntu.com/lucid/umview。
“限制计划”
另一种实现方式描述于http://www.cs.vu.nl/~rutger/publications/jailer.pdf,http://www.cs.vu.nl/~guido/mansion/publications/ps/secrypt07.pdf。
他们有一个更改根策略规则 CHRDIR,其效果类似于 chroot。 (“监禁政策”部分)
然而,他们可能还没有发布他们的源代码(部分基于修改后的 stracehttp://www.liacs.nl/~wichert/strace/--“实施”部分)...
乔尔迪
乔迪(http://www.eelis.net/geordi/,https://github.com/Eelis/geordi)可能会被修改,以便在被监禁的程序中对系统调用的文件参数进行所需的重写。
根
普罗特是一个现成的基于 ptrace 的工具。http://proot.me/:
chroot 等效项
要在给定的 Linux 发行版中执行命令,只需向 proot 提供来宾 rootfs 的路径,后跟所需的命令。下面的示例执行程序 cat 来打印文件的内容:
proot -r /mnt/slackware-8.0/ cat /etc/motd Welcome to Slackware Linux 8.0
如果未指定,则默认命令为 /bin/sh。因此,限制交互式 shell 及其所有子程序的最短方法是:
proot -r /mnt/slackware-8.0/ $ cat /etc/motd Welcome to Slackware Linux 8.0
基于取消共享
Linux 内核中的 user_namespaces 支持自从提出这个问题以来,已经变得更加成熟了。现在你可以像平常一样在类似chroot
的帮助下进行表演unshare
使用 unshare 模拟 chroot:
unshare --user --map-root-user --mount-proc --pid --fork
chroot ......
su - user1
答案2
你可以尝试用户模式Linux。用于构建此类内核的代码现在存在于主流源中,您可以在我链接的页面上找到(过时的)预编译版本。