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

Geo*_*lly 8 linux proc namespace

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

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

$ bwrap --bind / / readlink /proc/self
6182
Run Code Online (Sandbox Code Playgroud)

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

$ bwrap --bind / / --unshare-pid readlink /proc/self
6177
Run Code Online (Sandbox Code Playgroud)

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

$ bwrap --bind / / --unshare-pid --proc /proc readlink /proc/self
2
Run Code Online (Sandbox Code Playgroud)

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

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

$ bwrap --bind / / --proc /proc readlink /proc/self
6179
Run Code Online (Sandbox Code Playgroud)

Ste*_*itt 6

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

\n
bwrap --bind / / --unshare-pid readlink /proc/self\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
bwrap --bind / / --unshare-pid ps -ef\n
Run Code Online (Sandbox Code Playgroud)\n

这里的关键功能描述如下man pid_namespaces

\n
\n

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

\n
\n

(强调我的)。您可以在此处看到/proc记住适当的 PID 命名空间

\n

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

\n

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

\n