arch-chroot 中的 PID 不正确

arch-chroot 中的 PID 不正确

我正在尝试在 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公用事业;看是否有命令可以切换到现有名称空间?。您还可以使用nsenterPython包。或者您可以安排从命名空间内部执行这些操作(这可能是也可能不是一个好的解决方案,具体取决于您的体系结构和安全要求);从外部访问 chroot 中的内容(只需添加正确的目录路径前缀)比在 PID 命名空间中访问更容易。

请注意,PID 命名空间和 chroot 是独立的。如果您单独 chroot 到同一目录,则无法访问相同的 PID 命名空间。如果您arch-chroot在同一目录上运行两次,您最终会在同一目录中工作,但在两个不同的 PID 命名空间中。

准确地说,在祖先命名空间中。 (命名空间具有树形结构,子级被限制在父级内。)

相关内容