胡浩
摘 要: Linux實現了六種不同類型的名字空間。每個名字空間的目的是將特定的全局系統(tǒng)資源封裝在抽象中,使名字空間中的進程擁有全局資源的獨立實例。名字空間的總體目標是支持基于容器的輕量級的虛擬化工具,它為一組進程提供了一種錯覺,認為它們是操作系統(tǒng)上唯一的進程。
關鍵詞: 名字空間
【中圖分類號】 TP393.08 【文獻標識碼】 A【文章編號】 2236-1879(2018)14-0013-01
1.MNT名字空間
早期的Linux就實現了MNT名字空間,MNT名字空間用于隔離一組進程所看到的文件系統(tǒng)掛載點集。不同MNT名字空間中的進程可以有不同的文件系統(tǒng)層次結構視圖。這使得不同的容器擁有不同的文件系統(tǒng)層次結構視圖,添加了MNT名字空間后,mount()和umount()系統(tǒng)調用只對調用進程關聯的MNT名字空間進行操作【1】,而不是在操作系統(tǒng)上所有進程可見的全局掛載點集合上進行操作。
MNT名字空間的一種用途是創(chuàng)建類似于chroot Jails的環(huán)境。但是,與使用chroot()系統(tǒng)調用相比,MNT名字空間是一個更安全和靈活的工具,例如,可以在主從關系中設置單獨的MNT名字空間,以便掛載事件自動從一個名字空間傳播到另一個名字空間,安裝在主名字空間中的硬件設備將會自動出現在其他從名字空間中。這對于多容器之間共享設備提供了可能。
2.UTS名字空間
UTS名字空間隔離了主機名和域名,通過sethostname()和setdomainname()系統(tǒng)調用可以改變主機名和域名。在容器的上下文中,UTS名字空間允許每個容器都有自己的主機名和域名【1】,這對于初始化和配置腳本非常有用,這些腳本針對不同的主機名和域名進行不同的操作。通過主機名和域名的隔離,一臺主機中的多個容器在網絡上擁有唯一的主機名和域名。
3.IPC名字空間
隔離某些進程間通信(IPC)資源,包括SystemV IPC對象和POSIX消息隊列。每個IPC名字空間都有自己的SystemV IPC標識符集和自己的POSIX消息隊列。由于IPC對象是文件系統(tǒng)中的特殊文件【1】,無法通過文件系統(tǒng)的路徑名稱標識,這就意味無法通過MNT名字空間來隔離IPC對象。
4.PID名字空間
PID名字空間隔離進程ID的編號空間。不同PID名字空間中的進程可以具有相同的PID。PID名字空間的主要優(yōu)點之一是可以在主機之間遷移容器,同時為容器中的進程保留已有的進程ID。顯然,容器的跨主機遷移使得容器可以在網絡任何位置的任何主機上執(zhí)行,而不用PID的變換【2】。PID名字空間還允許每個容器都有自己的名字空間。容器中,PID為1的進程是一種特殊進程,它可以fork()出其他的子進程,這些子進程繼承了父進程的名字空間,PID為1的進程還管理各種系統(tǒng)初始化任務,并在終止時捕獲孤立的子進程,從功能上看,PID為1的進程非常類似于Linux INIT進程【3】,但它在容器中的進程名不一定是INIT。
從PID名字空間的角度來看,每個進程有兩個PID:名字空間內的PID和主機系統(tǒng)上初始PID名字空間中的PID。PID名字空間可以嵌套:進程將對層次結構的每個層(通常稱為Level)都有一個PID【1】,從其所在的PID名字空間開始到根PID名字空間。一個進程只能看到兩類進程,一類是本進程對應的PID名字空間中的進程,另一類是本進程對應的PID名字空間之下的名字空間中的進程。
5.網絡名字空間
網絡名字空間提供與網絡相關的系統(tǒng)資源隔離。因此,每個網絡名字空間都有自己的網絡設備、IP地址、IP路由表、/proc/net目錄、端口號等【1】。
從網絡的角度上看,網絡名字空間使容器實用化:每個容器可以有自己虛擬的網絡設備和自己的應用程序,這些應用程序綁定到每個名字空間中的端口空間;主機系統(tǒng)中可以配置與網絡名字空間相關聯的路由,這些路由可以將網絡數據包轉發(fā)到與容器相關聯的正確的網絡設備上。因此,在同一個主機系統(tǒng)上部署多個容器化的Web服務器是可能的,每個服務器都綁定到其容器網絡名字空間中的80端口。
6.用戶名字空間
用戶名字空間隔離用戶和組ID編號空間。換句話說,進程的用戶和組ID可以在用戶名字空間內和外部不同。一個進程可以在用戶名字空間之外有一個正常的非特權用戶ID,同時在名字空間中卻是root用戶(用戶ID為0)。這意味著該進程對用戶名字空間內的操作具有完全的root權限,但對于名字空間外的操作則不具有特權。
非特權進程可以創(chuàng)建用戶名字空間,一個本來沒有特權的進程可以在用戶名字空間內持有root權限【3】,所以非特權應用程序現在可以使用root權限對應的功能。顯然潛在的安全問題在未來仍有待發(fā)現和修復。
結束語
名字空間的概念已經擴展為通用的框架,用于隔離系統(tǒng)的全局資源。名字空間以容器的形式為一個完整的輕量級虛擬化系統(tǒng)提供了基礎。隨著原生的輕量級虛擬化系統(tǒng)將逐步取代重量級的虛擬機,Linux名字空間將會發(fā)揮更大的作用。
參考文獻
[1] 《深入Linux內核架構》 郭旭譯 人民郵電出版社 2010年6月第一版
[2] 《Docker容器與容器云》 浙江大學SEL實驗室 人民郵電出版社 2016年10月第二版
[3] 《Docker進階與實戰(zhàn)》 華為Docker實踐小組 機械工業(yè)出版社 2016年7月第一版