setns 切換命名空間,/proc 目錄與 Namespace


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_NEWCGROUPfd 必須指向一個 cgroup 的 namespace;
    • CLONE_NEWIPCfd 必須指向一個 IPC 的 namespace;
    • CLONE_NEWNETfd 必須指向一個 network 的 namespace;
    • CLONE_NEWNSfd 必須指向一個 mount 的 namespace;
    • CLONE_NEWPIDfd 必須指向一個 pid 的 namespace;
    • CLONE_NEWUSERfd 必須指向一個 user 的 namespace;
    • CLONE_NEWUTSfd 必須指向一個 UTS 的 namespace;

 

/proc 目錄與 Namespace

除了 3 個 API 之外,還需要關注 /proc 目錄。

自 Linux 3.8 開始,用戶就可以在 /proc/[pid]/ns 目錄下看到指向不同 namespace 號的文件,如:

1
2
3
4
5
6
7
8
9
10
# ls -l /proc/$$/ns
total 0
lrwxrwxrwx 1 root root 0 Apr 14 13:26 cgroup -> cgroup:[4026531835]
lrwxrwxrwx 1 root root 0 Apr 14 13:26 ipc -> ipc:[4026531839]
lrwxrwxrwx 1 root root 0 Apr 14 13:26 mnt -> mnt:[4026531840]
lrwxrwxrwx 1 root root 0 Apr 14 13:26 net -> net:[4026531993]
lrwxrwxrwx 1 root root 0 Apr 14 13:26 pid -> pid:[4026531836]
lrwxrwxrwx 1 root root 0 Apr 14 13:26 pid_for_children -> pid:[4026531836]
lrwxrwxrwx 1 root root 0 Apr 14 13:26 user -> user:[4026531837]
lrwxrwxrwx 1 root root 0 Apr 14 13:26 uts -> uts:[4026531838]

每一個進程在其對應的 /proc/[pid]/ns 下都有其 namespace 信息,該目錄下每一個文件都是一個軟鏈接,setns() 可以通過打開對應進程下的 ns 目錄下的軟鏈接文件來加入到對應的 namespace 中。

該目錄下的每個軟鏈接的內容其實是一串字符,由 namespace 類型和 inode number 組成:

1
2
# readlink /proc/$$/ns/uts
uts:[4026531838]

且滿足以下幾個條件:

  • 若幾個進程中對應 namespace 軟鏈接內容一致,則這幾個進程同屬於同一個 namespace;

  • 即使 namespace 中的進程全部終結了,只要其軟鏈接文件一直處於 open 狀態,則 namespace 將一直存在;

 

參考:https://zhengyinyong.com/introduction-to-linux-namespace.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM