2.2 命名空间

和虚拟机相比,容器是一种轻量级的虚拟化技术,直接使用宿主机的内核,使用命名空间隔离资源。Linux内核提供的命名空间如表2.3所示。

表2.3 命名空间

可以使用以下两种方法创建新的命名空间。

(1)调用clone创建子进程时,使用标志位控制子进程是共享父进程的命名空间还是创建新的命名空间。

(2)调用unshare创建新的命名空间,不和已存在的任何其他进程共享命名空间。

进程也可以使用系统调用setns,绑定到一个已经存在的命名空间。

如图2.1所示,进程描述符的成员“nsproxy”指向一个命名空间代理,命名空间代理包含除了用户以外的所有其他命名空间的地址。如果父进程和子进程共享除了用户以外的所有其他命名空间,那么它们共享一个命名空间代理。

图2.1 进程的命名空间

本节只介绍进程号命名空间。

进程号命名空间用来隔离进程号,对应的结构体是pid_namespace。每个进程号命名空间独立分配进程号。进程号命名空间按层次组织成一棵树,初始进程号命名空间是树的根,对应全局变量init_pid_ns,所有进程默认属于初始进程号命名空间。

创建进程时,从进程所属的进程号命名空间到初始进程号命名空间都会分配进程号。如图2.2所示,假设某个进程属于进程号命名空间b, b的父命名空间是a, a的父命名空间是初始进程号命名空间,从b到初始的每一级命名空间依次分配进程号10、20和30。

图2.2 进程号命名空间