学习 Linux Namespace
2020年8月5日Namespace,顾名思义,就是为不同进程集合提供不同的「命名空间」,不同进程集合彼此不能访问其对应的「命名空间」,而「命名空间」其实就是其资源集合。使得处于不同 namespace 的进程拥有独立的全局系统资源,改变一个 namespace 中的系统资源只会影响当前 namespace 里的进程,对其他 namespace 中的进程没有影响。
Namespace 的一个应用是容器。对于每一个 Namespace,从用户来看,看起来像一台独立的 Linux 计算机一样,有自己的 init 进程(PID 为 1),其他进程依次递增,A 和 B 空间都有 PID 为 1 的 init 进程,子容器的进程映射到父容器的进程上,父容器可以知道每一个子容器的运行状态,而子容器与子容器之间是隔离的。
Linux 提供了以下 7 种不同的 Namespace:
名称 | 宏定义 | 隔离的资源 |
Cgroup | CLONE_NEWCGROUP | Cgroup 根目录 |
IPC | CLONE_NEWIPC | System V IPC,POSIX 消息队列 |
Network | CLONE_NEWNET | 网络设备、协议栈、端口等 |
Mount | CLONE_NEWNS | 挂载点 |
PID | CLONE_NEWPID | 进程 ID |
USER | CLONE_NEWUSER | 用户和组 ID |
UTS | CLONE_NEWUTS | 主机和域名 |
Namespace 的 API 主要使用三个系统调用:
- clone() – 创建新进程。根据系统调用参数来判断哪种类型的 namespace 被创建,而且它们的子进程也会被包含到 namespace 中
- unshare() – 将进程移出某个 namespace
- setns() – 将进程加入到某个已经存在的 namespace 中
除了 3 个 API 外,还需要关注 /proc
目录。系统中的每个进程都有一个 /proc/[pid]/ns/
子目录,里面包含了这个进程所属 namespace 的信息,里面每个文件的描述符都可以用来作为 setns 函数的参数。
[shiyang@dr ~]ls -l /proc/$/ns
总用量 0
lrwxrwxrwx 1 shiyang shiyang 0 5月 22 15:23 cgroup -> 'cgroup:[4026531835]'
lrwxrwxrwx 1 shiyang shiyang 0 5月 22 15:23 ipc -> 'ipc:[4026531839]'
lrwxrwxrwx 1 shiyang shiyang 0 5月 22 15:23 mnt -> 'mnt:[4026531840]'
lrwxrwxrwx 1 shiyang shiyang 0 5月 22 15:23 net -> 'net:[4026532009]'
lrwxrwxrwx 1 shiyang shiyang 0 5月 22 15:23 pid -> 'pid:[4026531836]'
lrwxrwxrwx 1 shiyang shiyang 0 5月 22 15:23 pid_for_children -> 'pid:[4026531836]'
lrwxrwxrwx 1 shiyang shiyang 0 5月 22 15:23 user -> 'user:[4026531837]'
lrwxrwxrwx 1 shiyang shiyang 0 5月 22 15:23 uts -> 'uts:[4026531838]'