我不明白命名空间如何与/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
这是命名空间的陷阱之一。和
您已经创建了一个新的 PID 命名空间和一个新的挂载命名空间(因为
bwrap
默认情况下会这样做),但是您明确地将外部绑定挂载/
到该挂载命名空间中。结果是,在新的挂载命名空间内部,/proc
与外部相同——尝试此处的关键功能在以下内容中进行
man pid_namespaces
了描述:(强调我的)。您可以在这里看到
/proc
记忆适当的 PID 名称空间。所以通过执行
readlink
挂载/proc
的 PID 命名空间的眼睛,而不是通过它自己的 PID 命名空间。在新的 PID 命名空间的分叉内重新添加
--proc=/proc
挂载,因此其内容反映了新的 PID 命名空间。/proc
bwrap