Provided by: manpages-ru_4.19.0-7_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 — это односторонняя
       операция.

       Операцию NS_GET_PARENT ioctl(2) можно  использовать  для  обнаружения  родительской  связи
       между пространствами имён PID; смотрите ioctl_ns(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>,  Kogan,  Max   Is
       <ismax799@gmail.com>, Yuri Kozlov <yuray@komyakino.ru> и Иван Павлов <pavia00@gmail.com>

       Этот  перевод  является  бесплатной  документацией;  прочитайте  Стандартную  общественную
       лицензию GNU версии 3 ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩ или более позднюю, чтобы
       узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.

       Если  вы  обнаружите  ошибки  в  переводе этой страницы руководства, пожалуйста, отправьте
       электронное письмо на ⟨man-pages-ru-talks@lists.sourceforge.net⟩.