前言
Linux的核心有兩大特性Namespace和CGroup,這兩種特性可以在Linux主機上實現主機名、使用者、網路等全域性資源的隔離,也是實現網路虛擬化、容器技術的基礎。
名稱空間
Linux Namespace(名稱空間)是一種作業系統層級的資源隔離技術,能夠將 Linux 的全域性資源,劃分為 namespace 範圍內的資源,而且不同 namespace 間的資源彼此透明,不同 namespace 裡的程序無法感知到其它 namespace 裡面的程序和資源。
Namespace(名稱空間):實現六大名稱空間的隔離
Mount:根檔案系統隔離
UTS:主機名和域名隔離
IPC:容器程序間通訊隔離
USER:使用者隔離(UID對映)
PID:程序隔離
NETWORK:網路隔離
linux Namespaces機制提供一種資源隔離和虛擬化特性。PID,IPc,Network等系統資源不再是全域性性的,而是屬於某個特定的Namespace。每個namespace下的資源對於其他namespace下的資源都是不可見的。因此在作業系統層面上看,就會出現多個相同pid的程序。系統中可以同時存在兩個甚至多個程序號為0,1,2的程序由於屬於不同的namespace,所以它們之間並不衝突。而在使用者層面上只能看到屬於使用者自己namespace下的資源,例如使用ps命令只能列出自己namespace下的程序。這樣每個namespace看上去就像一個單獨的Linux系統。
這種隔離機制和 Chroot 很類似,Chroot 是把某個目錄修改為根目錄,從而無法訪問外部的內容。
Linux Namesapce 在此基礎之上,提供了對 UTS、IPC、Mount、PID、Network、User 等的隔離機制。
基本上涵蓋了一個小型作業系統的執行要素,包括主機名、使用者許可權、檔案系統、網路、程序號、程序間通訊。
CGroups(ControlGroups)
實現資源限制,限制容器內部程序可用的資源。
名稱 | 宏定義 | 隔離內容 |
---|---|---|
Cgroup | CLONE_NEWCGROUP | Cgroup root directory (since Linux 4.6) |
IPC | CLONE_NEWIPC | System V IPC, POSIX message queues (since Linux 2.6.19) |
Network | CLONE_NEWNET | Network devices, stacks, ports, etc. (since Linux 2.6.24) |
Mount | CLONE_NEWNS | Mount points (since Linux 2.4.19) |
PID | CLONE_NEWPID | Process IDs (since Linux 2.6.24) |
User | CLONE_NEWUSER | User and group IDs (started in Linux 2.6.23 and completed in Linux 3.8) |
UTS | CLONE_NEWUTS | Hostname and NIS domain name (since Linux 2.6.19) |