操作系统虚拟化底层基础之命名空间(namespace).docVIP

操作系统虚拟化底层基础之命名空间(namespace).doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
操作系统虚拟化底层基础之命名空间(namespace) 黎润(yijunzhu@) 目录 背景 2 总览 2 UTS命名空间子模块 3 IPC命名空间子模块 5 MNT命名空间子模块 6 PID命名空间子模块 8 NET命名空间子模块 11 总结 15 背景 随着公司业务的迅猛发展,大量的机器在线上业务号召下投入了服务于广大网民的神圣职责。不过基于一个不完全统计,我们公司的线上机器平均利用率20%左右,这就意味着70%左右的机器都是可回收或者复用的。 出于节约机器,统一管理以及在线迁移的初衷,我们进行了虚拟化计算的研究。经过选型测试以及具体应用场景的研究,我们选择了操作系统虚拟化技术,即LXC。(为什么选择LXC,OpenVZ如何? Xen效果如何等等这些问题请参考其他文档,本文主要讨论LXC的底层实现技术)。LXC本身不是一个具体的技术,它是一个集合技术的代称,我们可以总体上来看,LXC主要有namespace和cgroup两大模块构建而成,本系列主要就是说说这两个技术,本文则专注于namespace。 在我们讲述具体的技术之前,先来看看容器模块的整个状态系统,目前主要是IBM,google等公司的团队在负责维护更新。 目前container已经被上有内核所接纳,所以不存在自己维护分支版本的问题。但是这些团队之间合作不是我们想象的和谐,不同利益集团之间是有内核的政治诉求,都想把自家的内容扶位正房,导致我们再看操作系统虚拟化的时候会有不同项目博弈的事迹。 总览 每一个进程其所包含的命名空间都被抽象层一个nsproxy指针,共享同一个命名空间的进程指向同一个指针,指针的结构通过引用计数(count)来确定使用者数目。当一个进程其所处的用户空间发生变化的时候就发生分裂。通过复制一份老的命名空间数据结构,然后做一些简单的修改,接着赋值给相应的进程。 看了上面的数据结构,我们就会基本明白,命名空间本身只是一个框架,需要其他实行虚拟化的子系统实现自己的命名空间。这些子系统的对象就不再是全局维护的一份结构了,而是和进程的用户空间数目一致,每一个命名空间都会有对象的一个具体实例。目前Linux系统实现的命名空间子系统主要有UTS、IPC、MNT、PID以及NET网络子模块。我们在下文会针对这些子模块进行进一步的分析。 UTS命名空间子模块 UTS相对而言是一个简单的扁平化命名空间子模块,其不同的命名空间之间没有层次关系。我们先来看一下UTS的数据结构。 New_utename结构里面就是我们通过uname –a能够看到的信息。看一下机器上的输出: 我通过红色斜线把uname –a的输出分隔开,分别对应上面的new_utsname的结构体。另外内核还把这些信息也通过proc文件系统导出,我们可以通过/proc/sys/kernel目录里面的如下等变量(Ostype/ hostname/osrelease/ version)查看,当然这些变量的值也是可以更改的。 初始的时候,系统默认构造了一个UTS结构,他的值分别如下所述。 当一个新的命名空间创建的时候,copy_utsname会被调用来创建一个UTS的命名空间,主要工作在clone_uts_ns函数里面完成。 上面讲述了UTS的代码表示,我们再来只管看一下UTS Namespace和Kref配合使用的场景。 上述顺序描述了ustname在容器里面的局部化以及和引用计数配合完成的对象生命周期管理。 IPC命名空间子模块 IPC作为一个常见的进程间通信工具,命名空间对他也进行了部分支持。另外IPC也是一个较为简单的扁平化进程间通信工具,命名空间之间不存在层级。 上面罗列的主要是IPC 命名空间里面包含的元素,各个命名空间之间的关系是并列的。 我们直观的给一个图描述资源隔离使用概念图。 属于不同命名空间的进程之间是不能访问对方的全局资源的,这儿展示的主要是IPC的SHM,MSG以及SEM,在较新的代码里MQueue也可以被隔离。 MNT命名空间子模块 虚拟机的一个核心功能就是完成应用的隔离,即业务之间相互不可见。这一块主要通过文件系统的视图来完成,进程创建的时候,每一个进程都有自己的文件挂节点信息。看一下经典的struct task_struct. 在一个系统启动的时候,0号进程就设置好了自己所在的根目录以及当前目录。在创建子进程的时候,通过CLONE_FS来指明父子之间的共享信息,如果设置了两者共享同一个结构(指针加上引用计数),没有设置标记的话,子进程创建一个新的拷贝,两者之间互不影响。如果设置了CLONE_FS,接下来通过chroot(2), chdir(2), or umask(2)的调用结果两者之间会相互影响,反之两者是独立的。 下面这张图清晰明了的刻画了进程内部的文件系统

文档评论(0)

dmz158 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档