命名空间是虚拟化技术的一种方式,系统的一些全局资源由命名空间进行抽象(把系统资源放到结构中)。也就是说命名空间建立了系统的不同视图,因为每个命名空间所抽象的方式是不一样的。最终这种方式也实现了资源的隔离,相当于把一些资源放到一些容器中,各个容器是隔离的。但容器之间有些通信的方式。 Linux系统中的命名空间主要有UTS、IPC、MNT、PID以及NET。 每个命名空间包含多个进程,但在命名空间之间这些进程进程是相对独立的,如每个命名空间都有PID=0的进程。每个进程(task_struct)中有一个nsproxy指针,指向该进程的命名空间,进nsproxy结构中的count记录着该命令空间中进程的个数,从而也说明了该命名空间有多少个成员。 /* namespaces */ struct nsproxy *nsproxy;
/** A structure to contain pointers to all per-process * namespaces - fs (mount), uts, network, sysvipc, etc. * * 'count' is the number of tasks holding a reference. * The count for each namespace, then, will be the number * of nsproxies pointing to it, not the number of tasks. * * The nsproxy is shared by tasks which share all namespaces. * As soon as a single namespace is cloned or unshared, the * nsproxy is copied. */ struct nsproxy { atomic_t count; struct uts_namespace *uts_ns; struct ipc_namespace *ipc_ns; struct mnt_namespace *mnt_ns; struct pid_namespace *pid_ns; struct net *net_ns; };
<深入linux内核架构>中的描述:命名空间可以组织为层次,如图中, 一个命名空间是父命名空间,衍生了两个子命名空间。假定容器用于虚拟主机配置中,其中的每个容器必须看起来像是单独的一台Linux计算机。因此其中每一个都有自身的init进程,PID为0,其他进程的PID 以递增次序分配。两个子命名空间都有PID为0的init进程,以及PID分别为2和3的两个进程。由于相同的PID在系统中出现多次,PID号不是全局唯一的。
虽然子容器不了解系统中的其他容器,但父容器知道子命名空间的存在,也可以看到其中执行的所有进程。图中子容器的进程映射到父容器中,PID为4到 9。尽管系统上有9个进程,但却需要15个PID来表示,因为一个进程可以关联到多个PID。至于哪个PID是"正确"的,则依赖于具体的上下文。如果命名空间包含的是比较简单的量,也可以是非层次的,例如下文讨论的UTS命名空间。在这种情况下,父子命名空间之间没有联系。
http://blog.sina.com.cn/s/blog_508d2c500100r5rj.html
http://www.cnblogs.com/lisperl/archive/2012/05/03/2480316.html
http://laokaddk.blog.51cto.com/368606/674256
http://book.51cto.com/art/201005/200881.htm
这四篇文章不错。