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