/proc 如何与 PID 命名空间交互?

/proc 如何与 PID 命名空间交互?

我不明白命名空间如何与/proc.我假设/proc返回值基于查询它们的过程。

例如,让我们确定全局 PID 命名空间内当前进程的 PID:

$ bwrap --bind / / readlink /proc/self
6182

这对我来说很有意义。然而,当我readlink在它自己的 PID 命名空间中隔离时:

$ bwrap --bind / / --unshare-pid readlink /proc/self
6177

我得到同样的结果!要获取命名空间内的 PID,我需要添加--proc /proc

$ bwrap --bind / / --unshare-pid --proc /proc readlink /proc/self
2

但不应该/proc总是考虑阅读过程的上下文吗?为什么procfs需要额外的内容以及它与流程有何关系readlink

如果我不创建新的 PID 命名空间,则额外的内容procfs没有任何区别:

$ bwrap --bind / / --proc /proc readlink /proc/self
6179

答案1

这是命名空间的问题之一。和

bwrap --bind / / --unshare-pid readlink /proc/self

您已经创建了一个新的 PID 命名空间和一个新的挂载命名空间(因为bwrap默认情况下是这样做的),但是您显式地将外部绑定挂载/到该挂载命名空间中。结果是,在新的挂载命名空间内部,/proc与外部相同 - 尝试

bwrap --bind / / --unshare-pid ps -ef

这里描述了关键功能man pid_namespaces

文件系统/proc(在目录中)仅显示/proc/[pid]在进程的 PID 命名空间中可见的进程执行安装的,即使是/proc从其他命名空间中的进程查看文件系统。

(强调我的)。你可以看到/proc在这里记住适当的 PID 命名空间

因此,通过执行挂载的 PID 命名空间的眼睛来readlink查看,而不是通过其自己的 PID 命名空间。/proc

在新的 PID 命名空间中的分叉内重新添加--proc=/proc挂载,因此其内容反映新的 PID 命名空间。/procbwrap

相关内容