Linux ist ein auf UNIX basierendes Betriebssystem, dessen Kernel für Ressourcen- und Prozessmanagement sowie die Hardware-Interaktion zuständig ist. Die Implementierung von Namespaces und cgroups hat die Container-Technologie entscheidend vorangebracht, indem sie verbesserte Ressourcenverwaltung und -isolation ermöglichte und so zu einem Kernbestandteil moderner IT-Infrastrukturen wurde.
Ein wichtiger Aspekt eines Kernels ist seine Fähigkeit zur Isolation von Ressourcen und Prozessen, um eine stabile und sichere Betriebsumgebung zu gewährleisten. Diese Isolation wurde in Linux durch die Einführung von Namespaces verbessert. Namespaces sind abgeschottete Instanzen für verschiedene Systemressourcen wie PID (Prozess-ID), Netzwerk und Dateisystem. Sie ermöglichen es verschiedenen Benutzern und Anwendungen, im selben System zu arbeiten, als wären sie die einzigen Anwender des Systems. Die Entwicklung des Linux-Kernels zur heutigen Namespace-Implementierung war ein schrittweiser Prozess, der über mehrere Jahre stattfand. Der erste Namespace, Mount Namespace, wurde im Jahr 2002 mit Kernel 2.4.19 eingeführt und im Laufe der Zeit wurden weitere hinzugefügt. Mit der Einführung des User-Namespaces in der Kernel-Version 3.8 wurde ein bedeutender Meilenstein erreicht, da dies eine ausreichende Unterstützung für Containerfunktionalitäten im Kernel bereitstellte. Die Version 3.8 des Linux-Kernels wurde am 18. Februar 2013 veröffentlicht und bereits im März desselben Jahres wurde die erste Version von Docker veröffentlicht. Auch wenn Docker inzwischen an Bedeutung verloren hat, ist es dennoch ein gängiges Synonym für Containerisierung.

Die Einführung von Namespaces hatte einen entscheidenden Einfluss auf die IT-Branche. Sie sind das Fundament von Containerisierungstechnologien wie Docker und Kubernetes, welche die Entwicklung und den Betrieb von Anwendungen revolutioniert haben. Die Technologie hat nicht nur das Linux-Ökosystem erweitert, sondern auch weitreichende Auswirkungen auf die gesamte IT-Landschaft gehabt.
cgroups, kurz für Control Groups, sind ein Feature des Linux-Kernels, das erstmals im Jahr 2007 mit dem Kernel-Release 2.6.24 eingeführt wurde.
Mit cgroups können Systemressourcen wie CPU-Zeit, Systemspeicher, Netzwerkbandbreite und I/O-Ressourcen überwacht und begrenzt werden. Es ermöglicht die Isolierung, Priorisierung und Buchführung der Ressourcennutzung für Prozessgruppen.
cgroups haben gemeinsam mit Namespaces die Grundlagen für die moderne Containerisierung geschaffen. Sie ermöglichen die Isolierung und Ressourcenbegrenzung für Container, was für Technologien wie Docker und Kubernetes entscheidend ist. Durch diese Kombination können Container effizient Ressourcen teilen, während sie dennoch isoliert voneinander arbeiten.
Sowohl Namespaces als auch cgroups bieten eine Reihe von Werkzeugen und Befehlen, die für ihre Verwaltung und Überwachung nützlich sind. Diese Beispiele illustrieren grundlegende Möglichkeiten, wie man diese Kernfunktionen des Linux-Systems nutzen kann. Sie sind entscheidend für die fortschrittliche Ressourcenverwaltung und Isolierung in modernen IT-Systemen.
lsns ist ein Befehl zur Auflistung der Namespaces
auf einem Linux-System. Es ermöglicht die Darstellung verschiedener
Typen von Namespaces wie PID, NET, USER und mehr.
lsnsunshare: Dieses Kommando erlaubt das Ausführen eines
Programms in einem neuen Namespace.
unshare -p -f some_commandnsenter: Ermöglicht das Wechseln zu vorhandenen
Namespaces.
nsenter -t [target_pid] -n command_to_runip netns: Speziell für Netzwerk-Namespaces, um diese
zu erstellen, zu löschen oder anzuzeigen.
ip netns add mynetnssetns: Ein systemeigener Aufruf, der allerdings auch
in manchen Tools verwendet wird, um einem Namespace beizutreten.
setns(fd, flags)clone: Ein systemeigener Aufruf zum Erstellen eines
neuen Prozesses, wobei spezifiziert werden kann, welche Ressourcen
(einschließlich Namespaces) geteilt oder isoliert werden sollen.
clone(flags, child_stack)cgcreate und cgexec sind Werkzeuge aus
dem libcgroup-Paket, die zur Verwaltung von cgroups
verwendet werden können. Mit diesen Befehlen wird eine neue cgroup im
CPU-Subsystem erstellt und anschließend ein Prozess innerhalb dieser
cgroup ausgeführt.
# Erstelle eine neue cgroup im CPU-Subsystem
cgcreate -g cpu:/mycgroup# Führe einen Prozess in der erstellten cgroup aus
cgexec -g cpu:mycgroup /some/commandcgstat ist ein weiteres nützliches Werkzeug zur
Überwachung der Ressourcennutzung von cgroups. Dieser Befehl zeigt
Statistiken zur CPU-Nutzung der cgroup mycgroup.
cgstat -g cpu:/mycgroup