背景
从Linux2.6.24版的内核开始,Linux就支持6种不同类型的命名空间。它们的出现,使用户创建的进程能够与系统分离得更加彻底,从而不需要使用更多的底层虚拟化技术。
- CLONE_NEWIPC:进程间通信(IPC)的命名空间,可以将SystemV的IPC和POSIX的消息队列独立出来。
CLONE_NEWPID:进程命名空间。空间内的PID是独立分配的,意思就是命名空间内的虚拟PID可能会与命名空间外的PID相冲突,于是命名空间内的PID映射到命名空间外时会使用另外一个PID。比如说,命名空间内第一个PID为1,而在命名空间外就是该PID已被init进程所使用。
CLONE_NEWNET:网络命名空间,用于隔离网络资源(/proc/net、IP地址、网卡、路由等)。后台进程可以运行在不同命名空间内的相同端口上,用户还可以虚拟出一块网卡。
CLONE_NEWNS:挂载命名空间,进程运行时可以将挂载点与系统分离,使用这个功能时,我们可以达到chroot的功能,而在安全性方面比chroot更高。
CLONE_NEWUTS:UTS命名空间,主要目的是独立出主机名和网络信息服务(NIS)。
CLONE_NEWUSER:用户命名空间,同进程ID一样,用户ID和组ID在命名空间内外是不一样的,并且在不同命名空间内可以存在相同的ID。
下面我们介绍一下进程命名空间和网络命名空间。
进程命名空间
本文用C语言介绍上述概念,因为演示进程命名空间的时候需要用到C语言。下面的测试过程在Debian6和Debian7上执行。首先,在栈内分配一页内存空间,并将指针指向内存页的末尾。这里我们使用alloca()函数来分配内存,不要用malloc()函数,它会把内存分配在堆上。
复制代码