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