NAMESPACES(7)

ИМЯ
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).

СМОТРИТЕ ТАКЖЕ
nsenter(1), readlink(1), unshare(1), clone(2), ioctl_ns(2), setns(2), unshare(2), proc(5), capabilities(7), cgroup_namespaces(7), cgroups(7), credentials(7), ipc_namespaces(7), network_namespaces(7), pid_namespaces(7), user_namespaces(7), uts_namespaces(7), lsns(8), pam_namespace(8), switch_root(8)