cgroup_namespaces(7) Miscellaneous Information Manual cgroup_namespaces(7) BEZEICHNUNG cgroup_namespaces - Uberblick uber Linux-Cgroup-Namensraume BESCHREIBUNG Fur einen Uberblick uber Namensraume, siehe namespaces(7). Cgroup-Namensraume virtualisieren den Blick auf die Cgroups eines Prozesses (siehe cgroups(7)), wie er mittels /proc/PID/cgroup und /proc/PID/mountinfo gesehen wird. Jeder Cgroup-Namensraum hat seine eigene Gruppe an Cgroup-Wurzelverzeichnissen. Diese Wurzelverzeichnisse sind die Basispunkte der relativen Orte, die in den entsprechenden Datensatzen in der Datei /proc/PID/cgroup angezeigt werden. Wenn ein Prozess mittels clone(2) oder unshare(2) mit dem Schalter CLONE_NEWCGROUP einen neuen Cgroup-Namensraum erstellt, werden seine aktuellen Cgroup-Verzeichnisse das Cgroup-Wurzelverzeichnis des neuen Namensraumes. (Dies gilt sowohl fur die Cgroup-Version-1-Hierarchien als auch die vereinigte Cgroup-Version-2-Hierarchie.) Wenn die Cgroup-Mitgliedschaft eines >>Ziel<<-Prozesses aus /proc/PID/cgroup gelesen wird, wird der im dritten Feld jedes Datensatzes angezeigte Pfadname relativ zu dem Wurzelverzeichnis der entsprechenden Cgroup-Hierarchie des lesenden Prozesses sein. Falls das Cgroup-Verzeichnis des Zielprozesses ausserhalb des Wurzelverzeichnisses des Cgroup-Namensraums des lesenden Prozesses liegt, dann wird der Pfadname ../-Eintrage fur jede Vorgangerstufe in der Cgroup-Hierarchie anzeigen. Die folgende Shell-Sitzung zeigt die Auswirkung der Erstellung eines neuen Cgroup-Namensraumes. Zuerst wird (als Systemverwalter) in einer Shell im anfanglichen Cgroup-Namensraum eine Nachfolger-Cgroup in der freezer-Hierarchie erstellt und ein Prozess in dieser Cgroup abgelegt, der als Teil der nachfolgenden Vorstellung verwandt wird: # mkdir -p /sys/fs/cgroup/freezer/sub2 # sleep 10000 & # Erzeugung eines Unterprozesses, der eine Zeit lebt [1] 20124 # echo 20124 > /sys/fs/cgroup/freezer/sub2/cgroup.procs Dann wird eine andere Cgroup in der freezer-Hierachie erstellt und die Shell in diese Gruppe versetzt: # mkdir -p /sys/fs/cgroup/freezer/sub # echo $$ # PID dieser Shell zeigen 30655 # echo 30655 > /sys/fs/cgroup/freezer/sub/cgroup.procs # cat /proc/self/cgroup | grep freezer 7:freezer:/sub Als nachstes wird unshare(1) verwandt, um einen Prozess zu erzeugen, der in einer neuen Shell in dem neuen Cgroup- und Einhangenamensraum lauft: # PS1="sh2# " unshare -Cm bash Von der neuen durch unshare(1) gestarteten Shell werden dann die Dateien /proc/PID/cgroup der neuen Shell, eines Prozesse in dem anfanglichen Cgroup-Namensraum ((init mit PID 1) bzw. des Prozesses in der benachbarten Cgroup (sub2) untersucht: 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 In der Ausgabe des ersten Befehls kann gesehen werden, dass die Freezer-Cgroup-Mitgliedschaft der neuen Shell (die in der gleichen Cgroup wie die anfangliche Shell ist) relativ zum Wurzelverzeichnis der Freezer-Cgroup definiert angezeigt wird, die etabliert wurde, als der neue Cgroup-Namensraum erstellt wurde. (Absolut gesehen ist die neue Shell in der Freezer-Cgroup /sub und das Wurzelverzeichnis der Freezer-Cgroup-Hierarchie in dem neuen Cgroup-Namensraum auch /sub. Daher wird die Cgroup-Mitgliedschaft der neuen Shell als >>/<< angezeigt.) Wird allerdings in /proc/self/mountinfo geschaut, taucht folgende Anomalie auf: sh2# cat /proc/self/mountinfo | grep freezer 155 145 0:32 /.. /sys/fs/cgroup/freezer Das vierte Feld dieser Zeile (/..) sollte das Verzeichnis in dem Cgroup-Dateisystem anzeigen, das die Wurzel dieser Einhangung formt. Da per Definition von Cgroup-Namensraumen das aktuelle Freezer-Cgroup-Verzeichnis des aktuellen Prozesses sein Wurzel-Freezer-Cgroup-Verzeichnis wurde, sollte in diesem Feld >>/<< auftauchen. Das Problem hier ist, dass ein Einhangeeintrag fur das Cgroup-Dateisystem gezeigt wird, das dem anfanglichen Cgroup-Namensraum entspricht (dessen Cgroup-Dateisystem tatsachlich am ubergeordneten Verzeichnis von sub verwurzelt ist). Um dieses Problem zu beheben, muss das Freezer-Cgroup-Dateisystem aus der neuen Shell neu eingehangt werden (d.h. die Einhangung muss von einem Prozess durchgefuhrt werden, der in dem neuen Cgroup-Namensraum ist). Danach kann das erwartete Ergebnis gesehen werden: sh2# mount --make-rslave / # Einhange-Ereignisse nicht in # andere Namensraume weiterleiten 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 STANDARDS Linux. ANMERKUNGEN Die Verwendung von Cgroup-Namensraumen benotigt einen Kernel, der mit der Option CONFIG_CGROUPS konfiguriert ist. Die durch Cgroup-Namensraume bereitgestellte Virtualisierung dient einer Reihe von Zwecken: o Sie verhindert Informationslecks, durch die Cgroup-Verzeichnispfade ausserhalb eines Containers andernfalls fur Prozesse innerhalb des Containers sichtbar sind. Solche Lecks konnten beispielsweise Informationen uber das umgebende Container-System an Anwendungen innerhalb von Containern offenlegen. o Sie erleichtern Aufgaben wie Container-Migration. Die durch Cgroup-Namensraume bereitgestellte Virtualisierung erlaubt es, Container vom Wissen uber die Pfadnamen von Vorgangern-Cgroups zu isolieren. Ohne solche Isolierungen mussten die vollstandigen Cgroup-Pfadnamen (angezeigt in /proc/self/cgroups) auf dem Zielsystem bei der Migration eines Containers repliziert werden; diese Pfadnamen mussten auch eindeutig sein, so dass sie nicht zu anderen Pfadnamen auf dem Zielsystem in Konflikt stehen. o Sie erlauben bessere Einsperrungen von Prozessen in Containern, da es moglich ist, das Cgroup-Dateisystem des Containers so einzuhangen, dass der Prozess im Container keinen Zugriff auf die Vorganger-Cgroup-Verzeichnisse erlangen kann. Betrachten Sie beispielsweise folgendes Szenario: o Es gibt ein Cgroup-Verzeichnis /cg/1, das der Benutzerkennung 9000 gehort. o Es gibt einen Prozess X, der auch der Benutzerkennung 9000 gehort, der im Namensraum unterhalb der Cgroup /cg/1/2 ist (d.h. X wurde in einen neuen Cgroup-Namensraum mittels clone(2) oder unshare(2) mit dem Schalter CLONE_NEWCGROUP gebracht). Da das Cgroup-Verzeichnis /cg/1 der UID 9000 gehort (und fur sie schreibbar ist) und X auch der UID 9000 gehort, ware der Prozess X, in Abwesenheit von Cgroup-Namensraumen, in der Lage, die Inhalte der Cgroup-Dateien zu verandern (d.h. die Cgroup-Einstellungen zu andern), nicht nur in /cg/1/2, sondern auch in dem Vorganger-Cgroup-Verzeichnis /cg/1. Da der Prozess X im Namensraum unter dem Cgroup-Verzeichnis /cg/1/2 ist, wird, in Zusammenhang mit geeigneten Einhangeaktionen fur das Cgroup-Dateisystem (wie oben gezeigt), verhindert, dass er Dateien in /cg/1 verandert, da er noch nicht einmal die Inhalte dieses Verzeichnisses (oder von weiter entfernten Cgroup-Vorganger-Verzeichnissen) sehen kann. In Zusammenspiel mit der korrekten Durchsetzung von hierarchischen Beschrankungen verhindert dies, dass Prozess X diesen von den Vorganger-Cgroups auferlegten Beschrankungen entkommt. SIEHE AUCH unshare(1), clone(2), setns(2), unshare(2), proc(5), cgroups(7), credentials(7), namespaces(7), user_namespaces(7) UBERSETZUNG Die deutsche Ubersetzung dieser Handbuchseite wurde von Helge Kreutzmann erstellt. Diese Ubersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 oder neuer bezuglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG ubernommen. Wenn Sie Fehler in der Ubersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an die Mailingliste der Ubersetzer . Linux man-pages 6.06 31. Oktober 2023 cgroup_namespaces(7)