Linux 操作系統原理 — Namespace 資源隔離
目錄
文章目錄
目錄
linux Namespace
linux Namespace 的類型
Linux Namespace
Linux Namespace(命名空間)是一種操作系統層級的資源隔離技術,能夠將 Linux 的全局資源,劃分為 namespace 范圍內的資源,而且不同 namespace 間的資源彼此透明,不同 namespace 里的進程無法感知到其它 namespace 里面的進程和資源。
Linux namespace 實現了 6 項資源隔離,基本上涵蓋了一個小型操作系統的運行要素,包括主機名、用戶權限、文件系統、網絡、進程號、進程間通信。Linux Namespace 是操作系統虛擬化技術(e.g. 容器)的底層實現支撐。
這 6 項資源隔離分別對應 6 種系統調用,將這些系統調用傳輸傳入 clone 函數就可以建立一個容器了。一個容器進程還可以再 clone 出一個容器進程,完成容器的嵌套。
int clone(int (*child_func)(void *), void *child_stack, int flags, void *arg);
1
通過文件 文件 /proc/[pid]/ns 可以查看指定進程運行在哪些 namespace 中:
可以看到,每項 namespace 都具有一個唯一標識,如果兩個進程指向的同一個 namespace,則表示它們同在該 namespace 下。
Linux Namespace 的類型
UTS namespace 提供了 hostname 和 domain 的隔離,這樣每個容器就擁有獨立的主機名和域名了,在網絡上就可以被視為一個獨立的節點,在容器中對 hostname 的命名不會對宿主機造成任何影響。
PID namespace 完成的是進程號的隔離,保證了容器的 init 進程是以 1 號進程來啟動的。
IPC namespace 實現了進程間通信的隔離,包括常見的幾種進程間通信機制,例如:信號量,消息隊列和共享內存。我們知道,要完成 IPC,需要申請一個全局唯一的標識符,即 IPC 標識符,所以 IPC 資源隔離主要完成的就是隔離 IPC 標識符。
Mount namespace 通過隔離文件系統的掛載點來達到對文件系統的隔離。保證了容器看到的文件系統的視圖,是容器鏡像提供的一個文件系統,也就是說它看不見宿主機上的其它文件,除了通過 -v 參數 bound 的那種模式,是可以把宿主機上面的一些目錄和文件,讓它在容器里面可見的;
Network namespace 實現了操作系統層面的網絡資源隔離,包括網絡設備接口、IPv4 和 IPv6 協議棧,IP 路由表,防火墻,/proc/net 目錄,/sys/class/net 目錄,Sockets 套接字等資源。同一個網絡設備只能位于一個 Network namespace 中,不同 namespace 中的網絡設備可以利用 veth pair 進行橋接。
User namespace 主要隔離了安全相關的標識符和屬性,包括 User ID、User Group ID、root 目錄、key 以及特殊權限。
實際上,還有第 7 個是 cgroup namespace。Docker 中用到了前六種,第 7 種 cgroup namespace 在 Docker 本身并沒有用到,但是在 runC 實現中實現了 cgroup namespace。用 cgroup namespace 帶來的一個好處是容器中看到的 cgroup 視圖是以根的形式來呈現的,這樣的話就和宿主機上面進程看到的 cgroup namespace 的一個視圖方式是相同的,另外一個好處是讓容器內部使用 cgroup 會變得更安全。
Linux 容器
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。