操作系統(tǒng)虛擬化底層基礎(chǔ)之命名空間(namespace)_第1頁(yè)
操作系統(tǒng)虛擬化底層基礎(chǔ)之命名空間(namespace)_第2頁(yè)
操作系統(tǒng)虛擬化底層基礎(chǔ)之命名空間(namespace)_第3頁(yè)
操作系統(tǒng)虛擬化底層基礎(chǔ)之命名空間(namespace)_第4頁(yè)
操作系統(tǒng)虛擬化底層基礎(chǔ)之命名空間(namespace)_第5頁(yè)
已閱讀5頁(yè),還剩15頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、總結(jié)總結(jié)16總結(jié)總結(jié)16操作系統(tǒng)虛擬化底層基礎(chǔ)之命名空間(namespace)黎潤(rùn)(yijun HYPERLINK mailto:zhuzhu)目錄TOC o 1-5 h z目錄1 HYPERLINK l bookmark2背景2 HYPERLINK l bookmark4總覽3 HYPERLINK l bookmark6UTS命名空間子模塊3 HYPERLINK l bookmark8IPC命名空間子模塊5 HYPERLINK l bookmark10MNT命名空間子模塊7 HYPERLINK l bookmark12PID命名空間子模塊9 HYPERLINK l bookmark14NET

2、命名空間子模塊12背景隨著公司業(yè)務(wù)的迅猛發(fā)展,大量的機(jī)器在線上業(yè)務(wù)號(hào)召下投入了服務(wù)于廣大網(wǎng)民的神圣職責(zé)。不過(guò)基于一個(gè)不完全統(tǒng)計(jì),我們公司的線上機(jī)器平均2利0用%左率右,這就意味著70%左右的機(jī)器都是可回收或者復(fù)用的。出于節(jié)約機(jī)器,統(tǒng)一管理以及在線遷移的初衷,我們進(jìn)行了虛擬化計(jì)算的研究。經(jīng)過(guò)選型測(cè)試以及具體應(yīng)用場(chǎng)景的研究,我們選擇了操作系統(tǒng)虛擬化技術(shù),即LXC。(為什么選擇LXC,OpenVZ如何?Xen效果如何等等這些問(wèn)題請(qǐng)參考其他文檔,本文主要討論LXC的底層實(shí)現(xiàn)技術(shù))。LXC本身不是一個(gè)具體的技術(shù),它是一個(gè)集合技術(shù)的代稱(chēng),我們可以總體上來(lái)看,LXC主要有namespace和cgroup兩大

3、模塊構(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ù)更新。IBMContainers%A7=Mainline(LinusTorvald)Netdev(DaveMiller-mm(AndrewMarton)LinuxNetworxOpenVZLinux-VserverIBMContainers%A7=Mainline(LinusTorvald)Netdev(DaveMiller-mm(AndrewMarton)LinuxNetworxOpenVZLinux-Vse

4、rverGnnaleOthers目前container已經(jīng)被上有內(nèi)核所接納,所以不存在自己維護(hù)分支版本的問(wèn)題。但是這些團(tuán)隊(duì)之間合作不是我們想象的和諧,不同利益集團(tuán)之間是有內(nèi)核的政治訴求,都想把自家的內(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ì)基本明白,命名空

5、間本身只是一個(gè)框架,需要其他實(shí)行虛擬化的子系統(tǒng)實(shí)現(xiàn)自己的命名空間。這些子系統(tǒng)的對(duì)象就不再是全局維護(hù)的一份結(jié)構(gòu)了,而是和進(jìn)程的用戶(hù)空間數(shù)目一致,每一個(gè)命名空間都會(huì)有對(duì)象的一個(gè)具體實(shí)例。目前Linux系統(tǒng)實(shí)現(xiàn)的命名空間子系統(tǒng)主要有UTSIPCMNTPID以及NET網(wǎng)子模塊。我們?cè)谙挛臅?huì)針對(duì)這些子模塊進(jìn)行進(jìn)一步的分析。UTS命名空間子模塊UTS而是一個(gè)簡(jiǎn)單的平化命名空間子模塊,其不同的命名空間之間有層系。我們先來(lái)看一下UTS的數(shù)據(jù)結(jié)構(gòu)。New_utename結(jié)構(gòu)就是我們通過(guò)uname-a看的。看一下機(jī)器上的出:LmuX4362.6.30-TENCENT64-10031A55IV1PMen川1吁1了:

