Linux
“命名空間文件”指向什麼樣的文件?
我四處
/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 文件系統中,因此那裡的文件/目錄只是核心狀態的抽象,核心不允許您創建新的該目錄中的文件。