namespaces(7)
| NAMESPACES(7) | Руководство программиста Linux | 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) перемещает вызывающий процесс в новое пространство имён. Если в аргументе 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)
| 2019-08-02 | Linux |