6、20:口C5T201D/X8564kB5&4Lmu我通過(guò)線把uname-的出分,分應(yīng)上的new_utsname的結(jié)構(gòu)體。內(nèi)核把這些通過(guò)proc文系統(tǒng)導(dǎo)出,我們可以通過(guò)/proc/sys/kernel目錄的如下等變量(Ostype/hostname/osrelease/version看,當(dāng)然這些變量的也是可以更改的。初的時(shí)候,系統(tǒng)構(gòu)了一個(gè)UTS結(jié)構(gòu),他的分如下所述。structutsnamespaceinitutsns=I+J.kref=+J7WgL.refcaunt=ATOMIICINlTOk.n日m電=+1.svsname=UTSSYSNAME,nc-dename=UTSNODENAME.+

7、J.release=UTS_RELEASE,.version=UTS_VER5ION沖.machine=UTS_MACHINE,.d&mainname=UTSDOMAIFJNAME7mj當(dāng)一個(gè)新的命名空間建的時(shí)候,copy_utsname會(huì)被用來(lái)建一個(gè)UTS的命名空間,主要作在clone_uts_ns數(shù)完成。上講述了UTS的代,我們?cè)賮?lái)管看一下上講述了UTS的代,我們?cè)賮?lái)管看一下UTSNamespac和Kref合使用的場(chǎng)景。上述述了ustname在容器的化以及和弓I用計(jì)數(shù)合完成的象生命管理。IPC命名空間子模塊ipcipc作為一個(gè)的進(jìn)程間通具,命名空間他進(jìn)行了分支ipc個(gè)較為簡(jiǎn)單的扁平化進(jìn)程間

8、通信工具,命名空間之間不存在層級(jí)。上列的主要是IPC命名空間包含的,個(gè)命名空間之間的系是列的。我們直觀的給一個(gè)圖描述資源隔離使用屬于不同命名空間的進(jìn)程之間是不能訪問(wèn)對(duì)方的全局資源的,這兒展示的主要是IPC的SHM,MSG以及SEM,在新的代MQueue可以被。mnt命名空間子模塊虛擬機(jī)的一個(gè)核心功能就是完成應(yīng)用的隔離,即業(yè)務(wù)之間相互不可見(jiàn)。這一塊主要通過(guò)文件系統(tǒng)的視圖來(lái)完成,進(jìn)程創(chuàng)建的時(shí)候,每一個(gè)進(jìn)程都有自己的文件掛節(jié)點(diǎn)信息??聪陆?jīng)的structtask_struct.5tructta5kstruct尸當(dāng)前進(jìn)程的文件系統(tǒng)信息,包括根目錄以反當(dāng)前用戶(hù)目錄打Astructfs5tuct*也艸嚴(yán)已經(jīng)

9、打開(kāi)的文件列表”中structfles5trjct=l:fles-+Jmmw嚴(yán)m(xù)r產(chǎn)命容空間弓中structnsproxy*nsprosv:+jstructfs或ud:Winitusers;1rwlock:locki+J宀宀intumask:inifrtexec:stru匚tpathroot,pwdj+J在個(gè)系統(tǒng)啟動(dòng)的時(shí)候,0號(hào)進(jìn)程就設(shè)置好了自己所在的根目錄以及當(dāng)前目錄。在創(chuàng)建子進(jìn)程的時(shí)候,通過(guò)CLONE_FS來(lái)指子之間的共享,如果了兩者共享同一個(gè)結(jié)構(gòu)(指針加上引用計(jì)數(shù)),沒(méi)有設(shè)置標(biāo)記的話,子進(jìn)程創(chuàng)建個(gè)新的拷貝,兩者之間互不。如果了CLONE_FS,接下來(lái)通過(guò)chroot(2),chdir(2

10、),oumask(2)的用結(jié)果兩者之間會(huì),之兩者是的。下面這了的刻畫(huà)了進(jìn)程內(nèi)部的文件系統(tǒng)信息以及文件描述符的位置,同時(shí)下面這了的刻畫(huà)了進(jìn)程內(nèi)部的文件系統(tǒng)信息以及文件描述符的位置,同時(shí)可以看到一個(gè)文件的主要組成部分。下面我們通過(guò)而且不通過(guò)文字以及代碼描述還是的方式來(lái)看可以看到一個(gè)文件的主要組成部分。下面我們通過(guò)而且不通過(guò)文字以及代碼描述還是的方式來(lái)看下進(jìn)程的文件系統(tǒng)初我們?cè)谙到y(tǒng)(system)目錄建了一個(gè)container目錄,然后在這個(gè)目錄面為每一個(gè)虛擬機(jī)創(chuàng)建了獨(dú)立的目錄,例如1和2(本例)。在目錄1和2里面分別創(chuàng)建應(yīng)虛擬機(jī)的目錄文系統(tǒng)。這虛擬機(jī)的時(shí)候,我們chroot1或者2,看到的文件系統(tǒng)

