概念
namespace(命名空间)是linux kernel实现资源隔离的一种技术,命名空间将全局系统资源进行隔离,使命名空间内的进程看起来拥有自己的全局资源。在命名空间内对全局资源的更改对属于相同命名空间成员的其他进程有影响,但对非命名空间内进程是没有影响的。命名空间的其中一种使用场景就是实现容器,可以在创建新的进程时设置新进程应该在哪些资源上与宿主机器进行隔离。
实现
Linux通过namespace实现资源的隔离,并提供clone()、setns()、unshare()方法实现对namespace的操作,我们可以在/proc/[pid]/ns和/proc/user目录下查看具体的进程namespace信息,namespace有自己的生命周期,namespace的释放与是否依然被依赖有关。
类型
| 命名空间名 | 全称 | 系统API调用参数 | 隔离内容 | 内核版本 |
|---|---|---|---|---|
| Mount | Mount | CLONE_NEWNS | Mount points挂载点(文件系统) | 2.4.19 |
| UTS | UNIX Time-sharing System | CLONE_NEWUTS | 系统主机名和NIS(Network Information Service) 主机名(有时称为域名) | 2.6.19 |
| IPC | InterProcess Communication | CLONE_NEWIPC | System V IPC, POSIX message queues信号量,消息队列 | 2.6.19 |
| PID | Process IDentification | CLONE_NEWPID | Process IDs进程号 | 2.6.24 |
| Network | Network | CLONE_NEWNET | Network devices, stacks, ports, etc.网络设备,协议栈,端口等等 | 2.6.24 |
| User | User | CLONE_NEWUSER | 用户和用户组 | 3.8 |
| Cgroups | Control groups | CLONE_NEWCGROUP | Cgroup root directory cgroup 根目录 | 4.6 |
| Time | Time | CLONE_NEWTIME | 系统时钟 | 5.6 |
API
Linux提供了多种系统调用API来操作namespaces,包括:clone()、setns() 和 unshare() 方法,使用这些方法时通过传入上表中的CLONE_NEW* flag来指定要操作的命名空间。