前言
Linux的内核有两大特性Namespace和CGroup,这两种特性可以在Linux主机上实现主机名、用户、网络等全局资源的隔离,也是实现网络虚拟化、容器技术的基础。
命名空间
Linux Namespace(命名空间)是一种操作系统层级的资源隔离技术,能够将 Linux 的全局资源,划分为 namespace 范围内的资源,而且不同 namespace 间的资源彼此透明,不同 namespace 里的进程无法感知到其它 namespace 里面的进程和资源。
Namespace(名称空间):实现六大名称空间的隔离
Mount:根文件系统隔离
UTS:主机名和域名隔离
IPC:容器进程间通信隔离
USER:用户隔离(UID映射)
PID:进程隔离
NETWORK:网络隔离
linux Namespaces机制提供一种资源隔离和虚拟化特性。PID,IPc,Network等系统资源不再是全局性的,而是属于某个特定的Namespace。每个namespace下的资源对于其他namespace下的资源都是不可见的。因此在操作系统层面上看,就会出现多个相同pid的进程。系统中可以同时存在两个甚至多个进程号为0,1,2的进程由于属于不同的namespace,所以它们之间并不冲突。而在用户层面上只能看到属于用户自己namespace下的资源,例如使用ps命令只能列出自己namespace下的进程。这样每个namespace看上去就像一个单独的Linux系统。
这种隔离机制和 Chroot 很类似,Chroot 是把某个目录修改为根目录,从而无法访问外部的内容。
Linux Namesapce 在此基础之上,提供了对 UTS、IPC、Mount、PID、Network、User 等的隔离机制。
基本上涵盖了一个小型操作系统的运行要素,包括主机名、用户权限、文件系统、网络、进程号、进程间通信。
CGroups(ControlGroups)
实现资源限制,限制容器内部进程可用的资源。
名称 | 宏定义 | 隔离内容 |
---|---|---|
Cgroup | CLONE_NEWCGROUP | Cgroup root directory (since Linux 4.6) |
IPC | CLONE_NEWIPC | System V IPC, POSIX message queues (since Linux 2.6.19) |
Network | CLONE_NEWNET | Network devices, stacks, ports, etc. (since Linux 2.6.24) |
Mount | CLONE_NEWNS | Mount points (since Linux 2.4.19) |
PID | CLONE_NEWPID | Process IDs (since Linux 2.6.24) |
User | CLONE_NEWUSER | User and group IDs (started in Linux 2.6.23 and completed in Linux 3.8) |
UTS | CLONE_NEWUTS | Hostname and NIS domain name (since Linux 2.6.19) |