学习 Linux Namespace

2019年5月22日

Namespace,顾名思义,就是为不同进程集合提供不同的「命名空间」,不同进程集合彼此不能访问其对应的「命名空间」,而「命名空间」其实就是其资源集合。使得处于不同 namespace 的进程拥有独立的全局系统资源,改变一个 namespace 中的系统资源只会影响当前 namespace 里的进程,对其他 namespace 中的进程没有影响。

Namespace 的一个应用是容器。对于每一个 Namespace,从用户来看,看起来像一台独立的 Linux 计算机一样,有自己的 init 进程(PID 为 1),其他进程依次递增,A 和 B 空间都有 PID 为 1 的 init 进程,子容器的进程映射到父容器的进程上,父容器可以知道每一个子容器的运行状态,而子容器与子容器之间是隔离的。

Linux 提供了以下 7 种不同的 Namespace

名称宏定义隔离的资源
CgroupCLONE_NEWCGROUPCgroup 根目录
IPCCLONE_NEWIPCSystem V IPC,POSIX 消息队列
NetworkCLONE_NEWNET网络设备、协议栈、端口等
MountCLONE_NEWNS挂载点
PIDCLONE_NEWPID进程 ID
USERCLONE_NEWUSER用户和组 ID
UTSCLONE_NEWUTS主机和域名

Namespace 的 API 主要使用三个系统调用:

  • clone() – 创建新进程。根据系统调用参数来判断哪种类型的 namespace 被创建,而且它们的子进程也会被包含到 namespace 中
  • unshare() – 将进程移出某个 namespace
  • setns() – 将进程加入到某个已经存在的 namespace 中

除了 3 个 API 外,还需要关注 /proc 目录。系统中的每个进程都有一个 /proc/[pid]/ns/ 子目录,里面包含了这个进程所属 namespace 的信息,里面每个文件的描述符都可以用来作为 setns 函数的参数。

[[email protected] ~]$ 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]'

发表评论

电子邮件地址不会被公开。 必填项已用*标注