cgroup_namespaces(7)

ИМЯ
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.