docker底层之namespace

论坛 期权论坛     
选择匿名的用户   2021-5-30 02:54   289   0
<p>鉴于docker底层和lxc底层相同,这里整理下研究lxc时对于namespace的研究。</p>
<p></p>
<p>在其他虚拟化的系统中,一台物理计算机可以运行多个内核,可能是并行的多个不同的操作系统。而容器只使用一个内核在一台物理计算机上运行,通过命名空间隔离资源来虚拟os运行环境,但核心的底层服务则由一个kernel完成。与应用相关的全局资源都通过命名空间抽象起来,使得可以将一组进程放置到容器中,各个容器彼此隔离。隔离可以使容器的成员与其他容器毫无关系。但也可以通过允许容器进行一定的共享,来降低容器之间的分隔。例如,容器可以设置为使用自身的PID集合,但仍然与其他容器共享部分文件系统。本质上,命名空间建立了系统的不同视图。此前的每一项全局资源都必须包装到容器数据结构中,只有资源和包含资源的命名空间构成的二元组仍然是全局唯一的。虽然在给定容器内部资源是自足的,但无法提供在容器外部具有唯一性的ID。</p>
<p>新的命名空间可以用下面两种方法创建。</p>
<p>  在用fork或clone系统调用创建新进程时,有特定的选项可以控制是与父进程共享命名空间,还是建立新的命名空间。该选项就是一些标志位,每个命名空间都有一个对应的标志:</p>
<p><span style="background:#D9D9D9">#define CLONE_NEWUTS    0x04000000      /* </span><span style="background:#D9D9D9">创建新的</span><span style="background:#D9D9D9">utsname</span><span style="background:#D9D9D9">组</span><span style="background:#D9D9D9"> */ </span></p>
<p><span style="background:#D9D9D9">#define CLONE_NEWIPC    0x08000000      /* </span><span style="background:#D9D9D9">创建新的</span><span style="background:#D9D9D9">IPC</span><span style="background:#D9D9D9">命名空间</span><span style="background:#D9D9D9">  */  </span></p>
<p><span style="background:#D9D9D9">#define CLONE_NEWUSER   0x10000000      /* </span><span style="background:#D9D9D9">创建新的用户命名空间</span><span style="background:#D9D9D9">   */  </span></p>
<p><span style="background:#D9D9D9">#define CLONE_NEWPID    0x20000000      /* </span><span style="background:#D9D9D9">创建新的</span><span style="background:#D9D9D9">PID</span><span style="background:#D9D9D9">命名空间</span><span style="background:#D9D9D9">  */  </span></p>
<p><span style="background:#D9D9D9">#define CLONE_NEWNET    0x40000000      /* </span><span style="background:#D9D9D9">创建新的网络命名空间</span><span style="background:#D9D9D9">   */ </span></p>
<p>  unshare系统调用将进程的某些部分从父进程分离,其中也包括命名空间。</p>
<p>命名空间的实现需要两个部分:每个子系统的命名空间结构,将此前所有的全局组件包装到命名空间中;将给定进程关联到所属各个命名空间的机制。structnsproxy用于汇集指向特定于子系统的命名空间包装器的指针:</p>
<p>  UTS命名空间包含了运行内核的名称、版本、底层体系结构类型等信息。</p>
<p>  IPC命名空间包含了与进程间通信有关的信息。</p>
<p>  MNT命名空间包含了文件系统的视图。</p>
<p>  PID命名空间包含了有关进程ID的信息。</p>
<p>  USER命名空间包含了用于限制每个用户资源使用的信息,最近的更新包含了容器权限控制的实现部分。</p>
<p>  NET命名空间包含所有网络相关的参数。目前只是部分还不够完善。</p>
<p>下面分别说明下各个命名空间。</p>
<p> </p>
<div>
<p>1.1.1.      PID命名空间</p>
</div>
<p>Linux用ID来管理进程,常用的有PID,但每个进程除了PID之外,还有其他的ID。共有四种ID定义在pid_type中。PIDTYPE_MAX表示ID类型的数目:</p>
<div style="background:#BFBFBF">
<p>enum pid_type </p>
<p>{  </p>
<p>        PIDTYPE_PID, </p>
<p>        PIDTYPE_PGID, </p>
<p>        PIDTYPE_SID, </p>
<p>        PIDTYPE_MAX </p>
<p>}; </p>
</div>
<p>处于某个线程组中的所有进程都有统一的线程组ID(TGID)。如果进程没有使用线程,则其PID和TGID相同。</p>
<p>线程组中的主进程被称作组长(group leader)。通过clone创建的所有线程的task_struct的group_leader成员,会指向组长的task_struct实例。</p>
<p>独立进程可以合并成进程组,进程组成员的task_struct的pgrp属性值都是相同的,即进程组组长的 PID。进程组简化了向组的所有成员发送信号的操作。</p>
<p>几个进程组可以合并成一个会话。会话中的所有进程都有同样的会话ID,保存在task_struct的session成员中。SID可以使用 setsid系统调用设置。终端中运行的程序一般具有相同的SID。</p>
<p>PID命名空间可以是多层嵌套,一个命名空间是父命名空间,衍生了两个子命名空间。如果每个容器都配置了新的命名空间,如果容器为系统级容器,每个容器都
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP