Linux Namespace

前言

前兩天在學習docker相關知識,知道docker是基於Linux Namespace來讓不同的容器在宿主機上實現隔離的,遂對Linux Namespace產生了興趣。Linux Namespace是Linux提供的一種內核級別環境隔離的方法。通過 namespace 可以讓一些進程只能看到與自己相關的一部分資源,而另外一些進程也只能看到與它們自己相關的資源,這兩撥進程根本就感覺不到對方的存在。具體的實現方式是把一個或多個進程的相關資源指定在同一個 namespace 中。

類別

類型 系統調用參數 內核版本
UTS CLONE_NEWUTS Linux 2.6.19
IPC CLONE_NEWIPC Linux 2.6.19
VFS(Mount) CLONE_NEWNS Linux 2.4.19
PID CLONE_NEWPID Linux 2.6.24
User CLONE_NEWUSER Linux 2.6.23 — Linux 3.8
Net CLONE_NEWNET Linux 2.6.24 — Linux 2.6.29

UTS Namespace

提供了主機名和域名的隔離,也就是struct utsname裏的nodename和domainname兩個字段。不同Namespace中可以擁有獨立的主機名和域名。
如果沒有這一層隔離,同一主機上不同的容器的網絡訪問就可能出問題。

IPC Namespace

對進程間通信的隔離,進程間通信常見的方法有信號量、消息隊列和共享內存。IPC Namespace主要針對的是SystemV IPC和Posix消息隊列,這些IPC機制都會用到標識符,比如用標識符來區分不同的消息隊列,IPC Namespace要達到的目標是相同的標識符在不同的Namespace中代表不同的通信介質

VFS(Mount) Namspace

Mount Namespace用來隔離文件系統的掛載點,不同Mount Namespace的進程擁有不同的掛載點,同時也擁有了不同的文件系統視圖。

PID Namespace

PID Namespace對進程PID重新標號,即不同的Namespace下的進程可以有同一個PID。內核爲所有的PID Namespace維護了一個樹狀結構,最頂層的是系統初始化創建的,被稱爲Root Namespace,由它創建的新的PID Namespace成爲它的Child namespace,原先的PID Namespace成爲新創建的Parent Namespace,這種情況下不同的PID Namespace形成一個等級體系:父節點可以看到子節點中的進程,可以通過信號對子節點的進程產生影響,反過來子節點無法看到父節點PID Namespace裏面的進程。

User Namespace

User Namespace允許Namespace間可以映射用戶和用戶組ID,這意味着一個進程在Namespace裏面的用戶和用戶組ID可以與Namespace外面的用戶和用戶組ID不同。值得一提的是,一個普通進程(Namespace外面的用戶ID非0)在Namespace裏面的用戶和用戶組ID可以爲0,換句話說這個普通進程在Namespace裏面可以擁有root特權的權限。

Net Namespace

Network Namespace主要是用來提供關於網絡資源的隔離,包括網絡設備(網卡、網橋)、IPV4或IPV6協議棧、路由表、防火牆、端口等信息,不同Namespace種可以擁有獨立的網絡資源。

Namespace與系統調用

  • clone():實現線程的系統調用,用來創建一個新的進程,並可以通過設計上述參數達到隔離。
  • unshare():使某進程脫離某個namespace
  • setns():把某進程加入到某個namespace
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章