資源描述:
《操作系統(tǒng)虛擬化底層基礎(chǔ)之命名空間(namespace)》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫(kù)。
1、操作系統(tǒng)虛擬化底層基礎(chǔ)之命名空間(namespace)黎潤(rùn)(yijunzhu@qq.com)目錄背景2總覽2UTS命名空間子模塊3IPC命名空間子模塊5MNT命名空間子模塊6PID命名空間子模塊8NET命名空間子模塊11總結(jié)15背景隨著公司業(yè)務(wù)的迅猛發(fā)展,大量的機(jī)器在線上業(yè)務(wù)號(hào)召下投入了服務(wù)于廣大網(wǎng)民的神圣職責(zé)。不過(guò)基于一個(gè)不完全統(tǒng)計(jì),我們公司的線上機(jī)器平均利用率20%左右,這就意味著70%左右的機(jī)器都是可回收或者復(fù)用的。出于節(jié)約機(jī)器,統(tǒng)一管理以及在線遷移的初衷,我們進(jìn)行了虛擬化計(jì)算的研究。經(jīng)過(guò)選型測(cè)試以及具體應(yīng)用場(chǎng)景的研究,我們選擇了操作系統(tǒng)虛擬化技術(shù),即LXC。(
2、為什么選擇LXC,OpenVZ如何?Xen效果如何等等這些問(wèn)題請(qǐng)參考其他文檔,本文主要討論LXC的底層實(shí)現(xiàn)技術(shù))。LXC本身不是一個(gè)具體的技術(shù),它是一個(gè)集合技術(shù)的代稱(chēng),我們可以總體上來(lái)看,LXC主要有namespace和cgroup兩大模塊構(gòu)建而成,本系列主要就是說(shuō)說(shuō)這兩個(gè)技術(shù),本文則專(zhuān)注于namespace。在我們講述具體的技術(shù)之前,先來(lái)看看容器模塊的整個(gè)狀態(tài)系統(tǒng),目前主要是IBM,google等公司的團(tuán)隊(duì)在負(fù)責(zé)維護(hù)更新。目前container已經(jīng)被上有內(nèi)核所接納,所以不存在自己維護(hù)分支版本的問(wèn)題。但是這些團(tuán)隊(duì)之間合作不是我們想象的和諧,不同利益集團(tuán)之間是有內(nèi)核的政
3、治訴求,都想把自家的內(nèi)容扶位正房,導(dǎo)致我們?cè)倏床僮飨到y(tǒng)虛擬化的時(shí)候會(huì)有不同項(xiàng)目博弈的事跡??傆[每一個(gè)進(jìn)程其所包含的命名空間都被抽象層一個(gè)nsproxy指針,共享同一個(gè)命名空間的進(jìn)程指向同一個(gè)指針,指針的結(jié)構(gòu)通過(guò)引用計(jì)數(shù)(count)來(lái)確定使用者數(shù)目。當(dāng)一個(gè)進(jìn)程其所處的用戶(hù)空間發(fā)生變化的時(shí)候就發(fā)生分裂。通過(guò)復(fù)制一份老的命名空間數(shù)據(jù)結(jié)構(gòu),然后做一些簡(jiǎn)單的修改,接著賦值給相應(yīng)的進(jìn)程??戳松厦娴臄?shù)據(jù)結(jié)構(gòu),我們就會(huì)基本明白,命名空間本身只是一個(gè)框架,需要其他實(shí)行虛擬化的子系統(tǒng)實(shí)現(xiàn)自己的命名空間。這些子系統(tǒng)的對(duì)象就不再是全局維護(hù)的一份結(jié)構(gòu)了,而是和進(jìn)程的用戶(hù)空間數(shù)目一致,每一個(gè)命
4、名空間都會(huì)有對(duì)象的一個(gè)具體實(shí)例。目前Linux系統(tǒng)實(shí)現(xiàn)的命名空間子系統(tǒng)主要有UTS、IPC、MNT、PID以及NET網(wǎng)絡(luò)子模塊。我們?cè)谙挛臅?huì)針對(duì)這些子模塊進(jìn)行進(jìn)一步的分析。UTS命名空間子模塊UTS相對(duì)而言是一個(gè)簡(jiǎn)單的扁平化命名空間子模塊,其不同的命名空間之間沒(méi)有層次關(guān)系。我們先來(lái)看一下UTS的數(shù)據(jù)結(jié)構(gòu)。New_utename結(jié)構(gòu)里面就是我們通過(guò)uname–a能夠看到的信息??匆幌聶C(jī)器上的輸出:我通過(guò)紅色斜線把uname–a的輸出分隔開(kāi),分別對(duì)應(yīng)上面的new_utsname的結(jié)構(gòu)體。另外內(nèi)核還把這些信息也通過(guò)proc文件系統(tǒng)導(dǎo)出,我們可以通過(guò)/proc/sys/ker
5、nel目錄里面的如下等變量(Ostype/hostname/osrelease/version)查看,當(dāng)然這些變量的值也是可以更改的。初始的時(shí)候,系統(tǒng)默認(rèn)構(gòu)造了一個(gè)UTS結(jié)構(gòu),他的值分別如下所述。當(dāng)一個(gè)新的命名空間創(chuàng)建的時(shí)候,copy_utsname會(huì)被調(diào)用來(lái)創(chuàng)建一個(gè)UTS的命名空間,主要工作在clone_uts_ns函數(shù)里面完成。上面講述了UTS的代碼表示,我們?cè)賮?lái)只管看一下UTSNamespace和Kref配合使用的場(chǎng)景。上述順序描述了ustname在容器里面的局部化以及和引用計(jì)數(shù)配合完成的對(duì)象生命周期管理。IPC命名空間子模塊IPC作為一個(gè)常見(jiàn)的進(jìn)程間通信工具,
6、命名空間對(duì)他也進(jìn)行了部分支持。另外IPC也是一個(gè)較為簡(jiǎn)單的扁平化進(jìn)程間通信工具,命名空間之間不存在層級(jí)。上面羅列的主要是IPC命名空間里面包含的元素,各個(gè)命名空間之間的關(guān)系是并列的?!璉PCNamespaceIPCNamespaceIPCNamespace……NSProxyNSProxy我們直觀的給一個(gè)圖描述資源隔離使用概念圖。屬于不同命名空間的進(jìn)程之間是不能訪問(wèn)對(duì)方的全局資源的,這兒展示的主要是IPC的SHM,MSG以及SEM,在較新的代碼里MQueue也可以被隔離。MNT命名空間子模塊虛擬機(jī)的一個(gè)核心功能就是完成應(yīng)用的隔離,即業(yè)務(wù)之間相互不可見(jiàn)。這一塊主要通過(guò)文
7、件系統(tǒng)的視圖來(lái)完成,進(jìn)程創(chuàng)建的時(shí)候,每一個(gè)進(jìn)程都有自己的文件掛節(jié)點(diǎn)信息??匆幌陆?jīng)典的structtask_struct.在一個(gè)系統(tǒng)啟動(dòng)的時(shí)候,0號(hào)進(jìn)程就設(shè)置好了自己所在的根目錄以及當(dāng)前目錄。在創(chuàng)建子進(jìn)程的時(shí)候,通過(guò)CLONE_FS來(lái)指明父子之間的共享信息,如果設(shè)置了兩者共享同一個(gè)結(jié)構(gòu)(指針加上引用計(jì)數(shù)),沒(méi)有設(shè)置標(biāo)記的話,子進(jìn)程創(chuàng)建一個(gè)新的拷貝,兩者之間互不影響。如果設(shè)置了CLONE_FS,接下來(lái)通過(guò)chroot(2),chdir(2),orumask(2)的調(diào)用結(jié)果兩者之間會(huì)相互影響,反之兩者是獨(dú)立的。下面這張圖清晰明了的刻畫(huà)了進(jìn)程內(nèi)部的文件系統(tǒng)信