我不明白命名空间如何与/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 命名空间。/proc
bwrap