Linux中如何实现用户空间chroot的效果(无需root)?

Linux中如何实现用户空间chroot的效果(无需root)?

目标是在主机 Linux 系统内的移位(重新定位)发行版(其 / 不得与全局 / 一致)中安装和运行程序。这些程序不适合使用不同的 / 。

fakechroot 不是一个完整的解决方案,因为它采用库替换而不是在系统调用级别上操作(因此不适合静态链接的二进制文件)。

答案1

该解决方案可能必须基于 ptrace 或命名空间(取消共享)

基于 ptrace 的解决方案可能比基于名称空间/unshare 的解决方案效率低(但后一种技术是前沿技术,可能尚未得到很好的探索)。

基于 ptrace

UMView

至于基于 ptrced 的解决方案,感谢以下评论https://stackoverflow.com/a/1019720/94687,我发现了 UMView:

链接的文档描述了如何获得主机 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。用于构建此类内核的代码现在存在于主流源中,您可以在我链接的页面上找到(过时的)预编译版本。

相关内容