为什么 ps 显示新 pid 命名空间中的所有进程?

Why does ps show all processes in a new pid namespace?

如果我使用 unshare 创建一个新的 PID 命名空间

sudo unshare -pf /bin/sh

和运行 ps ux,

# ps ux | head 
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1 160536  9968 ?        Ss   11:37   0:18 /sbin/init splash
root         2  0.0  0.0      0     0 ?        S    11:37   0:00 [kthreadd]
root         4  0.0  0.0      0     0 ?        I<   11:37   0:00 [kworker/0:0H]
root         6  0.0  0.0      0     0 ?        I<   11:37   0:00 [mm_percpu_wq]
root         7  0.0  0.0      0     0 ?        S    11:37   0:00 [ksoftirqd/0]
root         8  0.1  0.0      0     0 ?        I    11:37   1:07 [rcu_sched]
root         9  0.0  0.0      0     0 ?        I    11:37   0:00 [rcu_bh]
root        10  0.0  0.0      0     0 ?        S    11:37   0:00 [migration/0]
root        11  0.0  0.0      0     0 ?        S    11:37   0:00 [watchdog/0]

它显示所有正在 运行ning 的进程,包括根命名空间中的进程。 但是,新命名空间中的当前进程的 PID 为 1,并且与 ps.

的输出中的 PID 1 不是同一个进程
# echo $$
1

不应该隔离新命名空间中的进程吗?

我不能给你一个很好的答案,但关键是当你输入 到一个新的 pid 名称space 你同时留在同一个安装名称space。

command ps 使用 /proc 获取统计信息。 /proc 仍然有点相同或几乎相同,因此 ps 读取 /proc 并查看有关主机 pid 名称的所有信息 space。为了获得理想的情况,您不仅需要创建 pid 名称space,还需要创建新的挂载名称space。在这种情况下 ps 将不会显示任何 "extra" 信息。

好消息,当您使用新的 pid 名称space 时,您无法终止主机名 space 中的任何进程,尽管您看到了。您可以在此处找到更好的解释 - https://josephmuia.ca/2018-09-19-ps-proc-and-the-pid-namespace/