Kurz gesagt, Namespaces bieten die Möglichkeit, ein virtuelles Linux-System in einem größeren Linux-System zu erstellen. Dies unterscheidet sich von der Ausführung einer virtuellen Maschine, die als nicht privilegierter Prozess ausgeführt wird: Die virtuelle Maschine wird als einzelner Prozess auf dem Host angezeigt, wohingegen Prozesse, die in einem Namespace ausgeführt werden, weiterhin auf dem Hostsystem ausgeführt werden.
Ein virtuelles System, das in einem größeren System ausgeführt wird, wird als Container bezeichnet . Die Idee eines Containers ist, dass Prozesse, die im Container ausgeführt werden, glauben, dass sie die einzigen Prozesse im System sind. Insbesondere hat der Root-Benutzer innerhalb des Containers keine Root-Rechte außerhalb des Containers (beachten Sie, dass dies nur in ausreichend aktuellen Versionen des Kernels zutrifft).
Namespaces virtualisieren jeweils ein Feature. Einige Beispiele für Typen von Namespaces sind:
- User Namespaces - Hiermit können sich Prozesse so verhalten, als würden sie als unterschiedliche Benutzer innerhalb und außerhalb des Namespaces ausgeführt. Insbesondere haben Prozesse, die als UID 0 im Namespace ausgeführt werden, Superuser-Berechtigungen nur in Bezug auf Prozesse, die im selben Namespace ausgeführt werden.
Seit Linux-Kernel 3.8 können nichtprivilegierte Benutzer Benutzernamensräume erstellen. Auf diese Weise kann ein normaler Benutzer Funktionen nutzen, die für Root reserviert sind (z. B. das Ändern von Routingtabellen oder das Festlegen von Funktionen).
- PID-Namespaces - Prozesse in einem PID-Namespace können keine Prozesse außerhalb dieses Namespaces beenden oder verfolgen.
- Namespaces mounten - Dies ermöglicht es Prozessen, eine eigene Ansicht des Dateisystems zu haben. Diese Ansicht kann eine Teilansicht sein, in der einige Teile des Dateisystems ausgeblendet und Teile neu zusammengestellt werden können, sodass Verzeichnisbäume an verschiedenen Stellen angezeigt werden. Mount-Namespaces verallgemeinern die traditionelle Unix-Feature- Chroot , mit der Prozesse auf einen bestimmten Unterbaum beschränkt werden können.
- Netzwerk-Namespaces - ermöglichen die Trennung von Netzwerkressourcen (Netzwerkgeräten) und verbessern so die Isolierung von Prozessen.
Namespaces verlassen sich auf den Kernel, um die Isolierung zwischen Namespaces zu gewährleisten. Es ist ziemlich kompliziert, dies zu korrigieren, so dass immer noch Sicherheitslücken herumliegen können. Das Risiko von Sicherheitslücken ist der Hauptgrund dafür, dass die Funktion nicht aktiviert wird. Ein weiterer Grund, dies nicht zu aktivieren, ist, wenn Sie einen kleinen Kernel für ein eingebettetes Gerät erstellen. In einem Allzweck-Kernel, den Sie auf einem typischen Server oder einer typischen Arbeitsstation installieren möchten, sollten Namespaces wie bei allen anderen ausgereiften Kernel-Funktionen aktiviert sein.
Es gibt noch wenige Anwendungen, die Namespaces verwenden. Hier sind ein paar:
Weitere Informationen finden Sie in der LWN-Artikelserie von Michael Kerrisk .