BEZEICHNUNG
cgroup_namespaces - Überblick über Linux-Cgroup-NamensräumeBESCHREIBUNG
Für einen Überblick über Namensräume, siehe namespaces(7). Cgroup-Namensräume 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 Datensätzen 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 für 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 außerhalb des Wurzelverzeichnisses des Cgroup-Namensraums des lesenden Prozesses liegt, dann wird der Pfadname ../-Einträge für jede Vorgängerstufe 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 anfänglichen 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 nächstes wird unshare(1) verwandt, um einen Prozess zu erzeugen, der in einer neuen Shell in dem neuen Cgroup- und Einhängenamensraum läuft:
# 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 anfänglichen 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 anfängliche 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 Einhängung formt. Da per Definition von Cgroup-Namensräumen 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 Einhängeeintrag für das Cgroup-Dateisystem gezeigt wird, das dem anfänglichen Cgroup-Namensraum entspricht (dessen Cgroup-Dateisystem tatsächlich am übergeordneten Verzeichnis von sub verwurzelt ist). Um dieses Problem zu beheben, muss das Freezer-Cgroup-Dateisystem aus der neuen Shell neu eingehängt werden (d.h. die Einhängung muss von einem Prozess durchgeführt werden, der in dem neuen Cgroup-Namensraum ist). Danach kann das erwartete Ergebnis gesehen werden:
sh2# mount --make-rslave / # Einhänge-Ereignisse nicht in # andere Namensräume 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
Namensräume sind eine Linux-spezifische Funktionalität.ANMERKUNGEN
Die Verwendung von Cgroup-Namensräumen benötigt einen Kernel, der mit der Option CONFIG_CGROUPS konfiguriert ist. Die durch Cgroup-Namensräume bereitgestellte Virtualisierung dient einer Reihe von Zwecken:- •
- Sie verhindert Informationslecks, durch die Cgroup-Verzeichnispfade außerhalb eines Containers andernfalls für Prozesse innerhalb des Containers sichtbar sind. Solche Lecks könnten beispielsweise Informationen über das umgebende Container-System an Anwendungen innerhalb von Containern offenlegen.
- •
- Sie erleichtern Aufgaben wie Container-Migration. Die durch Cgroup-Namensräume bereitgestellte Virtualisierung erlaubt es, Container vom Wissen über die Pfadnamen von Vorgängern-Cgroups zu isolieren. Ohne solche Isolierungen müssten die vollständigen Cgroup-Pfadnamen (angezeigt in /proc/self/cgroups) auf dem Zielsystem bei der Migration eines Containers repliziert werden; diese Pfadnamen müssten auch eindeutig sein, so dass sie nicht zu anderen Pfadnamen auf dem Zielsystem in Konflikt stehen.
- •
- Sie erlauben bessere Einsperrungen von Prozessen in Containern, da es möglich ist, das Cgroup-Dateisystem des Containers so einzuhängen, dass der Prozess im Container keinen Zugriff auf die Vorgänger-Cgroup-Verzeichnisse erlangen kann. Betrachten Sie beispielsweise folgendes Szenario:
- •
- Es gibt ein Cgroup-Verzeichnis /cg/1, das der Benutzerkennung 9000 gehört.
- •
- Es gibt einen Prozess X, der auch der Benutzerkennung 9000 gehört, 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 gehört (und für sie schreibbar ist) und X auch der UID 9000 gehört, wäre der Prozess X, in Abwesenheit von Cgroup-Namensräumen, in der Lage, die Inhalte der Cgroup-Dateien zu verändern (d.h. die Cgroup-Einstellungen zu ändern), nicht nur in /cg/1/2, sondern auch in dem Vorgänger-Cgroup-Verzeichnis /cg/1. Da der Prozess X im Namensraum unter dem Cgroup-Verzeichnis /cg/1/2 ist, wird, in Zusammenhang mit geeigneten Einhängeaktionen für das Cgroup-Dateisystem (wie oben gezeigt), verhindert, dass er Dateien in /cg/1 verändert, da er noch nicht einmal die Inhalte dieses Verzeichnisses (oder von weiter entfernten Cgroup-Vorgänger-Verzeichnissen) sehen kann. In Zusammenspiel mit der korrekten Durchsetzung von hierarchischen Beschränkungen verhindert dies, dass Prozess X diesen von den Vorgänger-Cgroups auferlegten Beschränkungen entkommt.
SIEHE AUCH
unshare(1), clone(2), setns(2), unshare(2), proc(5), cgroups(7), credentials(7), namespaces(7), user_namespaces(7)ÜBERSETZUNG
Die deutsche Übersetzung dieser Handbuchseite wurde von Helge Kreutzmann <[email protected]> erstellt. Diese Übersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 oder neuer bezüglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG übernommen. Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an die Mailingliste der Übersetzer5. Februar 2023 | Linux man-pages 6.03 |