11、試圖就如下所示。在這種使用方式下,虛擬機(jī)1和虛擬機(jī)在這種使用方式下,虛擬機(jī)1和虛擬機(jī)2之間的文件系統(tǒng)是互不可見(jiàn)的,而且虛擬機(jī)也看不到除了根目錄之外的其他文件目錄。為了和系統(tǒng)或者其他虛擬機(jī)部分共享文件,我們可以映射特定目錄到虛擬機(jī)的根文件系統(tǒng),達(dá)到部分隔離以及共享的效果,下圖。PID命名空間子模塊PID是虛擬化命名空間PID是虛擬化命名空間復(fù)雜的模塊,因?yàn)榍懊娴拿臻g基本都是扁平的,個(gè)命名空間的個(gè)命名空間的upid具體的數(shù)有層結(jié)構(gòu)。但是PID命名空間是有層的,在層命名空間看所有的層命名空間信息,反之則不行。先直觀來(lái)看看層次化的命名空間結(jié)構(gòu)以及進(jìn)程的數(shù)字變化。需要指出的是,對(duì)于命名空間里面的進(jìn)程

12、,我們看到好像有多個(gè),其實(shí)是一一對(duì)應(yīng)的,即進(jìn)程只有一個(gè),但是在不同的命名空間里面有不同的數(shù)據(jù)表示,獲取一個(gè)進(jìn)程信息需要進(jìn)程號(hào)加上空間信息才能唯一確定一個(gè)進(jìn)程??赐炅薖ID命名空間的后,我們來(lái)看看他的代實(shí)現(xiàn)。structpid_namespacestructkrefkref;structpidmappidmapPIDMAP_ENTRIES;intlast_pid;structtask_struct*child_reaper;structkmem_cache*pid_cachep;unsignedintlevel;structpid_namespace*parent;上要的一些通過(guò)注了出來(lái),chi

13、ld_reaper指向的進(jìn)程作用當(dāng)于全命名空間的init進(jìn)程,其一個(gè)目的是進(jìn)程進(jìn)行回收。Level則自己所處的命名空間在系統(tǒng)命名空間里面的深度,這是一個(gè)重要的標(biāo)記,因?yàn)閷哟胃叩拿臻g可以看到低級(jí)別的所有信息。系統(tǒng)的命名空間從0開(kāi)始技術(shù),然后累加。命名空間的層次結(jié)構(gòu)通過(guò)parent來(lái)。了完P(guān)ID命名空間的后,我們?cè)賮?lái)看看PID為了支命名空間所要做的修以前的PID命名空間是全一的,現(xiàn)在則是命名空間化,有一個(gè)可的命名空間就有一個(gè)PID變量。來(lái)看看PID的內(nèi)核,系統(tǒng)于每一個(gè)PID都有一個(gè)PID結(jié)構(gòu)體來(lái),但是在每個(gè)命名空間的個(gè)命名空間的upid具體的數(shù)個(gè)命名空間的個(gè)命名空間的upid具體的數(shù)struc

14、tpick1datamictcount;*unsignedintIe-vel;+J廣listsoftaskstlatusetiisid*/-+jstructIi5theadlasksEPIDTvPEMAX;structrculie-adrcu;*-1structupidnumbersllj+JmvA-.vv*上的PID就是我們?cè)谙到y(tǒng)內(nèi)核的,一個(gè)PID可應(yīng)個(gè)task_struct,所以在上的通過(guò)一個(gè)task數(shù)來(lái)。接著numbers數(shù)分在不同命名空間可以看的pid數(shù),為numbers在后一個(gè)位,所有本上來(lái)說(shuō)當(dāng)于個(gè)指針,命名空間的時(shí)候,再一個(gè)numbers即可。structupid#tVtVt-tt

