Provided by: manpages-ru_4.17.0-2_all bug

ИМЯ

       cgroup_namespaces - обзор пространств имён Linux cgroup

ОПИСАНИЕ

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

       Cgroup namespaces virtualize the view of a process's cgroups (see cgroups(7))  as seen via
       /proc/pid/cgroup and /proc/pid/mountinfo.

       Each cgroup namespace has its own set of cgroup root directories.  These root  directories
       are  the  base points for the relative locations displayed in the corresponding records in
       the /proc/pid/cgroup file.  When a process creates a new cgroup namespace  using  clone(2)
       or  unshare(2)  with  the CLONE_NEWCGROUP flag, its current cgroups directories become the
       cgroup root directories of the new namespace.  (This applies both for the cgroups  version
       1 hierarchies and the cgroups version 2 unified hierarchy.)

       When  reading  the  cgroup  memberships  of  a "target" process from /proc/pid/cgroup, the
       pathname shown in the third field of each record will be relative to the reading process's
       root  directory  for  the  corresponding cgroup hierarchy.  If the cgroup directory of the
       target process lies outside the root directory of the reading process's cgroup  namespace,
       then the pathname will show ../ entries for each ancestor level in the cgroup hierarchy.

       Следующий пример сеанса демонстрирует создание нового пространства имён cgroup.

       Сначала  (от  суперпользователя)  в  оболочке начального пространства имён cgroup создадим
       дочернюю cgroup в иерархии  freezer  и  поместим  в  эту  cgroup  процесс,  который  будет
       использоваться как часть демонстрации далее:

           # mkdir -p /sys/fs/cgroup/freezer/sub2
           # sleep 10000 &     # создать процесс, который живёт какое-то время
           [1] 20124
           # echo 20124 > /sys/fs/cgroup/freezer/sub2/cgroup.procs

       Затем создадим другую дочернюю cgroup в иерархии freezer и поместим оболочку в эту cgroup:

           # mkdir -p /sys/fs/cgroup/freezer/sub
           # echo $$                      # выводим PID этой оболочки
           30655
           # echo 30655 > /sys/fs/cgroup/freezer/sub/cgroup.procs
           # cat /proc/self/cgroup | grep freezer
           7:freezer:/sub

       Затем  с помощью unshare(1) создаётся процесс, выполняющий новую оболочку в новой cgroup и
       монтируется пространство имён:

           # PS1="sh2# " unshare -Cm bash

       From the new shell started by unshare(1), we then inspect the /proc/pid/cgroup  files  of,
       respectively, the new shell, a process that is in the initial cgroup namespace (init, with
       PID 1), and the process in the sibling cgroup (sub2):

           sh2# cat /proc/self/cgroup | grep freezer
           7:freezer:/
           sh2# cat /proc/1/cgroup | grep freezer
           7:freezer:/..
           sh2# cat /proc/20124/cgroup | grep freezer
           7:freezer:/../sub2

       В  выводе  первой  команды  мы  видим,  что  в  cgroup  freezer  членство  новой  оболочки
       (находящейся  в той же cgroup, что и начальная оболочка) определено относительно корневого
       каталога cgroup freezer, который был назначен при создании нового пространства имён cgroup
       (в абсолютном выражении, новая оболочка находится в /sub freezer cgroup и корневой каталог
       иерархии freezer cgroup в новом пространстве имён cgroup также находится в /sub. То  есть,
       членство cgroup новой оболочки показывается как '/').

       Однако, если посмотреть /proc/self/mountinfo, то можно увидеть следующую аномалию:

           sh2# cat /proc/self/mountinfo | grep freezer
           155 145 0:32 /.. /sys/fs/cgroup/freezer ...

       Четвёртое  поле  в  этой  строке (/..) должен содержать каталог в файловой системе cgroup,
       который является корнем этого монтирования. Так как по определению пространств имён cgroup
       текущий  каталог freezer cgroup процесса становится его корневым каталогом freezer cgroup,
       в этом поле мы  должны  увидеть  '/'.  Проблема  здесь  в  том,  что  мы  видим  запись  о
       монтировании  для  файловой  системы cgroup, которая соответствует начальному пространству
       имён cgroup (чья  файловая  система  cgroup  действительно  имеет  корень  в  родительском
       каталоге  sub).  Чтобы  это  исправить  нам нужно перемонтировать файловую систему freezer
       cgroup из новой оболочки (т. е. выполнить монтирование из процесса,  который  находится  в
       новом пространстве имён cgroup), после чего мы увидим ожидаемый результат:

           sh2# mount --make-rslave /     # Don't propagate mount events
                                          # to other namespaces
           sh2# umount /sys/fs/cgroup/freezer
           sh2# mount -t cgroup -o freezer freezer /sys/fs/cgroup/freezer
           sh2# cat /proc/self/mountinfo | grep freezer
           155 145 0:32 / /sys/fs/cgroup/freezer rw,relatime ...

СТАНДАРТЫ

       Пространства имён есть только в Linux.

ЗАМЕЧАНИЯ

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

       Виртуализация, предоставляемая пространствами имён cgroup, подходит для решения нескольких
       задач:

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

       •  Облегчение  задач по переносу контейнера. Виртуализация, предоставляемая пространствами
          имён cgroup, позволяет контейнерам не знать информацию о путях родительских cgroup. Без
          такой  изоляции  потребовалось  бы  воссоздавать  полные  пути  cgroup  (показываемые в
          /proc/self/cgroups) в целевой системе при переносе контейнера; также  эти  пути  должны
          были быть уникальными, чтобы они не пересекались с другими путями в целевой системе.

       •  Обеспечивает  лучшее  разграничение  контейнеризированных  процессов,  так как возможно
          смонтировать файловые системы cgroup контейнера таким образом, что процессы  контейнера
          не  смогут  получить  доступ к каталогам предка cgroup. Рассмотрим, например, следующий
          сценарий:

          •  Есть каталог cgroup /cg/1, который принадлежит пользователю с ID 9000.

          •  Есть процесс X, который также принадлежит пользователю с ID  9000,  он  находится  в
             пространстве  имён  под  /cg/1/2  (т. е., X помещён в новое пространство имён cgroup
             посредством clone(2) или unshare(2) с флагом CLONE_NEWCGROUP).

          In the absence of cgroup namespacing, because the cgroup directory /cg/1 is owned  (and
          writable)  by  UID 9000 and process X is also owned by user ID 9000, process X would be
          able to modify the contents of cgroups files (i.e., change cgroup settings) not only in
          /cg/1/2  but  also in the ancestor cgroup directory /cg/1.  Namespacing process X under
          the cgroup directory /cg/1/2, in combination with suitable  mount  operations  for  the
          cgroup  filesystem  (as  shown  above),  prevents it modifying files in /cg/1, since it
          cannot even see the contents of that directory (or of further removed  cgroup  ancestor
          directories).   Combined with correct enforcement of hierarchical limits, this prevents
          process X from escaping the limits imposed by ancestor cgroups.

СМ. ТАКЖЕ

       unshare(1),  clone(2),  setns(2),   unshare(2),   proc(5),   cgroups(7),   credentials(7),
       namespaces(7), user_namespaces(7)

ПЕРЕВОД

       Русский    перевод    этой    страницы    руководства    был    сделан   Azamat   Hackimov
       <azamat.hackimov@gmail.com>, Dmitriy  S.  Seregin  <dseregin@59.ru>,  Dmitry  Bolkhovskikh
       <d20052005@yandex.ru>,    Katrin    Kutepova    <blackkatelv@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⟩.