.\" -*- coding: UTF-8 -*- .\" Copyright (c) 2016 by Michael Kerrisk .\" .\" SPDX-License-Identifier: Linux-man-pages-copyleft .\" .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH cgroup_namespaces 7 "30 октября 2022 г." "Linux man\-pages 6.02" .SH ИМЯ cgroup_namespaces \- обзор пространств имён Linux cgroup .SH ОПИСАНИЕ Обзор пространств имён смотрите в \fBnamespaces\fP(7). .PP Cgroup namespaces virtualize the view of a process's cgroups (see \fBcgroups\fP(7)) as seen via \fI/proc/\fPpid\fI/cgroup\fP and \fI/proc/\fPpid\fI/mountinfo\fP. .PP 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 \fI/proc/\fPpid\fI/cgroup\fP file. When a process creates a new cgroup namespace using \fBclone\fP(2) or \fBunshare\fP(2) with the \fBCLONE_NEWCGROUP\fP 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.) .PP When reading the cgroup memberships of a "target" process from \fI/proc/\fPpid\fI/cgroup\fP, 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 \fI../\fP entries for each ancestor level in the cgroup hierarchy. .PP Следующий пример сеанса демонстрирует создание нового пространства имён cgroup. .PP Сначала (от суперпользователя) в оболочке начального пространства имён cgroup создадим дочернюю cgroup в иерархии \fIfreezer\fP и поместим в эту cgroup процесс, который будет использоваться как часть демонстрации далее: .PP .in +4n .EX # \fBmkdir \-p /sys/fs/cgroup/freezer/sub2\fP # \fBsleep 10000 &\fP # создать процесс, который живёт какое\-то время [1] 20124 # \fBecho 20124 > /sys/fs/cgroup/freezer/sub2/cgroup.procs\fP .EE .in .PP Затем создадим другую дочернюю cgroup в иерархии \fIfreezer\fP и поместим оболочку в эту cgroup: .PP .in +4n .EX # \fBmkdir \-p /sys/fs/cgroup/freezer/sub\fP # \fBecho $$\fP # выводим PID этой оболочки 30655 # \fBecho 30655 > /sys/fs/cgroup/freezer/sub/cgroup.procs\fP # \fBcat /proc/self/cgroup | grep freezer\fP 7:freezer:/sub .EE .in .PP Затем с помощью \fBunshare\fP(1) создаётся процесс, выполняющий новую оболочку в новой cgroup и монтируется пространство имён: .PP .in +4n .EX # \fBPS1="sh2# " unshare \-Cm bash\fP .EE .in .PP From the new shell started by \fBunshare\fP(1), we then inspect the \fI/proc/\fPpid\fI/cgroup\fP files of, respectively, the new shell, a process that is in the initial cgroup namespace (\fIinit\fP, with PID 1), and the process in the sibling cgroup (\fIsub2\fP): .PP .in +4n .EX sh2# \fBcat /proc/self/cgroup | grep freezer\fP 7:freezer:/ sh2# \fBcat /proc/1/cgroup | grep freezer\fP 7:freezer:/.. sh2# \fBcat /proc/20124/cgroup | grep freezer\fP 7:freezer:/../sub2 .EE .in .PP В выводе первой команды мы видим, что в cgroup freezer членство новой оболочки (находящейся в той же cgroup, что и начальная оболочка) определено относительно корневого каталога cgroup freezer, который был назначен при создании нового пространства имён cgroup (в абсолютном выражении, новая оболочка находится в \fI/sub\fP freezer cgroup и корневой каталог иерархии freezer cgroup в новом пространстве имён cgroup также находится в \fI/sub\fP. То есть, членство cgroup новой оболочки показывается как \(aq/\(aq). .PP Однако, если посмотреть \fI/proc/self/mountinfo\fP, то можно увидеть следующую аномалию: .PP .in +4n .EX sh2# \fBcat /proc/self/mountinfo | grep freezer\fP 155 145 0:32 /.. /sys/fs/cgroup/freezer ... .EE .in .PP Четвёртое поле в этой строке (\fI/..\fP) должен содержать каталог в файловой системе cgroup, который является корнем этого монтирования. Так как по определению пространств имён cgroup текущий каталог freezer cgroup процесса становится его корневым каталогом freezer cgroup, в этом поле мы должны увидеть \(aq/\(aq. Проблема здесь в том, что мы видим запись о монтировании для файловой системы cgroup, которая соответствует начальному пространству имён cgroup (чья файловая система cgroup действительно имеет корень в родительском каталоге \fIsub\fP). Чтобы это исправить нам нужно перемонтировать файловую систему freezer cgroup из новой оболочки (т. е. выполнить монтирование из процесса, который находится в новом пространстве имён cgroup), после чего мы увидим ожидаемый результат: .PP .in +4n .EX sh2# \fBmount \-\-make\-rslave /\fP # Don\(aqt propagate mount events # to other namespaces sh2# \fBumount /sys/fs/cgroup/freezer\fP sh2# \fBmount \-t cgroup \-o freezer freezer /sys/fs/cgroup/freezer\fP sh2# \fBcat /proc/self/mountinfo | grep freezer\fP 155 145 0:32 / /sys/fs/cgroup/freezer rw,relatime ... .EE .in .\" .SH СТАНДАРТЫ Пространства имён есть только в Linux. .SH ЗАМЕЧАНИЯ Для использования пространств имён cgroup требуется, чтобы ядро было собрано с параметром \fBCONFIG_CGROUPS\fP. .PP Виртуализация, предоставляемая пространствами имён cgroup, подходит для решения нескольких задач: .IP \(bu 3 Предотвращение утечек информации о путях каталогов cgroup за пределами контейнера, иначе они были бы видимы процессам в контейнере. Такие утечки могли, например, выдать информацию о платформе контейнера приложениям в контейнере. .IP \(bu Облегчение задач по переносу контейнера. Виртуализация, предоставляемая пространствами имён cgroup, позволяет контейнерам не знать информацию о путях родительских cgroup. Без такой изоляции потребовалось бы воссоздавать полные пути cgroup (показываемые в \fI/proc/self/cgroups\fP) в целевой системе при переносе контейнера; также эти пути должны были быть уникальными, чтобы они не пересекались с другими путями в целевой системе. .IP \(bu Обеспечивает лучшее разграничение контейнеризированных процессов, так как возможно смонтировать файловые системы cgroup контейнера таким образом, что процессы контейнера не смогут получить доступ к каталогам предка cgroup. Рассмотрим, например, следующий сценарий: .RS .IP \(bu 3 Есть каталог cgroup \fI/cg/1\fP, который принадлежит пользователю с ID 9000. .IP \(bu Есть процесс \fIX\fP, который также принадлежит пользователю с ID 9000, он находится в пространстве имён под \fI/cg/1/2\fP (т. е., \fIX\fP помещён в новое пространство имён cgroup посредством \fBclone\fP(2) или \fBunshare\fP(2) с флагом \fBCLONE_NEWCGROUP\fP). .RE .IP In the absence of cgroup namespacing, because the cgroup directory \fI/cg/1\fP is owned (and writable) by UID 9000 and process \fIX\fP is also owned by user ID 9000, process \fIX\fP would be able to modify the contents of cgroups files (i.e., change cgroup settings) not only in \fI/cg/1/2\fP but also in the ancestor cgroup directory \fI/cg/1\fP. Namespacing process \fIX\fP under the cgroup directory \fI/cg/1/2\fP, in combination with suitable mount operations for the cgroup filesystem (as shown above), prevents it modifying files in \fI/cg/1\fP, 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 \fIX\fP from escaping the limits imposed by ancestor cgroups. .SH "СМ. ТАКЖЕ" \fBunshare\fP(1), \fBclone\fP(2), \fBsetns\fP(2), \fBunshare\fP(2), \fBproc\fP(5), \fBcgroups\fP(7), \fBcredentials\fP(7), \fBnamespaces\fP(7), \fBuser_namespaces\fP(7) .PP .SH ПЕРЕВОД Русский перевод этой страницы руководства был сделан Azamat Hackimov , Dmitriy S. Seregin , Dmitry Bolkhovskikh , Katrin Kutepova , Yuri Kozlov и Иван Павлов . .PP Этот перевод является бесплатной документацией; прочитайте .UR https://www.gnu.org/licenses/gpl-3.0.html Стандартную общественную лицензию GNU версии 3 .UE или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ. .PP Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на .MT man-pages-ru-talks@lists.sourceforge.net .ME .