15、-t-tWt-tt*/*Trvtokeeppfdchaininthesamecachelineasnrforfindvoid十int門(mén)汁structpidnamespacens;*1structhlfstncdepidchains上述的upid上述的upid則是具體的命名空間內(nèi)數(shù)間。當(dāng)然系統(tǒng)的所有upid通過(guò)pid_chain,nr數(shù),ns則指向的命名空在同一個(gè)全局鏈表里。唧fd0level1levs)2iasl;_sTructIrnodepidS1pidsISEasks,piD_npE_EibF1D_TYFE_FOIDPID_TYPE_SIDstrucnPID命名空間唧fd0level1le

16、vs)2iasl;_sTructIrnodepidS1pidsISEasks,piD_npE_EibF1D_TYFE_FOIDPID_TYPE_SIDstrucnPID命名空間這張表格和上pid_linl的hlist_node接structpid的pid_linkpid,通過(guò)pidnumbers這張表格和上pid_linl的hlist_node接structpid的pid_linkpid,通過(guò)pidnumbers數(shù)字獲取每一個(gè)命名空間為了在pid和upid之間本指導(dǎo)性原則。._nr()通過(guò)nr結(jié)的數(shù)就是所的PID是結(jié)合來(lái)我們理PID的管理結(jié)構(gòu)。一個(gè)task_struc通過(guò)。同時(shí)task_str

17、uct是用過(guò)所有的任務(wù),當(dāng)然也可以讀取tasks鏈表的數(shù)字,系統(tǒng)提供了我們首先來(lái)了解一些基以前所謂的全致的。如pid_nr(pid)就往只有在本機(jī)有效,例如一些通過(guò)PIDpid結(jié)構(gòu)全PID更有意為全PID,這個(gè)全回定pid的全進(jìn)程結(jié)構(gòu)的代碼。但是在這PID不隨意遷移。PID和我們?cè)谝郧跋到y(tǒng)PID數(shù)。這些數(shù)下,保存,如一個(gè)進(jìn)程可的ID,如一個(gè)進(jìn)程可的ID。來(lái)看一個(gè)子,務(wù)PID。需要注意的是,這個(gè)數(shù)字僅僅在本命名空Vnr結(jié)的數(shù)主要和pidtask_pid_vnr(tsk就回它看間內(nèi)有效。._nr_ns()以r_ns結(jié)的數(shù)定命名空間間的PID數(shù),如果想一些務(wù)的PID數(shù),就可以通過(guò)task_pid_n

18、r_ns(tsk,current-nsproxy-pid_ns)用數(shù),接著通過(guò)find_task_by_pid_ns(pid,current-nsproxy-pid_ns)過(guò)來(lái)到任務(wù)結(jié)構(gòu)。當(dāng)一個(gè)用戶(hù)請(qǐng)求過(guò)來(lái)的時(shí)候,基本上都是調(diào)用這組函數(shù),因?yàn)檫@種情況下一個(gè)任務(wù)可能需要得到另外一個(gè)命名空間的信息。NET命名空間子模塊net的命名空間做的作而是的,但是整體是一致的,即扌巴全的資源局部化,在每一個(gè)命名空間里面保留自己的控制信息。例如在目前的內(nèi)核里面路,arp,netfilter,等等都已經(jīng)空間化了,其所做的后操作都要先特定的命名空間,然后再取出里面的數(shù)據(jù)進(jìn)行后面的分析。先來(lái)看看net命名空間的結(jié)構(gòu)體

19、structnetshouldatomic_tcount;/*oTdecidedwhenthenetworknamespaceshouldbefreed.*/and*/and*/atomic_tuse_count;/*oTtrackreferenceswedestroyonde#endifstructlist_headist;/*listofnetworknamespaces*/structwork_structwork;/*workstructforfreeing*/structproc_dir_entry*proc_net;structproc_dir_entry*proc_net_sta

