http://man7.org/linux/man-pages/man2/setns.2.html
int setns(int fd, int nstype);
Given a file descriptor referring to a namespace, reassociate the calling thread with that namespace.
當前線程切到fd對應的namespace,並且這個線程上下文中創建的新線程也在這個namespace。
-
fd
:要加入的 namespace 的文件描述符,一般為/proc/[pid]/ns
下某個對應類型 namespace 的軟鏈接; -
nstype
:調用進程想要加入的 namesapce 的類型,其類型對應上文的表格中的 7 種 Namespace 類型:0
:允許加入任何類型的 namespace;CLONE_NEWCGROUP
:fd
必須指向一個 cgroup 的 namespace;CLONE_NEWIPC
:fd
必須指向一個 IPC 的 namespace;CLONE_NEWNET
:fd
必須指向一個 network 的 namespace;CLONE_NEWNS
:fd
必須指向一個 mount 的 namespace;CLONE_NEWPID
:fd
必須指向一個 pid 的 namespace;CLONE_NEWUSER
:fd
必須指向一個 user 的 namespace;CLONE_NEWUTS
:fd
必須指向一個 UTS 的 namespace;
/proc
目錄與 Namespace
除了 3 個 API 之外,還需要關注 /proc
目錄。
自 Linux 3.8 開始,用戶就可以在 /proc/[pid]/ns
目錄下看到指向不同 namespace 號的文件,如:
1 |
# ls -l /proc/$$/ns |
每一個進程在其對應的 /proc/[pid]/ns
下都有其 namespace 信息,該目錄下每一個文件都是一個軟鏈接,setns()
可以通過打開對應進程下的 ns 目錄下的軟鏈接文件來加入到對應的 namespace 中。
該目錄下的每個軟鏈接的內容其實是一串字符,由 namespace 類型和 inode number 組成:
1 |
# readlink /proc/$$/ns/uts |
且滿足以下幾個條件:
-
若幾個進程中對應 namespace 軟鏈接內容一致,則這幾個進程同屬於同一個 namespace;
-
即使 namespace 中的進程全部終結了,只要其軟鏈接文件一直處於 open 狀態,則 namespace 將一直存在;
參考:https://zhengyinyong.com/introduction-to-linux-namespace.html