- bullseye-backports 4.18.1-1~bpo11+1
CGROUP_NAMESPACES(7) | Руководство программиста Linux | CGROUP_NAMESPACES(7) |
ИМЯ¶
cgroup_namespaces - обзор пространств имён Linux cgroup
ОПИСАНИЕ¶
Обзор пространств имён смотрите в namespaces(7).
Пространства имён cgroup_namespaces виртуализируют представление о cgroup процесса (смотрите cgroups(7)) в виде /proc/[pid]/cgroup и /proc/[pid]/mountinfo.
Каждое пространство имён cgroup имеет свой набор корневых каталогов cgroup. Данные корневые каталоги являются базовыми точками относительных расположений, показываемых в соответствующих записях файла /proc/[pid]/cgroup. Когда процесс создаёт новое пространство имён cgroup с помощью clone(2) или unshare(2) с флагом CLONE_NEWCGROUP, то его текущие каталоги cgroups становятся корневыми каталогами cgroup нового пространства имён (это применимо как для иерархии cgroups версии 1, так и для унифицированной иерархии cgroups версии 2).
При чтении членов cgroup «целевого» процесса из /proc/[pid]/cgroup путь в третьем поле каждой записи будет относительным по отношению к корневому каталогу cgroup читающего процесса для соответствующей иерархии cgroup. Если каталог cgroup процесса назначения лежит вне корневого каталоге пространства имён cgroup читающего процесса, то путь будет показан как ../ для каждого уровня предка в иерархии cgroup.
Следующий пример сеанса демонстрирует создание нового пространства имён 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
Из новой оболочки, запущенной unshare(1), теперь файлы /proc/[pid]/cgroup содержат, соответственно, новый процесс-оболочку, процесс, находящийся в первоначальном пространстве имён cgroup (init с PID 1) и процесс в родственной 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)
ЗАМЕЧАНИЯ¶
Эта страница является частью проекта Linux man-pages версии 5.10. Описание проекта, информацию об ошибках и последнюю версию этой страницы можно найти по адресу https://www.kernel.org/doc/man-pages/.
ПЕРЕВОД¶
Русский перевод этой страницы руководства был сделан 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 или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.
Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на man-pages-ru-talks@lists.sourceforge.net.
1 ноября 2020 г. | Linux |