Provided by: manpages-ru_4.27.0-1_all bug

НАИМЕНОВАНИЕ

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

ОПИСАНИЕ

       Обзор пространств имён смотрите в namespaces(7).

       Пространства имён PID изолируют пространство номеров идентификаторов процессов, то есть процессы в разных
       пространствах  имён  PID  могут  иметь  единый   PID. Пространства имён PID позволяют предоставлять такие
       возможности в контейнерах как приостановку/возобновление работы набора процессов в контейнере  и  перенос
       контейнера на новый узел, при чём процессы внутри контейнера сохранят свои PID.

       Идентификаторы  в  новом пространстве имён PID начинаются с 1 как в автономной системе, и вызовы fork(2),
       vfork(2) или clone(2) будут создавать процессы с уникальными  идентификаторами  в  пределах  пространства
       имён.

       Для использования пространств имён PID требуется, чтобы ядро было собрано с параметром CONFIG_PID_NS.

   Пространство имён начального процесса
       Первый  процесс, созданный в новом пространстве имён (т. е., процесс, созданный вызовом clone(2) с флагом
       CLONE_NEWPID или первый потомок, созданный процессом после вызова unshare(2) с флагом CLONE_NEWPID) имеет
       PID 1, и это «начальный» (init) процесс пространства имён (смотрите  init(1)).  Этот  процесс  становится
       родителем всех дочерних процессов, которые осиротели из-за завершения родителей, находящихся внутри этого
       пространства имён PID (дополнительную информацию смотрите ниже).

       If  the  "init"  process of a PID namespace terminates, the kernel terminates all of the processes in the
       namespace via a SIGKILL 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 fork(2)  into  this  PID  namespace
       fail  with  the  error ENOMEM; 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  /proc/pid/ns/pid  file corresponding to a process that was in a namespace to setns(2)
       into that namespace after the "init" process has terminated.  Another possible scenario can occur after a
       call to unshare(2): if the first child subsequently created by a  fork(2)   terminates,  then  subsequent
       calls to fork(2)  fail with ENOMEM.

       Члены  пространства  имён  PID  могут посылать процессу «init» только сигналы, для которых процесс «init»
       установил обработчики. Это ограничение применяется даже к привилегированным  процессам,  и  не  позволяет
       другим членам пространства имён PID нечаянно убить процесс «init».

       Likewise,  a  process  in  an  ancestor namespace can—subject to the usual permission checks described in
       kill(2)—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 siginfo_t si_pid field described in
       sigaction(2)  will be zero.)  SIGKILL or SIGSTOP 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).

       Начиная  с  Linux  3.4,  системный  вызов  reboot(2) посылает сигнал в пространство имён процесса «init».
       Подробности смотрите в reboot(2).

   Вложенные пространства имён PID
       Пространства имён PID могут быть вложенными: каждое пространство имён PID имеет родителя, за  исключением
       начального  («корневого»)  пространства  имён PID. Родитель пространства имён PID — это пространство имён
       PID процесса, который был создан в пространстве имён с помощью clone(2)  или  unshare(2).  Таким  образом
       пространства  имён  PID образуют дерево со всеми пространствами имён по которому, в конечном счёте, можно
       проследить их родословную до корневого пространства имён. Начиная с Linux 3.7, ядро ограничивает  глубину
       максимальной вложенности пространств имён PID значением 32.

       Процесс видим другим процессам в своём пространстве имён PID, и процессам в  каждом  прямом  родительском
       пространстве  имён  PID вплоть до корневого пространства имён PID. В этом контексте «видимость» означает,
       что  процесс  может  быть  целью  операции  другого  процесса  в  системных  вызовах,  который  указывает
       идентификатор  процесса.  И  наоборот,  процессы  в  дочернем  пространстве  имён PID не видят процессы в
       родительском и более удалённых родительских  пространствах  имён.  Более  кратко:  процесс  может  видеть
       (например, посылать сигналы с помощью kill(2), назначать значения уступчивости с помощью setpriority(2) и
       т. п.) только процессы из своего пространства имён PID и в потомках этого пространства имён.

       Процесс  имеет идентификатор в каждом слое иерархии пространства имён PID, в котором он виден, и двигаясь
       назад, в каждом прямом предке пространства имён вплоть до  корневого  пространства  имён  PID.  Системные
       вызовы,  работающие с идентификатором процесса, всегда используют идентификатор процесса, который видим в
       пространстве имён PID вызывающего. Вызов getpid(2) всегда возвращает PID, связанный с пространством имён,
       в котором был создан процесс.

       Некоторые процессы в пространстве имён PID могут иметь  родителей,  которые  находятся  вне  пространства
       имён.  Например,  родитель  начального  процесса  в  пространстве  имён  (т. е., процесс init(1) с PID 1)
       неизбежно находится в другом пространстве имён. Аналогичным образом,  прямые  потомки  процесса,  который
       использует  setns(2)  для  объединения  потомков в пространство имён PID, находятся в другом пространстве
       имён PID относительно вызывающего setns(2). При вызове getppid(2) для таких процессов возвращает 0.

       Хотя процессы могут свободно перемещаться вниз в дочерние пространства  имён  PID  (например,  с  помощью
       setns(2)  с  файловым  дескриптором  пространства  имён  PID),  они  не  могут  перемещаться  в  обратном
       направлении. То есть процессы не могут входить в пространства имён  предка  (родителя,  прародителя  и  т
       .п.). Изменение пространств имён PID — это односторонняя операция.

       The  NS_GET_PARENT  ioctl(2)   operation  can  be  used to discover the parental relationship between PID
       namespaces; see ioctl_nsfs(2).

   Семантика setns(2) и unshare(2)
       Calls to setns(2)  that specify a PID namespace  file  descriptor  and  calls  to  unshare(2)   with  the
       CLONE_NEWPID  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
       /proc/pid/ns/pid_for_children  file, as described in namespaces(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 getpid()), which would break many applications and libraries.

       Посмотрим  на  вещи под другим углом: членство процесса в пространстве имён PID определяется при создании
       процесса и не может быть изменено в дальнейшем. Помимо прочего, это означает, что  родственные  отношения
       между  процессами  зеркально  отражают  родственные  отношения  между  пространствами  имён PID: родитель
       процесса находится в том же пространстве имён  или  в  непосредственном  родительском  пространстве  имён
       namespace.

       A  process  may  call  unshare(2)   with  the  CLONE_NEWPID  flag only once.  After it has performed this
       operation, its /proc/pid/ns/pid_for_children symbolic link will be empty until the first child is created
       in the namespace.

   Усыновление осиротевших потомков
       Когда дочерний процесс становится сиротой, его родителем становится «начальный»  процесс  в  пространстве
       имён  PID его родителя (если один из ближайших родственных процессов родителя не вызывал команду prctl(2)
       PR_SET_CHILD_SUBREAPER для назначения  себя  сборщиком  собирателем  дочерних  процессов).  Заметим,  что
       благодаря  семантике  setns(2) и unshare(2), описанной выше, это может быть процесс «init» в пространстве
       имён PID, являющийся родителем пространства имён PID потомка, а не процесс «init» пространства  имён  PID
       самого потомка.

   Совместимость CLONE_NEWPID с другими флагами CLONE_*
       In  current versions of Linux, CLONE_NEWPID can't be combined with CLONE_THREAD.  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 proc(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 siginfo_t type
       in  sigaction(2)).   Since this is computed when a signal is enqueued, a signal queue shared by processes
       in multiple PID namespaces would defeat that.

       В ранних версиях Linux значение CLONE_NEWPID также запрещалось (возвращалась ошибка EINVAL) объединять  с
       CLONE_SIGHAND  (до  Linux  4.3),  а также с CLONE_VM (до Linux 3.12). Изменения, снявшие эти ограничения,
       были также перенесены в более ранние стабильные ядра.

   /proc и PID пространств имен
       A /proc filesystem shows (in the /proc/pid directories) only processes visible in the  PID  namespace  of
       the  process  that  performed  the  mount, even if the /proc filesystem is viewed from processes in other
       namespaces.

       После создания  нового  пространства  имён  PID  у  потомка  полезно  изменить  его  корневой  каталог  и
       смонтировать  новый  экземпляр  procfs в /proc для того, чтобы корректно работали инструменты типа ps(1).
       Если одновременно создаётся  новое  пространство  имён  монтирования,  добавлением  флага  CLONE_NEWNS  в
       аргумент  flags  вызова  clone(2)  или  unshare(2),  то  необязательно  изменять  корневой каталог: новый
       экземпляр procfs можно смонтировать непосредственно в /proc.

       Команда оболочки для монтирования /proc:

           $ mount -t proc proc /proc

       Вызов readlink(2) с путём /proc/self выдаёт идентификатор процесса вызывающего из пространства имён  PID,
       откуда  смонтирован  procfs  (т.  е., из пространства имён PID процесса, который смонтировал procfs). Это
       может быть полезно при самоанализе, когда процесс хочет узнать свой PID в других пространствах имён.

   Файлы в /proc
       /proc/sys/kernel/ns_last_pid (начиная с Linux 3.3)
              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.

              This   file   is  writable  by  a  process  that  has  the  CAP_SYS_ADMIN  or  (since  Linux  5.9)
              CAP_CHECKPOINT_RESTORE 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.

   Разное
       Когда идентификатор процесса передаётся через доменный сокет UNIX в процесс в  другом  пространстве  имён
       PID  (смотрите описание SCM_CREDENTIALS в unix(7)), то он транслируется в соответствующее значения PID из
       пространства имён PID принимающего процесса.

