操作系统虚拟化底层基础之命名空间(namespace)_第1页
操作系统虚拟化底层基础之命名空间(namespace)_第2页
操作系统虚拟化底层基础之命名空间(namespace)_第3页
操作系统虚拟化底层基础之命名空间(namespace)_第4页
操作系统虚拟化底层基础之命名空间(namespace)_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、总结总结16总结总结16操作系统虚拟化底层基础之命名空间(namespace)黎润(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背景随着公司业务的迅猛发展,大量的机器在线上业务号召下投入了服务于广大网民的神圣职责。不过基于一个不完全统计,我们公司的线上机器平均2利0用%左率右,这就意味着70%左右的机器都是可回收或者复用的。出于节约机器,统一管理以及在线迁移的初衷,我们进行了虚拟化计算的研究。经过选型测试以及具体应用场景的研究,我们选择了操作系统虚拟化技术,即LXC。(为什么选择LXC,OpenVZ如何?Xen效果如何等等这些问题请参考其他文档,本文主要讨论LXC的底层实现技术)。LXC本身不是一个具体的技术,它是一个集合技术的代称,我们可以总体上来看,LXC主要有namespace和cgroup两大

3、模块构建而成,本系列主要就是说说这两个技术,本文则专注于namespace。在我们讲述具体的技术之前,先来看看容器模块的整个状态系统,目前主要是IBM,google等公司的团队在负责维护更新。IBMContainers%A7=Mainline(LinusTorvald)Netdev(DaveMiller-mm(AndrewMarton)LinuxNetworxOpenVZLinux-VserverIBMContainers%A7=Mainline(LinusTorvald)Netdev(DaveMiller-mm(AndrewMarton)LinuxNetworxOpenVZLinux-Vse

4、rverGnnaleOthers目前container已经被上有内核所接纳,所以不存在自己维护分支版本的问题。但是这些团队之间合作不是我们想象的和谐,不同利益集团之间是有内核的政治诉求,都想把自家的内容扶位正房,导致我们再看操作系统虚拟化的时候会有不同项目博弈的事迹。总览每一个进程其所包含的命名空间都被抽象层一个nsproxy指针,共享同一个命名空间的进程指向同一个指针,指针的结构通过引用计数(count)来确定使用者数目。当一个进程其所处的用户空间发生变化的时候就发生分裂。通过复制一份老的命名空间数据结构然后做一些简单的修改,接着赋值给相应的进程。看了上面的数据结构,我们就会基本明白,命名空

5、间本身只是一个框架,需要其他实行虚拟化的子系统实现自己的命名空间。这些子系统的对象就不再是全局维护的一份结构了,而是和进程的用户空间数目一致,每一个命名空间都会有对象的一个具体实例。目前Linux系统实现的命名空间子系统主要有UTSIPCMNTPID以及NET网子模块。我们在下文会针对这些子模块进行进一步的分析。UTS命名空间子模块UTS而是一个简单的平化命名空间子模块,其不同的命名空间之间有层系。我们先来看一下UTS的数据结构。New_utename结构就是我们通过uname-a看的。看一下机器上的出:LmuX4362.6.30-TENCENT64-10031A55IV1PMen川1吁1了:

6、20:口C5T201D/X8564kB5&4Lmu我通过线把uname-的出分,分应上的new_utsname的结构体。内核把这些通过proc文系统导出,我们可以通过/proc/sys/kernel目录的如下等变量(Ostype/hostname/osrelease/version看,当然这些变量的也是可以更改的。初的时候,系统构了一个UTS结构,他的分如下所述。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当一个新的命名空间建的时候,copy_utsname会被用来建一个UTS的命名空间,主要作在clone_uts_ns数完成。上讲述了UTS的代,我们再来管看一下上讲述了UTS的代,我们再来管看一下UTSNamespac和Kref合使用的场景。上述述了ustname在容器的化以及和弓I用计数合完成的象生命管理。IPC命名空间子模块ipcipc作为一个的进程间通具,命名空间他进行了分支ipc个较为简单的扁平化进程间

8、通信工具,命名空间之间不存在层级。上列的主要是IPC命名空间包含的,个命名空间之间的系是列的。我们直观的给一个图描述资源隔离使用属于不同命名空间的进程之间是不能访问对方的全局资源的,这儿展示的主要是IPC的SHM,MSG以及SEM,在新的代MQueue可以被。mnt命名空间子模块虚拟机的一个核心功能就是完成应用的隔离,即业务之间相互不可见。这一块主要通过文件系统的视图来完成,进程创建的时候,每一个进程都有自己的文件挂节点信息。看下经的structtask_struct.5tructta5kstruct尸当前进程的文件系统信息,包括根目录以反当前用户目录打Astructfs5tuct*也艸严已经

9、打开的文件列表”中structfles5trjct=l:fles-+Jmmw严mr产命容空间弓中structnsproxy*nsprosv:+jstructfs或ud:Winitusers;1rwlock:locki+J宀宀intumask:inifrtexec:stru匚tpathroot,pwdj+J在个系统启动的时候,0号进程就设置好了自己所在的根目录以及当前目录。在创建子进程的时候,通过CLONE_FS来指子之间的共享,如果了两者共享同一个结构(指针加上引用计数),没有设置标记的话,子进程创建个新的拷贝,两者之间互不。如果了CLONE_FS,接下来通过chroot(2),chdir(2

10、),oumask(2)的用结果两者之间会,之两者是的。下面这了的刻画了进程内部的文件系统信息以及文件描述符的位置,同时下面这了的刻画了进程内部的文件系统信息以及文件描述符的位置,同时可以看到一个文件的主要组成部分。下面我们通过而且不通过文字以及代码描述还是的方式来看可以看到一个文件的主要组成部分。下面我们通过而且不通过文字以及代码描述还是的方式来看下进程的文件系统初我们在系统(system)目录建了一个container目录,然后在这个目录面为每一个虚拟机创建了独立的目录,例如1和2(本例)。在目录1和2里面分别创建应虚拟机的目录文系统。这虚拟机的时候,我们chroot1或者2,看到的文件系统

11、试图就如下所示。在这种使用方式下,虚拟机1和虚拟机在这种使用方式下,虚拟机1和虚拟机2之间的文件系统是互不可见的,而且虚拟机也看不到除了根目录之外的其他文件目录。为了和系统或者其他虚拟机部分共享文件,我们可以映射特定目录到虚拟机的根文件系统,达到部分隔离以及共享的效果,下图。PID命名空间子模块PID是虚拟化命名空间PID是虚拟化命名空间复杂的模块,因为前面的命名空间基本都是扁平的,个命名空间的个命名空间的upid具体的数有层结构。但是PID命名空间是有层的,在层命名空间看所有的层命名空间信息,反之则不行。先直观来看看层次化的命名空间结构以及进程的数字变化。需要指出的是,对于命名空间里面的进程

12、,我们看到好像有多个,其实是一一对应的,即进程只有一个,但是在不同的命名空间里面有不同的数据表示,获取一个进程信息需要进程号加上空间信息才能唯一确定一个进程。看完了PID命名空间的后,我们来看看他的代实现。structpid_namespacestructkrefkref;structpidmappidmapPIDMAP_ENTRIES;intlast_pid;structtask_struct*child_reaper;structkmem_cache*pid_cachep;unsignedintlevel;structpid_namespace*parent;上要的一些通过注了出来,chi

13、ld_reaper指向的进程作用当于全命名空间的init进程,其一个目的是进程进行回收。Level则自己所处的命名空间在系统命名空间里面的深度,这是一个重要的标记,因为层次高的命名空间可以看到低级别的所有信息。系统的命名空间从0开始技术,然后累加。命名空间的层次结构通过parent来。了完PID命名空间的后,我们再来看看PID为了支命名空间所要做的修以前的PID命名空间是全一的,现在则是命名空间化,有一个可的命名空间就有一个PID变量。来看看PID的内核,系统于每一个PID都有一个PID结构体来,但是在每个命名空间的个命名空间的upid具体的数个命名空间的个命名空间的upid具体的数struc

14、tpick1datamictcount;*unsignedintIe-vel;+J广listsoftaskstlatusetiisid*/-+jstructIi5theadlasksEPIDTvPEMAX;structrculie-adrcu;*-1structupidnumbersllj+JmvA-.vv*上的PID就是我们在系统内核的,一个PID可应个task_struct,所以在上的通过一个task数来。接着numbers数分在不同命名空间可以看的pid数,为numbers在后一个位,所有本上来说当于个指针,命名空间的时候,再一个numbers即可。structupid#tVtVt-tt

15、-t-tWt-tt*/*Trvtokeeppfdchaininthesamecachelineasnrforfindvoid十int门汁structpidnamespacens;*1structhlfstncdepidchains上述的upid上述的upid则是具体的命名空间内数间。当然系统的所有upid通过pid_chain,nr数,ns则指向的命名空在同一个全局链表里。唧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,通过pidnumbers这张表格和上pid_linl的hlist_node接structpid的pid_linkpid,通过pidnumbers数字获取每一个命名空间为了在pid和upid之间本指导性原则。._nr()通过nr结的数就是所的PID是结合来我们理PID的管理结构。一个task_struc通过。同时task_str

17、uct是用过所有的任务,当然也可以读取tasks链表的数字,系统提供了我们首先来了解一些基以前所谓的全致的。如pid_nr(pid)就往只有在本机有效,例如一些通过PIDpid结构全PID更有意为全PID,这个全回定pid的全进程结构的代码。但是在这PID不随意迁移。PID和我们在以前系统PID数。这些数下,保存,如一个进程可的ID,如一个进程可的ID。来看一个子,务PID。需要注意的是,这个数字仅仅在本命名空Vnr结的数主要和pidtask_pid_vnr(tsk就回它看间内有效。._nr_ns()以r_ns结的数定命名空间间的PID数,如果想一些务的PID数,就可以通过task_pid_n

18、r_ns(tsk,current-nsproxy-pid_ns)用数,接着通过find_task_by_pid_ns(pid,current-nsproxy-pid_ns)过来到任务结构。当一个用户请求过来的时候,基本上都是调用这组函数,因为这种情况下一个任务可能需要得到另外一个命名空间的信息。NET命名空间子模块net的命名空间做的作而是的,但是整体是一致的,即扌巴全的资源局部化,在每一个命名空间里面保留自己的控制信息。例如在目前的内核里面路,arp,netfilter,等等都已经空间化了,其所做的后操作都要先特定的命名空间,然后再取出里面的数据进行后面的分析。先来看看net命名空间的结构体

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;;_上这个结构实在大,在要入了的时候了每个子模块。在一个命名空间创建的时候,会做一些初始化。所有系统定义了一个回调函数,让感兴趣的模块注册。结构如下:structpernet裁已日ticKh中structIi5theadlistj+Jint(structrie-tnetk+JT-

23、fIvWWVWrrvoid(*exitl(5tructnet中注册接口如下reersterpemetoperations一个新的用户空间被建的时候,注模块的init结构被建。同理,一个空间的时候,exit数会被用。那么现在有了很多命名空间,而且命名空间之间是隔离的,那么他们之间怎么通信呢这要注意的是引入了一个新的,就做网。一个即A接收的时间自发B,之然。我们先来从直观上看一下网络概念图。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)接下来的问题就是如何通信?其实可以通过二层或者三层来实现网络转发,本质上就是通过桥接还是路由。我们下面以桥接为例来说明数据报文是如何转发的。于容器1来说,vethl要个IP,但是vethO和ethO在同一个接上。Veth0和veth1是网。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是一个实网的虚拟化,vethO和ethO是通过接来完成发,但是vethO和vethl之间是通过来完成数据发,其他都有变化,了加一个独立的命名空间,这儿我们来看看网络设备对是如何工作的。建过程不再讨论,就是每建一,A和B的分指向。structvethprivWstructnetdevicestructv

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论