Linux下如何实现用户空间chroot的效果(不用root)?

imz*_*hev 6 chroot jails not-root-user virtualization

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

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

imz*_*hev 10

解决方案可能必须基于 ptrace 或namespaces (unshare)

基于 ptrace 的解决方案可能比基于命名空间/非共享的解决方案效率低(但后一种技术是尖端技术,可能没有很好地探索路径)。

基于ptrace的

UMView

至于基于 ptrced 的解决方案,感谢/sf/answers/71380431/上的评论,我发现了 UMView:

链接的文档描述了如何获得主机 fs 的“写时复制视图”——这与执行 chroot 并不完全一样。关于如何在 umview 中实现 /-substitution 的确切说明会很好地回答我的问题(如果你知道如何做到这一点,请写一篇!)。

UM视图必须是开源的,因为它包含在Ubuntu和Debian - http://packages.ubuntu.com/lucid/umview

“限制程序”

另一种实现中描述http://www.cs.vu.nl/~rutger/publications/jailer.pdfhttp://www.cs.vu.nl/~guido/mansion/publications/ps/secrypt07.pdf .

他们有一个 change-root-ing 策略规则,CHRDIR,其效果类似于 chroot。(“监禁政策”部分)

但是,他们可能还没有发布他们的源代码(部分基于修改后的 strace http://www.liacs.nl/~wichert/strace/—— “实现”部分)......

乔迪

Geordi ( http://www.eelis.net/geordi/ , https://github.com/Eelis/geordi ) 可能会被修改,以便在被监禁的程序中将文件参数重写为系统调用。

PRoot是一个随时可用的基于 ptrace 的工具。http://proot.me/ :

chroot 等价物

要在给定的 Linux 发行版中执行命令,只需为 proot 提供来宾 rootfs 的路径,后跟所需的命令。下面的例子执行程序 cat 来打印文件的内容:

proot -r /mnt/slackware-8.0/ cat /etc/motd

Welcome to Slackware Linux 8.0
Run Code Online (Sandbox Code Playgroud)

当没有指定时,默认命令是 /bin/sh。因此,限制交互式 shell 及其所有子程序的最短方法是:

proot -r /mnt/slackware-8.0/

$ cat /etc/motd
Welcome to Slackware Linux 8.0
Run Code Online (Sandbox Code Playgroud)

基于非共享

自从提出这个问题以来,Linux 内核中的 user_namespaces 支持变得更加成熟。现在,您可以在使用 unshare 模拟 chroot 中chrootunshare类似帮助下正常执行 a :

unshare --user --map-root-user --mount-proc --pid --fork
chroot ......
su - user1
Run Code Online (Sandbox Code Playgroud)

  • @HaukeLaging 这是[鼓励](http://meta.stackexchange.com/questions/17463/can-i-answer-my-own-questions-even-those-where-i-knew-the-answer-before-asking )如果您认为该信息对其他人有用 (2认同)