СТАНДАРТЫ

       Linux.

ПРИМЕРЫ

       См. user_namespaces(7).

СМОТРИТЕ ТАКЖЕ

       clone(2), reboot(2), setns(2), unshare(2), proc(5), capabilities(7), credentials(7), mount_namespaces(7),
       namespaces(7), user_namespaces(7), switch_root(8)

ПЕРЕВОД

       Русский    перевод    этой    страницы    руководства    разработал(и)    Alexey,     Azamat     Hackimov
       <azamat.hackimov@gmail.com>,       kogamatranslator49       <r.podarov@yandex.ru>,      Darima      Kogan
       <silverdk99@gmail.com>, Max  Is  <ismax799@gmail.com>,  Yuri  Kozlov  <yuray@komyakino.ru>,  Иван  Павлов
       <pavia00@gmail.com> и Kirill Rekhov <krekhov.dev@gmail.com>

       Этот  перевод является свободной программной документацией; он распространяется на условиях общедоступной
       лицензии GNU (GNU General Public License - GPL, https://www.gnu.org/licenses/gpl-3.0.html  версии  3  или
       более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.

       Если  вы  обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом
       разработчику(ам)  по  его(их)  адресу(ам)  электронной  почты  или  по   адресу   списка рассылки русских
       переводчиков.

Справочные страницы Linux 6.9.1                  13 июня 2024 г.                               pid_namespaces(7)