Str*_*Bad 5 process chroot arch-linux namespace
我正在尝试在 a 中运行 python 脚本chroot(具体来说,chroot是用arch-chroot)。python 脚本依赖于os.getpid(),但这似乎在chroot. 如果在 python 我做
import os
os.getpid()
Run Code Online (Sandbox Code Playgroud)
我得到的 PID 未在/proc/chroot 或真实根中列出。此外,我认为正确的 PID 列在/proc/chroot 或真实根中。
这个问题不是 Python 特有的。如果我在chroot
echo $$
ps -a
ls /proc
Run Code Online (Sandbox Code Playgroud)
PID 未在ps或 中列出/proc。
我究竟做错了什么?有没有办法获得正确的PID?
arch-chroot它不仅仅创建一个 chroot:它还创建一个 PID 命名空间。
\n\n\n取消共享 --fork --pid chroot "$chrootdir" "$@"
\n
顾名思义,PID 命名空间有自己的一组进程 ID,与系统的其他部分不同。这意味着命名空间内的进程无法看到命名空间外的进程(特别是无法杀死或跟踪它们),而命名空间\xc2\xb9 外部的进程则可以看到具有不同 PID 的进程。
\n\n有关命名空间的更多信息,请阅读我的摘要和Michael Kerrisk 的 LWN 系列,特别是第 3 部分:PID 命名空间和第 4 部分:有关 PID 命名空间的更多信息,以及Pavel Emelyanov 和 Kir Kolyshkin 的早期文章。如何找出特定进程的名称空间?使用“nsenter:”来监禁子进程的可靠方法也可能令人感兴趣。
\n\n如果您想从外部对命名空间中运行的进程执行操作,可以使用该nsenter实用程序;请参阅是否有命令可以切换到现有命名空间?。您还可以使用nsenterPython 包。或者您可以安排从命名空间内部执行这些操作(这可能是也可能不是一个好的解决方案,具体取决于您的体系结构和安全要求);从外部访问 chroot 中的内容(只需添加正确的目录路径前缀)比在 PID 命名空间中访问更容易。
请注意,PID 命名空间和 chroot 是独立的。如果您单独 chroot 到同一目录,则不会让您到达相同的 PID 命名空间。如果您arch-chroot在同一目录上运行两次,您最终会在同一目录中工作,但在两个不同的 PID 命名空间中。
\xc2\xb9更准确地说,在祖先命名空间中。(命名空间具有树形结构,子级被限制在父级内。)
\n