.\" -*- coding: UTF-8 -*- .\" Copyright (c) 2013 by Michael Kerrisk .\" and Copyright (c) 2012 by Eric W. Biederman .\" .\" SPDX-License-Identifier: Linux-man-pages-copyleft .\" .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH pid_namespaces 7 "30 марта 2023 г." "Linux man\-pages 6.05.01" .SH ИМЯ pid_namespaces \- обзор пространств имён Linux PID .SH ОПИСАНИЕ Обзор пространств имён смотрите в \fBnamespaces\fP(7). .PP Пространства имён PID изолируют пространство номеров идентификаторов процессов, то есть процессы в разных пространствах имён PID могут иметь единый PID. Пространства имён PID позволяют предоставлять такие возможности в контейнерах как приостановку/возобновление работы набора процессов в контейнере и перенос контейнера на новый узел, при чём процессы внутри контейнера сохранят свои PID. .PP Идентификаторы в новом пространстве имён PID начинаются с 1 как в автономной системе, и вызовы \fBfork\fP(2), \fBvfork\fP(2) или \fBclone\fP(2) будут создавать процессы с уникальными идентификаторами в пределах пространства имён. .PP .\" .\" ============================================================ .\" Для использования пространств имён PID требуется, чтобы ядро было собрано с параметром \fBCONFIG_PID_NS\fP. .SS "Пространство имён начального процесса" Первый процесс, созданный в новом пространстве имён (т. е., процесс, созданный вызовом \fBclone\fP(2) с флагом \fBCLONE_NEWPID\fP или первый потомок, созданный процессом после вызова \fBunshare\fP(2) с флагом \fBCLONE_NEWPID\fP) имеет PID 1, и это «начальный» (init) процесс пространства имён (смотрите \fBinit\fP(1)). Этот процесс становится родителем всех дочерних процессов, которые осиротели из\-за завершения родителей, находящихся внутри этого пространства имён PID (дополнительную информацию смотрите ниже). .PP If the "init" process of a PID namespace terminates, the kernel terminates all of the processes in the namespace via a \fBSIGKILL\fP signal. This behavior reflects the fact that the "init" process is essential for the correct operation of a PID namespace. In this case, a subsequent \fBfork\fP(2) into this PID namespace fail with the error \fBENOMEM\fP; it is not possible to create a new process in a PID namespace whose "init" process has terminated. Such scenarios can occur when, for example, a process uses an open file descriptor for a \fI/proc/\fPpid\fI/ns/pid\fP file corresponding to a process that was in a namespace to \fBsetns\fP(2) into that namespace after the "init" process has terminated. Another possible scenario can occur after a call to \fBunshare\fP(2): if the first child subsequently created by a \fBfork\fP(2) terminates, then subsequent calls to \fBfork\fP(2) fail with \fBENOMEM\fP. .PP Члены пространства имён PID могут посылать процессу «init» только сигналы, для которых процесс «init» установил обработчики.\ Это ограничение применяется даже к привилегированным процессам, и не позволяет другим членам пространства имён PID нечаянно убить процесс «init». .PP Likewise, a process in an ancestor namespace can\[em]subject to the usual permission checks described in \fBkill\fP(2)\[em]send signals to the "init" process of a child PID namespace only if the "init" process has established a handler for that signal. (Within the handler, the \fIsiginfo_t\fP \fIsi_pid\fP field described in \fBsigaction\fP(2) will be zero.) \fBSIGKILL\fP or \fBSIGSTOP\fP are treated exceptionally: these signals are forcibly delivered when sent from an ancestor PID namespace. Neither of these signals can be caught by the "init" process, and so will result in the usual actions associated with those signals (respectively, terminating and stopping the process). .PP .\" .\" ============================================================ .\" Начиная с Linux 3.4, системный вызов \fBreboot\fP(2) посылает сигнал в пространство имён процесса «init». Подробности смотрите в \fBreboot\fP(2). .SS "Вложенные пространства имён PID" .\" commit f2302505775fd13ba93f034206f1e2a587017929 .\" The kernel constant MAX_PID_NS_LEVEL Пространства имён PID могут быть вложенными: каждое пространство имён PID имеет родителя, за исключением начального («корневого») пространства имён PID. Родитель пространства имён PID — это пространство имён PID процесса, который был создан в пространстве имён с помощью \fBclone\fP(2) или \fBunshare\fP(2). Таким образом пространства имён PID образуют дерево со всеми пространствами имён по которому, в конечном счёте, можно проследить их родословную до корневого пространства имён. Начиная с Linux 3.7, ядро ограничивает глубину максимальной вложенности пространств имён PID значением 32. .PP Процесс видим другим процессам в своём пространстве имён PID, и процессам в каждом прямом родительском пространстве имён PID вплоть до корневого пространства имён PID. В этом контексте «видимость» означает, что процесс может быть целью операции другого процесса в системных вызовах, который указывает идентификатор процесса. И наоборот, процессы в дочернем пространстве имён PID не видят процессы в родительском и более удалённых родительских пространствах имён. Более кратко: процесс может видеть (например, посылать сигналы с помощью \fBkill\fP(2), назначать значения уступчивости с помощью \fBsetpriority\fP(2) и т. п.) только процессы из своего пространства имён PID и в потомках этого пространства имён. .PP Процесс имеет идентификатор в каждом слое иерархии пространства имён PID, в котором он виден, и двигаясь назад, в каждом прямом предке пространства имён вплоть до корневого пространства имён PID. Системные вызовы, работающие с идентификатором процесса, всегда используют идентификатор процесса, который видим в пространстве имён PID вызывающего. Вызов \fBgetpid\fP(2) всегда возвращает PID, связанный с пространством имён, в котором был создан процесс. .PP Некоторые процессы в пространстве имён PID могут иметь родителей, которые находятся вне пространства имён. Например, родитель начального процесса в пространстве имён (т. е., процесс \fBinit\fP(1) с PID 1) неизбежно находится в другом пространстве имён. Аналогичным образом, прямые потомки процесса, который использует \fBsetns\fP(2) для объединения потомков в пространство имён PID, находятся в другом пространстве имён PID относительно вызывающего \fBsetns\fP(2). При вызове \fBgetppid\fP(2) для таких процессов возвращает 0. .PP Хотя процессы могут свободно перемещаться вниз в дочерние пространства имён PID (например, с помощью \fBsetns\fP(2) с файловым дескриптором пространства имён PID), они не могут перемещаться в обратном направлении. То есть процессы не могут входить в пространства имён предка (родителя, прародителя и т .п.). Изменение пространств имён PID — это односторонняя операция. .PP .\" .\" ============================================================ .\" Операцию \fBNS_GET_PARENT\fP \fBioctl\fP(2) можно использовать для обнаружения родительской связи между пространствами имён PID; смотрите \fBioctl_ns\fP(2). .SS "Семантика setns(2) и unshare(2)" Calls to \fBsetns\fP(2) that specify a PID namespace file descriptor and calls to \fBunshare\fP(2) with the \fBCLONE_NEWPID\fP flag cause children subsequently created by the caller to be placed in a different PID namespace from the caller. (Since Linux 4.12, that PID namespace is shown via the \fI/proc/\fPpid\fI/ns/pid_for_children\fP file, as described in \fBnamespaces\fP(7).) These calls do not, however, change the PID namespace of the calling process, because doing so would change the caller's idea of its own PID (as reported by \fBgetpid\fP()), which would break many applications and libraries. .PP Посмотрим на вещи под другим углом: членство процесса в пространстве имён PID определяется при создании процесса и не может быть изменено в дальнейшем. Помимо прочего, это означает, что родственные отношения между процессами зеркально отражают родственные отношения между пространствами имён PID: родитель процесса находится в том же пространстве имён или в непосредственном родительском пространстве имён namespace. .PP .\" .\" ============================================================ .\" A process may call \fBunshare\fP(2) with the \fBCLONE_NEWPID\fP flag only once. After it has performed this operation, its \fI/proc/\fPpid\fI/ns/pid_for_children\fP symbolic link will be empty until the first child is created in the namespace. .SS "Усыновление осиротевших потомков" .\" Furthermore, by definition, the parent of the "init" process .\" of a PID namespace resides in the parent PID namespace. .\" .\" ============================================================ .\" Когда дочерний процесс становится сиротой, его родителем становится «начальный» процесс в пространстве имён PID его родителя (если один из ближайших родственных процессов родителя не вызывал команду \fBprctl\fP(2) \fBPR_SET_CHILD_SUBREAPER\fP для назначения себя сборщиком собирателем дочерних процессов). Заметим, что благодаря семантике \fBsetns\fP(2) и \fBunshare\fP(2), описанной выше, это может быть процесс «init» в пространстве имён PID, являющийся \fIродителем\fP пространства имён PID потомка, а не процесс «init» пространства имён PID самого потомка. .SS "Совместимость CLONE_NEWPID с другими флагами CLONE_*" In current versions of Linux, \fBCLONE_NEWPID\fP can't be combined with \fBCLONE_THREAD\fP. Threads are required to be in the same PID namespace such that the threads in a process can send signals to each other. Similarly, it must be possible to see all of the threads of a process in the \fBproc\fP(5) filesystem. Additionally, if two threads were in different PID namespaces, the process ID of the process sending a signal could not be meaningfully encoded when a signal is sent (see the description of the \fIsiginfo_t\fP type in \fBsigaction\fP(2)). Since this is computed when a signal is enqueued, a signal queue shared by processes in multiple PID namespaces would defeat that. .PP .\" Note these restrictions were all introduced in .\" 8382fcac1b813ad0a4e68a838fc7ae93fa39eda0 .\" when CLONE_NEWPID|CLONE_VM was disallowed .\" (restriction lifted in faf00da544045fdc1454f3b9e6d7f65c841de302) .\" (restriction lifted in e79f525e99b04390ca4d2366309545a836c03bf1) .\" .\" ============================================================ .\" В ранних версиях Linux значение \fBCLONE_NEWPID\fP также запрещалось (возвращалась ошибка \fBEINVAL\fP) объединять с \fBCLONE_SIGHAND\fP (до Linux 4.3), а также с \fBCLONE_VM\fP (до Linux 3.12). Изменения, снявшие эти ограничения, были также перенесены в более ранние стабильные ядра. .SS "/proc и PID пространств имен" A \fI/proc\fP filesystem shows (in the \fI/proc/\fPpid directories) only processes visible in the PID namespace of the process that performed the mount, even if the \fI/proc\fP filesystem is viewed from processes in other namespaces. .PP После создания нового пространства имён PID у потомка полезно изменить его корневой каталог и смонтировать новый экземпляр procfs в \fI/proc\fP для того, чтобы корректно работали инструменты типа \fBps\fP(1). Если одновременно создаётся новое пространство имён монтирования, добавлением флага \fBCLONE_NEWNS\fP в аргумент \fIflags\fP вызова \fBclone\fP(2) или \fBunshare\fP(2), то необязательно изменять корневой каталог: новый экземпляр procfs можно смонтировать непосредственно в \fI/proc\fP. .PP Команда оболочки для монтирования \fI/proc\fP: .PP .in +4n .EX $ mount \-t proc proc /proc .EE .in .PP .\" .\" ============================================================ .\" Вызов \fBreadlink\fP(2) с путём \fI/proc/self\fP выдаёт идентификатор процесса вызывающего из пространства имён PID, откуда смонтирован procfs (т. е., из пространства имён PID процесса, который смонтировал procfs). Это может быть полезно при самоанализе, когда процесс хочет узнать свой PID в других пространствах имён. .SS "Файлы в /proc" .TP \fB/proc/sys/kernel/ns_last_pid\fP (начиная с Linux 3.3) .\" commit b8f566b04d3cddd192cfd2418ae6d54ac6353792 This file (which is virtualized per PID namespace) displays the last PID that was allocated in this PID namespace. When the next PID is allocated, the kernel will search for the lowest unallocated PID that is greater than this value, and when this file is subsequently read it will show that PID. .IP .\" This ability is necessary to support checkpoint restore in user-space .\" .\" ============================================================ .\" This file is writable by a process that has the \fBCAP_SYS_ADMIN\fP or (since Linux 5.9) \fBCAP_CHECKPOINT_RESTORE\fP capability inside the user namespace that owns the PID namespace. This makes it possible to determine the PID that is allocated to the next process that is created inside this PID namespace. .SS Разное Когда идентификатор процесса передаётся через доменный сокет UNIX в процесс в другом пространстве имён PID (смотрите описание \fBSCM_CREDENTIALS\fP в \fBunix\fP(7)), то он транслируется в соответствующее значения PID из пространства имён PID принимающего процесса. .SH СТАНДАРТЫ Linux. .SH ПРИМЕРЫ См. \fBuser_namespaces\fP(7). .SH "СМ. ТАКЖЕ" \fBclone\fP(2), \fBreboot\fP(2), \fBsetns\fP(2), \fBunshare\fP(2), \fBproc\fP(5), \fBcapabilities\fP(7), \fBcredentials\fP(7), \fBmount_namespaces\fP(7), \fBnamespaces\fP(7), \fBuser_namespaces\fP(7), \fBswitch_root\fP(8) .PP .SH ПЕРЕВОД Русский перевод этой страницы руководства был сделан Alexey, Azamat Hackimov , kogamatranslator49 , Kogan, Max Is , Yuri Kozlov и Иван Павлов . .PP Этот перевод является бесплатной документацией; прочитайте .UR https://www.gnu.org/licenses/gpl-3.0.html Стандартную общественную лицензию GNU версии 3 .UE или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ. .PP Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на .MT man-pages-ru-talks@lists.sourceforge.net .ME .