NAMESPACES - Linux手册页
Linux程序员手册 第7部分
更新日期: 2020-04-11
名称
名称空间-Linux名称空间概述
说明
命名空间以一种抽象的形式包装了全局系统资源,这使它在命名空间中的进程看来具有它们自己的隔离的全局资源实例。全局资源的更改对于名称空间成员的其他进程可见,但对其他进程不可见。命名空间的一种用途是实现容器。
该页面提供了指向各种名称空间类型的信息的指针,描述了相关的/ proc文件,并总结了使用名称空间的API。
Namespace types
下表显示了Linux上可用的名称空间类型。该表的第二列显示用于在各种API中指定名称空间类型的标志值。第三列标识手册页,其中提供了有关名称空间类型的详细信息。最后一列是按名称空间类型隔离的资源的摘要。
Namespace | Flag | Page | Isolates |
Cgroup | CLONE_NEWCGROUP | cgroup_namespaces(7) | Cgroup root directory |
IPC | CLONE_NEWIPC | ipc_namespaces(7) | System V IPC, POSIX message queues |
Network | CLONE_NEWNET | network_namespaces(7) | Network devices, stacks, ports, etc. |
Mount | CLONE_NEWNS | mount_namespaces(7) | Mount points |
PID | CLONE_NEWPID | pid_namespaces(7) | Process IDs |
Time | CLONE_NEWTIME | time_namespaces(7) | Boot and monotonic clocks |
User | CLONE_NEWUSER | user_namespaces(7) | User and group IDs |
UTS | CLONE_NEWUTS | uts_namespaces(7) | Hostname and NIS domain name |
The namespaces API
以及下面描述的各种/ proc文件,名称空间API包括以下系统调用:
- clone(2)
- clone(2)系统调用将创建一个新进程。如果调用的flags参数指定下面列出的一个或多个CLONE_NEW *标志,则将为每个标志创建新的名称空间,并将子进程设为这些名称空间的成员。 (此系统调用还实现了许多与名称空间无关的功能。)
- setns(2)
- setns(2)系统调用允许调用过程加入现有的名称空间。通过引用下面描述的/ proc / [pid] / ns文件之一的文件描述符指定要加入的名称空间。
- unshare(2)
- unshare(2)系统调用将调用过程移至新的名称空间。如果调用的flags参数指定下面列出的一个或多个CLONE_NEW *标志,则将为每个标志创建新的名称空间,并使调用过程成为这些名称空间的成员。 (此系统调用还实现了许多与名称空间无关的功能。)
- ioctl(2)
- 各种ioctl(2)操作可用于发现有关名称空间的信息。这些操作在ioctl_ns(2)中描述。
在大多数情况下,使用clone(2)和unshare(2)创建新的名称空间需要CAP_SYS_ADMIN功能,因为在新的名称空间中,创建者将有权更改随后在其中创建的其他进程可见的全局资源。 ,或加入名称空间。用户名称空间是一个例外:从Linux 3.8开始,创建用户名称空间不需要特权。
The /proc/[pid]/ns/ directory
每个进程都有一个/ proc / [pid] / ns /子目录,其中每个目录都包含一个支持setns(2)操纵的名称空间:
$ ls -l /proc/$$/ns | awk aq{print , , , }aq total 0 lrwxrwxrwx. cgroup -> cgroup:[4026531835] lrwxrwxrwx. ipc -> ipc:[4026531839] lrwxrwxrwx. mnt -> mnt:[4026531840] lrwxrwxrwx. net -> net:[4026531969] lrwxrwxrwx. pid -> pid:[4026531836] lrwxrwxrwx. pid_for_children -> pid:[4026531834] lrwxrwxrwx. time -> time:[4026531834] lrwxrwxrwx. time_for_children -> time:[4026531834] lrwxrwxrwx. user -> user:[4026531837] lrwxrwxrwx. uts -> uts:[4026531838]
将目录中的文件之一绑定安装(请参阅mount(2))到文件系统中的其他位置,即使当前名称空间中的所有进程都终止了,也可以使pid指定的进程的相应名称空间保持活动状态。
打开此目录中的一个文件(或绑定安装到这些文件之一的文件)将返回pid指定的进程的相应名称空间的文件句柄。只要此文件描述符保持打开状态,即使该名称空间中的所有进程都终止,该名称空间也将保持活动状态。可以将文件描述符传递给setns(2)。
在Linux 3.7和更早版本中,这些文件显示为硬链接。从Linux 3.8开始,它们显示为符号链接。如果两个进程在同一名称空间中,则它们的/ proc / [pid] / ns / xxx符号链接的设备ID和索引节点号将相同;应用程序可以使用stat(2)返回的stat.st_dev和stat.st_ino字段进行检查。该符号链接的内容是一个包含名称空间类型和索引节点编号的字符串,如以下示例所示:
$ readlink /proc/$$/ns/uts uts:[4026531838]
该子目录中的符号链接如下:
- /proc/[pid]/ns/cgroup(since Linux 4.6)
- 该文件是进程的cgroup命名空间的句柄。
- /proc/[pid]/ns/ipc(since Linux 3.0)
- 该文件是进程的IPC命名空间的句柄。
- /proc/[pid]/ns/mnt(since Linux 3.8)
- 该文件是进程的安装名称空间的句柄。
- /proc/[pid]/ns/net(since Linux 3.0)
- 该文件是进程的网络名称空间的句柄。
- /proc/[pid]/ns/pid(since Linux 3.8)
- 该文件是进程的PID名称空间的句柄。该句柄在进程的整个生命周期中都是永久的(即,进程的PID名称空间成员资格永远不会更改)。
- /proc/[pid]/ns/pid_for_children(since Linux 4.12)
- 该文件是此进程创建的子进程的PID名称空间的句柄。这可能会因调用unshare(2)和setns(2)(请参见pid_namespaces(7))而改变,因此该文件可能与/ proc / [pid] / ns / pid不同。仅在名称空间中创建第一个子进程后,符号链接才会获得值。 (之前,符号链接的readlink(2)将返回一个空缓冲区。)
- /proc/[pid]/ns/time(since Linux 5.6)
- 该文件是进程的时间名称空间的句柄。
- /proc/[pid]/ns/time_for_children(since Linux 5.6)
- 该文件是此进程创建的子进程的时间名称空间的句柄。这可能会因调用unshare(2)和setns(2)(请参见time_namespaces(7))而改变,因此文件可能与/ proc / [pid] / ns / time不同。
- /proc/[pid]/ns/user(since Linux 3.8)
- 该文件是进程的用户名称空间的句柄。
- /proc/[pid]/ns/uts(since Linux 3.0)
- 该文件是进程的UTS命名空间的句柄。
解除引用或读取(readlink(2))这些符号链接的权限由ptrace访问模式PTRACE_MODE_READ_FSCREDS检查控制;参见ptrace(2)。
The /proc/sys/user directory
/ proc / sys / user目录(从Linux 4.9开始存在)中的文件公开了对可以创建的各种类型的名称空间数量的限制。文件如下:
- max_cgroup_namespaces
- 该文件中的值定义了每个用户对在用户名称空间中可以创建的cgroup名称空间数量的限制。
- max_ipc_namespaces
- 该文件中的值定义了每个用户对在用户名称空间中可以创建的ipc名称空间数量的限制。
- max_mnt_namespaces
- 该文件中的值定义了每个用户对可以在用户名称空间中创建的安装名称空间数量的限制。
- max_net_namespaces
- 该文件中的值定义了每个用户对用户名称空间中可能创建的网络名称空间数量的限制。
- max_pid_namespaces
- 该文件中的值定义了每个用户对用户命名空间中可能创建的PID名称空间数量的限制。
- max_time_namespaces(since Linux 5.7)
- 该文件中的值定义了每个用户对用户名称空间中可以创建的时间名称空间数量的限制。
- max_user_namespaces
- 该文件中的值定义了每个用户对在用户名称空间中可以创建的用户名称空间数量的限制。
- max_uts_namespaces
- 该文件中的值定义了每个用户对用户名称空间中可能创建的uts名称空间数量的限制。
请注意有关这些文件的以下详细信息:
- *
- 这些文件中的值可以由特权进程修改。
- *
- 这些文件公开的值是打开过程所驻留的用户名称空间的限制。
- *
- 限制是针对每个用户的。同一用户名称空间中的每个用户都可以创建不超过定义限制的名称空间。
- *
- 该限制适用于所有用户,包括UID 0。
- *
- 这些限制是除可能实施的任何其他每个命名空间限制(例如PID和用户命名空间的限制)之外的其他适用条件。
- *
- 遇到这些限制后,clone(2)和unshare(2)会失败,并显示错误ENOSPC。
- *
- 对于初始用户名称空间,每个文件中的默认值都是可创建的线程数(/ proc / sys / kernel / threads-max)的限制的一半。在所有后代用户名称空间中,每个文件中的默认值为MAXINT。
- *
- When a namespace is created, the object is also accounted
against ancestor namespaces.
More precisely:
- +
- 每个用户名称空间都有一个创建者UID。
- +
- 创建名称空间时,将根据每个祖先用户名称空间中的创建者UID来考虑名称空间,并且内核确保不超过祖先名称空间中创建者UID的相应名称空间限制。
- +
- 前述要点确保了创建新的用户名称空间不能用作逃避当前用户名称空间中有效限制的手段。
Namespace lifetime
缺少任何其他因素,当名称空间中的最后一个进程终止或离开该名称空间时,该名称空间将自动删除。但是,即使没有成员进程,也有很多其他因素可能会导致命名空间存在。这些因素包括:
- *
- 对应的/ proc / [pid] / ns / *文件存在打开的文件描述符或绑定安装。
- *
- 名称空间是分层的(即PID或用户名称空间),并具有子名称空间。
- *
- 它是一个用户名称空间,拥有一个或多个非用户名称空间。
- *
- 它是一个PID名称空间,并且存在一个通过/ proc / [pid] / ns / pid_for_children符号链接引用该名称空间的进程。
- *
- 它是IPC名称空间,并且mqueue文件系统的相应装载(请参见mq_overview(7))引用此名称空间。
- *
- 它是一个PID名称空间,而proc(5)文件系统的相应挂载引用此名称空间。
示例
请参见clone(2)和user_namespaces(7)。
另外参见
nsenter(1),readlink(1),unshare(1),clone(2),ioctl_ns(2),setns(2),unshare(2),proc(5),功能(7),cgroup_namespaces(7), cgroups(7),凭据(7),ipc_namespaces(7),network_namespaces(7),pid_namespaces(7),user_namespaces(7),uts_namespaces(7),lsns(8),pam_namespace(8),switch_root(8)
出版信息
这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/。