Linux repositories inspector

namespaces(7) - Russkiy

Linux
2019-08-02

man-pages-ru

Russian man pages from the Linux Documentation Project

manpages

Manual pages about using a GNU/Linux system

man-pages

Linux kernel and C library user-space interface documentation

ИМЯ

namespaces - обзор пространств имён Linux

ОПИСАНИЕ

Пространства имён облекают глобальный системный ресурс в абстрактную форму, в которой он представляется процессам внутри пространства имён таким образом, что процессы имеют свои собственные изолированные экземпляры глобального ресурса. Изменения глобального ресурса видимы другим процессам, которые являются членами пространства имён, и невидимы остальным процессам. Одно из применений пространств имён — реализация контейнеров.
В Linux предоставляются следующие пространства имён:
Пространство имён Константа Изоляция
Cgroup CLONE_NEWCGROUP корневой каталог cgroup
IPC CLONE_NEWIPC System V IPC, очереди сообщений POSIX
Network CLONE_NEWNET сетевые устройства, стеки, порты …
Mount CLONE_NEWNS точки монтирования
PID CLONE_NEWPID идентификаторы процессов
User CLONE_NEWUSER Идентификаторы пользователей и групп
UTS CLONE_NEWUTS имя узла и доменное имя NIS
В этой странице описаны различные пространства имён и связанные с ними файлы в /proc, а также кратко представлен программный интерфейс.

Программный интерфейс пространств имён

и различные файлы в /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 для создания пользовательского пространства имён особых прав не требуется.

Каталог /proc/[pid]/ns/

Для каждого процесса в /proc/[pid]/ns/ есть подкаталог, в котором содержится по одной записи на каждое пространство имён, через которые ими можно управлять с помощью setns().
$ ls -l /proc/$$/ns total 0 lrwxrwxrwx. 1 mtk mtk 0 Apr 28 12:46 cgroup -> cgroup:[4026531835] lrwxrwxrwx. 1 mtk mtk 0 Apr 28 12:46 ipc -> ipc:[4026531839] lrwxrwxrwx. 1 mtk mtk 0 Apr 28 12:46 mnt -> mnt:[4026531840] lrwxrwxrwx. 1 mtk mtk 0 Apr 28 12:46 net -> net:[4026531969] lrwxrwxrwx. 1 mtk mtk 0 Apr 28 12:46 pid -> pid:[4026531836] lrwxrwxrwx. 1 mtk mtk 0 Apr 28 12:46 pid_for_children -> pid:[4026531834] lrwxrwxrwx. 1 mtk mtk 0 Apr 28 12:46 user -> user:[4026531837] lrwxrwxrwx. 1 mtk mtk 0 Apr 28 12:46 uts -> uts:[4026531838]
При привязке монтирования (bind mounting) (смотрите mount(2)) одного из файлов этого каталога в другое место в файловой системе данное пространство имён процесса с pid не удаляется, даже если все процессы в пространстве имён завершились.
При открытии одного из файлов этого каталога (или файла, который был привязан монтированием в один из этих файлов) возвращается файловый описатель соответствующего пространства имён процесса заданного pid. Пока этот файловый дескриптор остаётся открытым, пространство имён будет оставаться действующим, даже если все процессы в пространстве имён завершились. Файловый дескриптор может быть передан в setns(2).
В Linux 3.7 и старее эти файлы видимы как жёсткие ссылки. Начиная с Linux 3.8 они представляются символьными ссылками. Если два процесса находятся в одном пространстве имён, то значения идентификаторов устройств и номера инод их символьных ссылок /proc/[pid]/ns/xxx одинаковы; приложение может проверить это через поля stat.st_dev и stat.st_ino, возвращаемые stat(2). Содержимое этой символьной ссылки представляет собой строку с типом пространства имён и значением иноды:
$ readlink /proc/$$/ns/uts uts:[4026531838]
В этом подкаталоге содержатся символические ссылки:
/proc/[pid]/ns/cgroup (начиная с Linux 4.6)
Данный файл является описателем пространства имён cgroup этого процесса.
/proc/[pid]/ns/ipc (начиная с Linux 3.0)
Данный файл является описателем пространства имён IPC этого процесса.
/proc/[pid]/ns/mnt (начиная с Linux 3.8)
Данный файл является описателем пространства имён mount этого процесса.
/proc/[pid]/ns/net (начиная с Linux 3.0)
Данный файл является описателем пространства имён network этого процесса.
/proc/[pid]/ns/pid (начиная с Linux 3.8)
Этот является описателем пространства имён PID этого процесса. Данный описатель постоянен на протяжении всей жизни процесса (т. е., членство пространства имён PID процесса никогда не меняется).
/proc/[pid]/ns/pid_for_children (начиная с Linux 4.12)
Этот файл является описателем пространства имён PID дочерних процессов, созданных этим процессом. Он может изменяться послевызовов unshare(2) и setns(2) (смотрите pid_namespaces(7)), поэтому файл может отличаться от /proc/[pid]/ns/pid. Данные по символьной ссылке появляются только после создания в пространстве имён первого дочернего процесса (до этого вызов readlink(2) с символьной ссылкой вернёт пустой буфер).
/proc/[pid]/ns/user (начиная с Linux 3.8)
Данный файл является описателем пространства имён user этого процесса.
/proc/[pid]/ns/uts (начиная с Linux 3.0)
Данный файл является описателем пространства имён UTS этого процесса.
Право разыменовывать или читать (readlink(2)) данные символические ссылки определяется проверкой режима доступа ptrace PTRACE_MODE_READ_FSCREDS; смотрите ptrace(2).

