Linux

“命名空間文件”指向什麼樣的文件?

  • July 1, 2019

我四處/proc/*/ns尋找,發現命名空間文件看起來不熟悉:

# example from `man namespaces`
$ ls -l /proc/$$/ns
total 0
lrwxrwxrwx. 1 mtk mtk 0 Apr 28 12:46 cgroup -> cgroup:[4026531835]
lrwxrwxrwx. 1 mtk mtk 0 Apr 28 12:46 ipc -> ipc:[4026531839]
lrwxrwxrwx. 1 mtk mtk 0 Apr 28 12:46 mnt -> mnt:[4026531840]
lrwxrwxrwx. 1 mtk mtk 0 Apr 28 12:46 net -> net:[4026531969]
lrwxrwxrwx. 1 mtk mtk 0 Apr 28 12:46 pid -> pid:[4026531836]
lrwxrwxrwx. 1 mtk mtk 0 Apr 28 12:46 pid_for_children -> pid:[4026531834]
lrwxrwxrwx. 1 mtk mtk 0 Apr 28 12:46 user -> user:[4026531837]
lrwxrwxrwx. 1 mtk mtk 0 Apr 28 12:46 uts -> uts:[4026531838]

所以命名空間文件是…什麼的符號連結?帶有這個 10 位標識符的“東西”?我的意思是,我知道’一切都是文件’,但我以前從未見過這樣的文件路徑,它在哪裡?

而且,邪惡的帽子,如果我touch "/proc/$$/ns/cgroup:[4026531835]"cgroup現在將指向我的正常文件,或者它目前是什麼,會發生什麼?

這是核心使用現有的抽象來表示一種新類型的事物。在傳統的符號連結意義上,這些文件並沒有真正“指向”任何東西。這些值是命名空間的有效句柄。核心在內部使用這些資訊在其內部資料結構中查找適當的命名空間。

/proc/<pid>/fd例如,當程序具有套接字時,您會看到類似類型的事情:

lrwx------ 1 user group 64 Jun 28 14:35 3 -> 'socket:[17257]'

核心將拒絕寫入這些的嘗試。例如:

# echo hi > /proc/self/ns/ipc
bash: /proc/self/ns/ipc: Operation not permitted

此外,您不能ipc:[4026531839]在該目錄中創建名為例如 的文件 - 它位於 proc 文件系統中,因此那裡的文件/目錄只是核心狀態的抽象,核心不允許您創建新的該目錄中的文件。

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