Linux

/proc 如何與 PID 命名空間互動?

  • June 23, 2022

我不明白命名空間如何與/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

這是命名空間的陷阱之一。和

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

您已經創建了一個新的 PID 命名空間和一個新的掛載命名空間(因為bwrap預設情況下會這樣做),但是您明確地將外部綁定掛載/到該掛載命名空間中。結果是,在新的掛載命名空間內部,/proc與外部相同——嘗試

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

此處的關鍵功能在以下內容中進行man pid_namespaces了描述:

文件/proc系統(在目錄中)僅顯示在執行 mount/proc/[pid]的程序的 PID 命名空間中可見的程序,即使文件系統是從其他命名空間中的程序查看的。/proc

(強調我的)。

所以通過執行readlink掛載/proc的 PID 命名空間的眼睛,而不是通過它自己的 PID 命名空間。

在新的 PID 命名空間的分叉內重新添加--proc=/proc掛載,因此其內容反映了新的 PID 命名空間。/proc``bwrap

引用自:https://unix.stackexchange.com/questions/707212