版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、操作系統(tǒng)虛擬化底層基礎(chǔ)之命名空間(namespace目錄目錄 (1背景 (2總覽 (3UTS命名空間子模塊 (3IPC命名空間子模塊 (5MNT命名空間子模塊 (7PID命名空間子模塊 (9NET命名空間子模塊 (12總結(jié) (16背景隨著公司業(yè)務(wù)的迅猛發(fā)展,大量的機(jī)器在線上業(yè)務(wù)號(hào)召下投入了服務(wù)于廣大網(wǎng)民的神圣職責(zé)。不過基于一個(gè)不完全統(tǒng)計(jì),我們公司的線上機(jī)器平均利用率20%左右,這就意味著70%左右的機(jī)器都是可回收或者復(fù)用的。出于節(jié)約機(jī)器,統(tǒng)一管理以及在線遷移的初衷,我們進(jìn)行了虛擬化計(jì)算的研究。經(jīng)過選型測(cè)試以及具體應(yīng)用場(chǎng)景的研究,我們選擇了操作系統(tǒng)虛擬化技術(shù),即LXC。(為什么選擇LXC,Ope
2、nVZ如何?Xen效果如何等等這些問題請(qǐng)參考其他文檔,本文主要討論LXC的底層實(shí)現(xiàn)技術(shù)。LXC本身不是一個(gè)具體的技術(shù),它是一個(gè)集合技術(shù)的代稱,我們可以總體上來看,LXC主要有namespace和cgroup兩大模塊構(gòu)建而成,本系列主要就是說說這兩個(gè)技術(shù),本文則專注于namespace。在我們講述具體的技術(shù)之前,先來看看容器模塊的整個(gè)狀態(tài)系統(tǒng),目前主要是IBM,google等公司的團(tuán)隊(duì)在負(fù)責(zé)維護(hù)更新。 目前container已經(jīng)被上有內(nèi)核所接納,所以不存在自己維護(hù)分支版本的問題。但是這些團(tuán)隊(duì)之間合作不是我們想象的和諧,不同利益集團(tuán)之間是有內(nèi)核的政治訴求,都想把自家的內(nèi)容扶位正房,導(dǎo)致我們?cè)倏床僮?/p>
3、系統(tǒng)虛擬化的時(shí)候會(huì)有不同項(xiàng)目博弈的事跡??傆[每一個(gè)進(jìn)程其所包含的命名空間都被抽象層一個(gè)nsproxy指針,共享同一個(gè)命名空間的進(jìn)程指向同一個(gè)指針,指針的結(jié)構(gòu)通過引用計(jì)數(shù)(count來確定使用者數(shù)目。當(dāng)一個(gè)進(jìn)程其所處的用戶空間發(fā)生變化的時(shí)候就發(fā)生分裂。通過復(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)程的用戶空間數(shù)目一致,每一個(gè)命名空間都會(huì)有對(duì)象的一個(gè)具體實(shí)例。目前Linux系統(tǒng)實(shí)現(xiàn)的命名空間子系統(tǒng)主要有U
4、TS、IPC、MNT、PID以及NET網(wǎng)絡(luò)子模塊。我們?cè)谙挛臅?huì)針對(duì)這些子模塊進(jìn)行進(jìn)一步的分析。UTS命名空間子模塊UTS相對(duì)而言是一個(gè)簡(jiǎn)單的扁平化命名空間子模塊,其不同的命名空間之間沒有層次關(guān)系。我們先來看一下UTS的數(shù)據(jù)結(jié)構(gòu)。 New_utename結(jié)構(gòu)里面就是我們通過uname a能夠看到的信息??匆幌聶C(jī)器上的輸出: 我通過紅色斜線把uname a的輸出分隔開,分別對(duì)應(yīng)上面的new_utsname的結(jié)構(gòu)體。另外內(nèi)核還把這些信息也通過proc文件系統(tǒng)導(dǎo)出,我們可以通過/proc/sys/kernel目錄里面的如下等變量(Ostype/ hostname/osrelease/ version查
5、看,當(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)用來創(chuàng)建一個(gè)UTS的命名空間,主要工作在clone_uts_ns函數(shù)里面完成。 上面講述了UTS的代碼表示,我們?cè)賮碇还芸匆幌耈TS Namespace和Kref配合使用的場(chǎng)景。 上述順序描述了ustname在容器里面的局部化以及和引用計(jì)數(shù)配合完成的對(duì)象生命周期管理。IPC命名空間子模塊IPC作為一個(gè)常見的進(jìn)程間通信工具,命名空間對(duì)他也進(jìn)行了部分支持。另外IPC也是一個(gè)較為簡(jiǎn)單的扁平化進(jìn)程間通信工具,命名空間之間不存在層級(jí)。 上面羅列的
6、主要是IPC 命名空間里面包含的元素,各個(gè)命名空間之間的關(guān)系是并列的。 我們直觀的給一個(gè)圖描述資源隔離使用概念圖。 屬于不同命名空間的進(jìn)程之間是不能訪問對(duì)方的全局資源的,這兒展示的主要是IPC 的SHM ,MSG 以及SEM ,在較新的代碼里MQueue 也可以被隔離。MNT命名空間子模塊虛擬機(jī)的一個(gè)核心功能就是完成應(yīng)用的隔離,即業(yè)務(wù)之間相互不可見。這一塊主要通過文件系統(tǒng)的視圖來完成,進(jìn)程創(chuàng)建的時(shí)候,每一個(gè)進(jìn)程都有自己的文件掛節(jié)點(diǎn)信息??匆幌陆?jīng)典的struct task_struct. 在一個(gè)系統(tǒng)啟動(dòng)的時(shí)候,0號(hào)進(jìn)程就設(shè)置好了自己所在的根目錄以及當(dāng)前目錄。在創(chuàng)建子進(jìn)程的時(shí)候,通過CLONE_F
7、S來指明父子之間的共享信息,如果設(shè)置了兩者共享同一個(gè)結(jié)構(gòu)(指針加上引用計(jì)數(shù),沒有設(shè)置標(biāo)記的話,子進(jìn)程創(chuàng)建一個(gè)新的拷貝,兩者之間互不影響。如果設(shè)置了CLONE_FS,接下來通過chroot(2, chdir(2, or umask(2的調(diào)用結(jié)果兩者之間會(huì)相互影響,反之兩者是獨(dú)立的。 下面這張圖清晰明了的刻畫了進(jìn)程內(nèi)部的文件系統(tǒng)信息以及文件描述符的位置,同時(shí)還可以看到一個(gè)文件的主要組成部分。 通過文字以及代碼描述還是比較枯燥而且不方便直觀,下面我們通過圖形的方式來看一下進(jìn)程的文件系統(tǒng)映射情況。 最初我們?cè)谙到y(tǒng)(system目錄里面創(chuàng)建了一個(gè)container目錄,然后在這個(gè)目錄里面為每一個(gè)虛擬機(jī)創(chuàng)
8、建了獨(dú)立的目錄,例如1和2(本例。在目錄1和2里面分別創(chuàng)建相應(yīng)虛擬機(jī)的根目錄文件系統(tǒng)。這樣虛擬機(jī)啟動(dòng)的時(shí)候,我們chroot到1或者2里面,看到的文件系統(tǒng)試圖就如下所示。 在這種使用方式下,虛擬機(jī)1和虛擬機(jī)2之間的文件系統(tǒng)是互不可見的,而且虛擬機(jī)也看不到除了根目錄之外的其他文件目錄。為了和系統(tǒng)或者其他虛擬機(jī)部分共享文件,我們可以映射特定目錄到虛擬機(jī)的根文件系統(tǒng),達(dá)到部分隔離以及共享的效果,下圖。 PID命名空間子模塊PID是虛擬化命名空間里面較復(fù)雜的模塊,因?yàn)榍懊娴拿臻g基本都是扁平的,沒有層次結(jié)構(gòu)。但是PID命名空間是有層次的,在高層次命名空間能夠看到所有的低層次命名空間信息,反之則不行。
9、先直觀來看看層次化的命名空間結(jié)構(gòu)以及進(jìn)程的數(shù)字變化。需要指出的是,對(duì)于命名空間里面的進(jìn)程,我們看到好像有多個(gè),其實(shí)是一一對(duì)應(yīng)的,即進(jìn)程只有一個(gè),但是在不同的命名空間里面有不同的數(shù)據(jù)表示,獲取一個(gè)進(jìn)程信息需要進(jìn)程號(hào)加上空間信息才能唯一確定一個(gè)進(jìn)程。 全局命名空間的init進(jìn)程,其中一個(gè)目的是對(duì)孤兒進(jìn)程進(jìn)行回收。Level則表明自己所處的命名空間在系統(tǒng)命名空間里面的深度,這是一個(gè)重要的標(biāo)記,因?yàn)閷哟胃叩拿臻g可以看到低級(jí)別的所有信息。系統(tǒng)的命名空間從0開始技術(shù),然后累加。命名空間的層次結(jié)構(gòu)通過parent來關(guān)聯(lián)。了解完P(guān)ID命名空間的信息后,我們?cè)賮砜纯碢ID為了支持命名空間所需要做的修改。以前
10、的PID命名空間是全局唯一的,現(xiàn)在則必須是命名空間局部化,有一個(gè)可見的命名空間就必須有一個(gè)PID變量。來看看PID的內(nèi)核表示,系統(tǒng)對(duì)于每一個(gè)PID都有一個(gè)PID結(jié)構(gòu)體來表示,但是在每一個(gè)命名空間里面的upid表示具體的數(shù)值。 上面的PID就是我們?cè)谙到y(tǒng)中內(nèi)核的表示,一個(gè)PID可能對(duì)應(yīng)多個(gè)task_struct,所以在上面的表示里面通過一個(gè)task數(shù)組來表示。接著numbers數(shù)字分別表示在不同命名空間里面可以看到的pid數(shù)值,因?yàn)閚umbers在最后一個(gè)位置,所有本質(zhì)上來說相當(dāng)于一個(gè)指針,增加命名空間的時(shí)候,再增加一個(gè)numbers即可。 上述的upid則是具體的命名空間內(nèi)數(shù)值表示,nr表示數(shù)
11、字,ns則指向關(guān)聯(lián)的命名空間。當(dāng)然系統(tǒng)的所有upid通過pid_chain掛在同一個(gè)全局鏈表里。 這張表格和上圖一起結(jié)合起來我們理解PID的管理結(jié)構(gòu)。一個(gè)task_struct通過pid_link的hlist_node掛接到struct pid的鏈表上面去。同時(shí)task_struct又是用過pid_link找到pid,通過pid遍歷tasks鏈表又能夠得到所有的任務(wù),當(dāng)然也可以讀取numbers數(shù)字獲取每一個(gè)命名空間里面的數(shù)字信息。為了在pid和upid之間轉(zhuǎn)換,系統(tǒng)提供了很多內(nèi)部轉(zhuǎn)換接口,我們首先來了解一些基本指導(dǎo)性原則。._nr(通過nr結(jié)尾的函數(shù)就是獲取以前所謂的全局PID,這個(gè)全局PI
12、D和我們?cè)谝郧跋到y(tǒng)里面所見的PID是一致的。例如pid_nr(pid就返回給定pid的全局PID數(shù)值。這些數(shù)值往往只有在本機(jī)有效,例如一些通過PID獲取進(jìn)程結(jié)構(gòu)的代碼。但是在這種情況下,保存pid結(jié)構(gòu)往往比全局PID更有意義,因?yàn)槿諴ID不能隨意遷移。._vnr(Vnr結(jié)尾的函數(shù)主要和局部pid打交道,例如一個(gè)進(jìn)程可見的局部ID。來看一個(gè)例子, task_pid_vnr(tsk就返回它能夠看到任務(wù)PID。需要注意的是,這個(gè)數(shù)字僅僅在本命名空間內(nèi)有效。._nr_ns(以nr_ns結(jié)尾的函數(shù)能夠獲取到特定命名空間課間的PID數(shù)值,如果你想得到一些任務(wù)的PID數(shù)值,你就可以通過task_pid_n
13、r_ns(tsk, current-nsproxy-pid_ns調(diào)用得到數(shù)字,接著通過find_task_by_pid_ns(pid, current-nsproxy-pid_ns反過來找到任務(wù)結(jié)構(gòu)。當(dāng)一個(gè)用戶請(qǐng)求過來的時(shí)候,基本上都是調(diào)用這組函數(shù),因?yàn)檫@種情況下一個(gè)任務(wù)可能需要得到另外一個(gè)命名空間的信息。NET命名空間子模塊NET的命名空間隔離做的工作相對(duì)而言是最多的,但是整體思路還是一致的,即把全局的資源局部化,在每一個(gè)命名空間里面保留自己的控制信息。例如在目前的內(nèi)核里面路由表,arp表,netfilter表,設(shè)備等等都已經(jīng)空間化了,其所做的后續(xù)操作都要首先關(guān)聯(lián)到特定的命名空間,然后再取出
14、里面的數(shù)據(jù)進(jìn)行后面的分析。 名空間創(chuàng)建的時(shí)候,會(huì)做一些初始化。所有系統(tǒng)定義了一個(gè)回調(diào)函數(shù),讓感興趣的模塊注冊(cè)。結(jié)構(gòu)如下: 注冊(cè)接口如下 一個(gè)新的用戶空間被創(chuàng)建的時(shí)候,注冊(cè)模塊的init結(jié)構(gòu)被創(chuàng)建。同理,一個(gè)空間銷毀的時(shí)候,exit函數(shù)也會(huì)被調(diào)用。那么現(xiàn)在有了很多命名空間,而且命名空間之間是隔離的,那么他們之間怎么通信呢。這兒需要注意的是引入了一個(gè)新的概念,就做網(wǎng)絡(luò)設(shè)備對(duì)。一個(gè)設(shè)備對(duì)即A設(shè)備接收到的時(shí)間自動(dòng)發(fā)送到B設(shè)備,反之亦然。我們先來從直觀上看一下網(wǎng)絡(luò)概念圖。 接下來的問題就是如何通信?其實(shí)可以通過二層或者三層來實(shí)現(xiàn)網(wǎng)絡(luò)轉(zhuǎn)發(fā),本質(zhì)上就是通過橋接還是路由。我們下面以橋接為例來說明數(shù)據(jù)報(bào)文是如何
15、轉(zhuǎn)發(fā)的。對(duì)于容器1來說,veth1需要配置一個(gè)IP地址,但是veth0和eth0配置在同一個(gè)橋接設(shè)備上。Veth0和veth1是網(wǎng)絡(luò)設(shè)備對(duì)。 是一個(gè)實(shí)際網(wǎng)絡(luò)環(huán)境里面的虛擬化配置,veth0和eth0是通過橋接來完成轉(zhuǎn)發(fā),但是veth0和veth1之間是通過設(shè)備對(duì)來完成數(shù)據(jù)轉(zhuǎn)發(fā),其他概念都沒有太多變化,除了增加一個(gè)獨(dú)立的命名空間,這兒我們來看看網(wǎng)絡(luò)設(shè)備對(duì)是如何工作的。創(chuàng)建過程不再討論,就是每次創(chuàng)建一對(duì),A和B的對(duì)端分別指向彼此。 創(chuàng)建完了后,彼此關(guān)聯(lián)。 我們還是來看看數(shù)據(jù)通道,他們的數(shù)據(jù)是如何透?jìng)鞯?。過 eth_type_trans 替換設(shè)備指針,接著就通過 netif_rx 送上起,設(shè)備已經(jīng)屬于一個(gè)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 英語(yǔ)話劇課的課程設(shè)計(jì)
- 薄荷種植課程設(shè)計(jì)
- 鉆井地球物理課程設(shè)計(jì)
- 香薰臘片制作課程設(shè)計(jì)
- 音樂品牌課程設(shè)計(jì)理念
- 高級(jí)路由課程設(shè)計(jì)
- 帽子和鳥窩的課程設(shè)計(jì)
- 粗銅精煉課程設(shè)計(jì)
- 防塵面具課程設(shè)計(jì)
- 網(wǎng)購(gòu)課程設(shè)計(jì)軟工
- 大型活動(dòng)聯(lián)合承辦協(xié)議
- 工程項(xiàng)目采購(gòu)與供應(yīng)鏈管理研究
- 2024年吉林高考語(yǔ)文試題及答案 (2) - 副本
- 拆除電纜線施工方案
- 搭竹架合同范本
- Neo4j介紹及實(shí)現(xiàn)原理
- 焊接材料-DIN-8555-標(biāo)準(zhǔn)
- 工程索賠真實(shí)案例范本
- 重癥醫(yī)學(xué)科運(yùn)用PDCA循環(huán)降低ICU失禁性皮炎發(fā)生率品管圈QCC持續(xù)質(zhì)量改進(jìn)成果匯報(bào)
- 個(gè)人股權(quán)證明書
- 醫(yī)院運(yùn)送工作介紹
評(píng)論
0/150
提交評(píng)論