20、t;#ifdefCONFIG_SYSCTLstructctl_table_setsysctls;loopback*/#endifloopback*/structnet_device*loopback_dev;/*Thestructlist_headdev_base_head;structhlist_head*dev_name_head;structhlist_head*dev_index_head;/*corefib_rules*/structlist_heactules_ops;spinlock_trules_mod_lock;structsock*rtnl;/*rtnetlinksocke

21、t*/structnetns_corecore;structnetns_mibmib;structnetns_packepacket;structnetns_unixunx;structnetns_ipv4ipv4;#ifdefined(CONFIGPV6)|defined(CONFIGPV6_MODULE)structnetns_ipv6ipv6;#endif#ifdefined(CONFIGP_DCCP)|defined(CONFIGP_DCCP_MODULE)structnetns_dccpdccp;#endif#ifdefCONFIG_NETFTERstructnetns_xtxt;#

22、ifdefined(CONFIG_NF_CONNTRACK)|defined(CONFIG_NF_CONNTRACK_MODULE)structnetns_ctct;#endif#endif#ifdefCONFIG_XFRMstructnetnsxfrmxfrm;#endifstructnet_generic*gen;;_上這個(gè)結(jié)構(gòu)實(shí)在大,在要入了的時(shí)候了每個(gè)子模塊。在一個(gè)命名空間創(chuàng)建的時(shí)候,會(huì)做一些初始化。所有系統(tǒng)定義了一個(gè)回調(diào)函數(shù),讓感興趣的模塊注冊(cè)。結(jié)構(gòu)如下:structpernet裁已日ticKh中structIi5theadlistj+Jint(structrie-tnetk+JT-

23、fIvWWVWrrvoid(*exitl(5tructnet中注冊(cè)接口如下reersterpemetoperations一個(gè)新的用戶(hù)空間被建的時(shí)候,注模塊的init結(jié)構(gòu)被建。同理,一個(gè)空間的時(shí)候,exit數(shù)會(huì)被用。那么現(xiàn)在有了很多命名空間,而且命名空間之間是隔離的,那么他們之間怎么通信呢這要注意的是引入了一個(gè)新的,就做網(wǎng)。一個(gè)即A接收的時(shí)間自發(fā)B,之然。我們先來(lái)從直觀上看一下網(wǎng)絡(luò)概念圖。HostB|ethO(192.18.0.2)HostAHostB|ethO(192.18.0.2)TOC o 1-5 h z|Cont1|ContH|IIIIII|vethl|uethH|IIIIIIIIIII

24、I|vethQuethH-1|IIII|ethQ(152-168-0-1)接下來(lái)的問(wèn)題就是如何通信?其實(shí)可以通過(guò)二層或者三層來(lái)實(shí)現(xiàn)網(wǎng)絡(luò)轉(zhuǎn)發(fā),本質(zhì)上就是通過(guò)橋接還是路由。我們下面以橋接為例來(lái)說(shuō)明數(shù)據(jù)報(bào)文是如何轉(zhuǎn)發(fā)的。于容器1來(lái)說(shuō),vethl要個(gè)IP,但是vethO和ethO在同一個(gè)接上。Veth0和veth1是網(wǎng)。Iinux-ke:/liome/proiectAe-rnplate/su5ertbrctlshowmacsbrO1pcirtnomacaddrislocal?ageingtimer1100:0c:29:55:lf:43yes0.00*J1)0:50:56:cO:DO:08no0.021

25、&;50;56:fS;3:40no氏妙2ba:4e:no7.582d&:dl:Se:al:b4:57yesD.DOVeth&Linkencap:E:hernetI-WaddrD6:D1:BE:A1:B4:57JVethlLinkencap;E7hernetHWaddrBA:4E:5&:D8-:DA:8-3+J是一個(gè)實(shí)網(wǎng)的虛擬化,vethO和ethO是通過(guò)接來(lái)完成發(fā),但是vethO和vethl之間是通過(guò)來(lái)完成數(shù)據(jù)發(fā),其他都有變化,了加一個(gè)獨(dú)立的命名空間,這兒我們來(lái)看看網(wǎng)絡(luò)設(shè)備對(duì)是如何工作的。建過(guò)程不再討論,就是每建一,A和B的分指向。structvethprivWstructnetdevicestructv

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論