Каталог /proc/sys/user

Файлы в каталоге /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_user_namespaces
Значение в этом файле определяет ограничение по каждому пользователю на количество пользовательских пространств имён, которые могут быть созданы в пространстве имён пользователя.
max_uts_namespaces
Значение в этом файле определяет ограничение по каждому пользователю на количество пространств имён uts, которые могут быть созданы в пространстве имён пользователя.
Замечания к этим файлам:
* Значения в этих файлам могут изменяться привилегированными процессами.
* Значения, отражаемые в этих файлах, являются ограничениями пользовательского пространства имён, в котором располагается открывающий процесс.
* Ограничение устанавливается по каждому пользователю отдельно. Каждый пользователь в одном пространстве имён пользователя может создать столько пространств имён, сколько допускается это ограничение.
* Ограничения применяются ко всем пользователям, даже имеющим UID 0.
* Эти ограничения применяются в дополнении к другим накладываемым ограничениям, касающимся каждого пространства имён (например, для пользовательского пространства имён и пространства имён PID).
* При достижении этих ограничений вызовы clone(2) и unshare(2) завершаются ошибкой ENOSPC.
* Для первоначального пространства пользовательского пространства имён значение по умолчанию в каждом файле равно половине ограничения на количество нитей, которые могут быть созданы (/proc/sys/kernel/threads-max). В всех дочерних пользовательских пространств имён значение по умолчанию каждого файла равно MAXINT.
* Когда пространство имён создаётся, этот объект также учитывается в родительских пространствах имён. То есть:
+ Каждое пользовательское пространство имён имен создателя UID.
+ Когда пространство имён создаётся, это учитывается в UID создателя в каждом родительском пользовательском пространстве имён, и ядро проверяет, что соответствующее ограничение на пространство имён для UID создателя не превысило значение в родительском пространстве имён.
+ Это гарантирует, что созданием нового пользовательского пространства имён нельзя воспользоваться для выхода за ограничения, установленные для текущего пользователя.

Пространства имён cgroup (CLONE_NEWCGROUP)

Смотрите cgroup_namespaces(7).

Пространства имён IPC (CLONE_NEWIPC)

Смотрите ipc_namespaces(7).

Пространства имён network (CLONE_NEWNET)

Смотрите network_namespaces(7).

Пространства имён mount (CLONE_NEWNS)

Смотрите mount_namespaces(7).

Пространства имён PID (CLONE_NEWPID)

Смотрите pid_namespaces(7).

Пространства имён user (CLONE_NEWUSER)

Смотрите user_namespaces(7).

Пространства имён UTS (CLONE_NEWUTS)

Смотрите uts_namespaces(7).

Время жизни пространства имён

При отсутствии других факторов, пространство имён автоматически удаляется, когда последний процесс в пространстве имён завершается или покидает его. Однако есть несколько факторов, которые могут задержать существование пространства имён даже при отсутствии процессов в нём. К таким факторам относятся следующие:
* Существуют открытый дескриптор файла или привязанное монтирование для соответствующего файла /proc/[pid]/ns/*.
* Пространство имён иерархично (т. е., пространство имён PID или пользовательское) и имеет дочернее пространство имён.
* Это пользовательское пространство имен, которое владеет одним или несколькими непользовательскими пространствами имён.
* Это пространство имён PID и существует процесс, который ссылается на пространство имён через символьную ссылку /proc/[pid]/ns/pid_for_children.
* Это пространство имён IPC и соответствующее монтирование файловой системы mqueue (смотрите mq_overview(7)) ссылается на это пространство имён.
* Это пространство имён PID и соответствующее монтирование файловой системы proc(5) ссылается на это пространство имён.

ПРИМЕР

Смотрите clone(2) и user_namespaces(7).
⇧ Top