table of contents
NAMESPACES(7) | Linux-Programmierhandbuch | NAMESPACES(7) |
BEZEICHNUNG¶
namespaces - Überblick über Linux-Namensräume
BESCHREIBUNG¶
Ein Namensraum hüllt eine globale Systemressource in eine Abstraktion ein, so dass es den Prozessen innerhalb des Namensraums so erscheint, als ob sie ihre eigene, isolierte Instanz der globalen Ressource hätten. Änderungen an der globalen Ressource sind für andere Prozesse, die Mitglied des Namensraums sind, sichtbar, sind aber für alle anderen Prozesse unsichtbar. Ein Anwendungsfall für Namensräume ist die Implementierung von Containern.
Linux stellt die folgenden Namensräume bereit:
Namensraum | Konstante | isoliert |
Cgroup | CLONE_NEWCGROUP | Cgroup-Wurzelverzeichnis |
IPC | CLONE_NEWIPC | System V IPC, POSIX-Nachrichtenwarteschlangen |
Netzwerk | CLONE_NEWNET | Netzwerkgeräte, Stacks, Ports, usw. |
Einhängungen | CLONE_NEWNS | Einhängepunkte |
PID | CLONE_NEWPID | Prozesskennungen |
User | CLONE_NEWUSER | Benutzer- und Gruppenkennungen |
UTS | CLONE_NEWUTS | Rechnername und NIS-Domain-Name |
Diese Seite beschreibt die verschiedenen Namensräume und die zugehörigen Dateien in /proc und fasst die APIs für die Arbeit mit Namensräumen zusammen.
Das Namensraum-API¶
Neben verschiedenen, nachfolgend beschriebenen Dateien in /proc enthält das Namensraum-API die folgenden Systemaufrufe:
- clone(2)
- Der Systemaufruf clone(2) erstellt einen neuen Prozess. Falls das Argument Schalter des Aufrufs einen oder mehrere der unten aufgeführten Schalter CLONE_NEW* enthält, dann werden für jeden der Schalter neue Namensräume erstellt und der Kindprozess wird zum Mitglied in jedem dieser Namensräume gemacht. (Dieser Systemaufruf implementiert auch eine Reihe von Funktionalitäten ohne Bezug zu Namensräumen.)
- setns(2)
- Der Systemaufruf setns(2) erlaubt es dem aufrufenden Prozess, einem bestehenden Namensraum beizutreten. Der beizutretende Namensraum wird über einen Dateideskriptor festgelegt, der sich auf eine der nachfolgend beschriebenen Dateien in /proc/[PID]/ns bezieht.
- Der Systemaufruf unshare(2) verschiebt den aufrufenden Prozess in einen neuen Namensraum. Falls das Argument Schalter des Aufrufs einen oder mehrere der unten aufgeführten Schalter CLONE_NEW* enthält, dann werden für jeden der Schalter neue Namensräume erstellt und der Kindprozess wird zum Mitglied in jedem dieser Namensräume gemacht. (Dieser Systemaufruf implementiert auch eine Reihe von Funktionalitäten ohne Bezug zu Namensräumen.)
Die Erstellug von neuen Namensräumen mittels clone(2) und unshare(2) verlangt in den meisten Fällen die Capability CAP_SYS_ADMIN. Benutzernamensräume sind die Ausnahme: seit Linux 3.8 werden keine Privilegien zur Erzeugung von Benutzernamensräumen benötigt.
Das Verzeichnis /proc/[PID]/ns/¶
Jeder Prozess verfügt über ein Unterverzeichnis /proc/[PID]/ns/, das einen Eintrag für jeden Namensraum enthält, der die Manipulation mittels setns(2) erlaubt:
$ ls -l /proc/$$/ns total 0 lrwxrwxrwx. 1 mtk mtk 0 Apr 28 12:46 cgroup -> cgroup:[4026531835] lrwxrwxrwx. 1 mtk mtk 0 Apr 28 12:46 ipc -> ipc:[4026531839] lrwxrwxrwx. 1 mtk mtk 0 Apr 28 12:46 mnt -> mnt:[4026531840] lrwxrwxrwx. 1 mtk mtk 0 Apr 28 12:46 net -> net:[4026531969] lrwxrwxrwx. 1 mtk mtk 0 Apr 28 12:46 pid -> pid:[4026531836] lrwxrwxrwx. 1 mtk mtk 0 Apr 28 12:46 pid_for_children -> pid:[4026531834] lrwxrwxrwx. 1 mtk mtk 0 Apr 28 12:46 user -> user:[4026531837] lrwxrwxrwx. 1 mtk mtk 0 Apr 28 12:46 uts -> uts:[4026531838]
Durch Bind-Einhängungen (siehe mount(2)) einer der Dateien in diesem Verzeichnis an einen anderen Platz im Dateisystem wird der entsprechende Namensraum des durch PID festgelegten Prozesses am Leben erhalten, selbst wenn alle derzeit im Namensraum befindlichen Prozesse beendet werden.
Öffnen einer der Dateien in diesem Verzeichnis (oder einer Datei, die auf eine dieser Dateien bind-eingehängt ist) liefert einen Datei-Handle auf den Namensraum zurück, der dem durch PID festgelegten Prozess entspricht. Solange dieser Dateideskriptor offen bleibt, wird der Namensraum am Leben bleiben, selbst falls alle Prozesse in diesem Namensraum beendet werden. Der Dateideskriptor kann an setns(2) weitergegeben werden.
Unter Linux 3.7 und älter waren diese Dateien als harte Links sichtbar. Seit Linux 3.8 erscheinen sie als symbolische Links. Falls zwei Prozesse im gleichen Namensraum sind, dann werden die Gerätekennungen und Inode-Nummern ihrer symbolischen Links /proc/[PID]/ns/xxx identisch sein; die Anwendung kann dies mittels der von stat(2) zurückgelieferten Felder stat.st_dev und stat.st_ino überprüfen. Der Inhalt dieses symbolischen Links ist eine Zeichenkette, die den Namensraumtyp und die Inode-Nummer wie im folgenden Beispiel enthält:
$ readlink /proc/$$/ns/uts uts:[4026531838]
Die symbolischen Links in diesem Unterverzeichnis sind wie folgt:
- /proc/[PID]/ns/cgroup (seit Linux 4.6)
- Diese Datei ist ein Handle für den Cgroup-Namensraum des Prozesses.
- /proc/[PID]/ns/ipc (seit Linux 3.0)
- Diese Datei ist ein Handle für den IPC-Namensraum des Prozesses.
- /proc/[PID]/ns/mnt (seit Linux 3.8)
- Diese Datei ist ein Handle für den Einhänge-Namensraum des Prozesses.
- /proc/[PID]/ns/net (seit Linux 3.0)
- Diese Datei ist ein Handle für den Netzwerk-Namensraum des Prozesses.
- /proc/[PID]/ns/pid (seit Linux 3.8)
- Diese Datei ist ein Handle für den PID-Namensraum des Prozesses. Dieses Handle ist für die Lebenszeit des Prozesses dauerhaft (d.h. die PID-Namensraumzugehörigkeit eines Prozesses ändert sich niemals).
- /proc/[PID]/ns/pid_for_children (seit Linux 4.12)
- Diese Datei ist ein Handle für den PID-Namensraum des durch diesen Prozess erstellten Kind-Prozesses. Dieser kann sich als Konsequenz aus Aufrufen von unshare(2) und setns(2) ändern (siehe pid_namespaces(7)), daher kann sich die Datei von /proc/[PID]/ns/pid unterscheiden. Der symbolische Link wird erst nach der Erstellung des ersten Kindprozesses in den Namensraum wertvoll. (Vorher wird ein readlink(2) von dem symbolischen Link einen leeren Puffer zurückgeben.)
- /proc/[PID]/ns/user (seit Linux 3.8)
- Diese Datei ist ein Handle für den Benutzer-Namensraum des Prozesses.
- /proc/[PID]/ns/uts (seit Linux 3.0)
- Diese Datei ist ein Handle für den UTS-Namensraum des Prozesses.
Die Berechtigungen, diese symbolischen Links zu dereferenzieren oder zu lesen (readlink(2)) werden durch eine Ptrace-Zugriffsmodusüberprüfung PTRACE_MODE_READ_FSCREDS gesteuert; siehe ptrace(2).
Das Verzeichnis /proc/sys/user¶
Die Dateien im Verzeichnis /proc/sys/user (das seit Linux 4.9 vorhanden ist) legen die Begrenzungen für die Anzahl der Namensräume der verschiedenen Typen fest, die erstellt werden können. Die Dateien sind wie folgt:
- max_cgroup_namespaces
- Der Wert in dieser Datei definiert eine benutzerbezogene Begrenzung für die Anzahl der Cgroup-Namensräume, die in dem Benutzernamensraum erstellt werden können.
- max_ipc_namespaces
- Der Wert in dieser Datei definiert eine benutzerbezogene Begrenzung für die Anzahl der IPC-Namensräume, die in dem Benutzernamensraum erstellt werden können.
- max_mnt_namespaces
- Der Wert in dieser Datei definiert eine benutzerbezogene Begrenzung für die Anzahl der Einhänge-Namensräume, die in dem Benutzernamensraum erstellt werden können.
- max_net_namespaces
- Der Wert in dieser Datei definiert eine benutzerbezogene Begrenzung für die Anzahl der Netzwerk-Namensräume, die in dem Benutzernamensraum erstellt werden können.
- max_pid_namespaces
- Der Wert in diesem Namensraum definiert die benutzerbezogene Begrenzung der Anzahl der PID-Namensräume, die in dem Benutzernamensraum erstellt werden darf.
- max_user_namespaces
- Der Wert in dieser Datei definiert eine benutzerbezogene Begrenzung für die Anzahl der Benutzer-Namensräume, die in dem Benutzernamensraum erstellt werden können.
- max_uts_namespaces
- Der Wert in dieser Datei definiert eine benutzerbezogene Begrenzung für die Anzahl der Benutzer-Namensräume, die in dem Benutzernamensraum erstellt werden können.
Beachten Sie die folgenden Details über diese Dateien:
- Die Werte in diesen Dateien können von privilegierten Prozessen verändert werden.
- Die in diesen Dateien offengelegten Werte sind die Begrenzungen für die Benuzernamensräume, in denen sich der öffnende Prozess befindet.
- Die Begrenzungen gelten pro Benutzer. Jeder Benutzer in dem gleichen Benutzernamensraum kann Namensräume bis zu der definierten Begrenzung erstellen.
- Die Begrenzungen gelten für alle Benutzer, einschließlich UID 0.
- Diese Begrenzungen gelten zusätzlich zu anderen, auf Namensräume bezogenen Begrenzungen (wie diese für PID- und Benutzernamensräume), die durchgesetzt werden könnten.
- Beim Erreichen dieser Beschränkungen werden clone(2) und unshare(2) mit dem Fehler ENOSPC fehlschlagen.
- Für den anfänglichen Benutzernamensraum ist der Vorgabewert für jede dieser Dateien die Hälfte der Begrenzungen für die Anzahl der Threads, die erstellt werden dürfen (/proc/sys/kernel/threads-max). In allen abgeleiteten Benutzernamensräumen ist der Vorgabewert in jeder Datei MAXINT.
- Wenn ein Namensraum erstellt wird, wird das Objekt auch gegen die Vorgängernamensräume verrechnet. Genauer:
- +
- Jeder Benutzernamensraum hat eine Ersteller-UID.
- +
- Wenn ein Namensraum erstellt wird, wird er gegen die Ersteller-UIDs in jedem der Vorgängernamensräume verrechnet und der Kernel stellt sicher, dass die entsprechende Namensraumbegrenzung für die Ersteller-UID in den Vorgängernamensräumen nicht überschritten wird.
- +
- Der vorgehend erwähnte Punkt stellt sicher, dass das Erzeugen eines neuen Benutzernamensraums nicht als Mittel verwandt werden kann, um den im aktuellen Benutzernamensraum in Kraft gesetzten Beschränkungen zu entfliehen.
Cgroup-Namensraum (CLONE_NEWCGROUP)¶
Siehe cgroup_namespaces(7).
IPC-Namensraum (CLONE_NEWIPC)¶
IPC-Namensräume isolieren bestimmte IPC-Ressouren, konkret System V IPC-Objekte (siehe svipc(7)) und (seit Linux 2.6.30) POSIX-Nachrichtenwarteschlangen (siehe mq_overview(7)). Die gemeinsame Charakteristik dieser IPC-Mechanismen besteht darin, dass IPC-Objekte durch andere Mechanismen als Dateisystem-Pfadnamen identifiziert werden.
Jeder IPC-Namensraum hat seine eigene Gruppe an System-V-IPC-Kennzeichnern und sein eigenes POSIX-Nachrichtenwarteschlangen-Dateisystem. In einem IPC-Namensraum erstellte Objekte sind für alle anderen Prozesse sichtbar, die Mitglied dieses Namensraums sind, aber nicht für Prozesse sichtbar, die in anderen IPC-Namensräumen sind.
Die folgenden /proc-Schnittstellen sind in jedem IPC-Namensraum eindeutig:
- Die POSIX-Nachrichtenwarteschlangenschnittstelle in /proc/sys/fs/mqueue.
- Die System-V-IPC-Schnittstellen in /proc/sys/kernel, konkret: msgmax, msgmnb, msgmni, sem, shmall, shmmax, shmmni und shm_rmid_forced.
- Die System-V-IPC-Schnittstellen in /proc/sysvipc.
Wenn ein IPC-Namensraum zerstört wird (d.h. wenn der letzte Prozess, der Mitglied in einem Namensraum ist, sich beendet), dann werden alle IPC-Objekte in diesem Namensraum automatisch zerstört.
Die Verwendung von IPC-Namensräumen benötigt einen Kernel, der mit der Option CONFIG_IPC_NS konfiguriert wurde.
Netzwerk-Namensräume (CLONE_NEWNET)¶
Siehe network_namespaces(7).
Einhänge-Namensräume (CLONE_NEWNS)¶
Siehe mount_namespaces(7).
PID-Namensräume (CLONE_NEWPID)¶
Siehe pid_namespaces(7).
Benutzernamensräume (CLONE_NEWUSER)¶
Siehe user_namespaces(7).
UTS-Namensräume (CLONE_NEWUTS)¶
UTS-Namensräume isolieren zwei Systemkennzeichner: den Rechnernamen und den NIS-Domain-Namen. Diese Kennzeichner werden mittels sethostname(2) und setdomainname(2) gesetzt und können mittels uname(2), gethostname(2) und getdomainname(2) abgefragt werden.
Die Verwendung von UTS-Namensräumen benötigt einen Kernel, der mit der Option CONFIG_UTS_NS konfiguriert wurde.
BEISPIEL¶
Siehe clone(2) und user_namespaces(7).
SIEHE AUCH¶
nsenter(1), readlink(1), unshare(1), clone(2), ioctl_ns(2), setns(2), unshare(2), proc(5), capabilities(7), cgroup_namespaces(7), cgroups(7), credentials(7), network_namespaces(7), pid_namespaces(7), user_namespaces(7), lsns(8), switch_root(8)
KOLOPHON¶
Diese Seite ist Teil der Veröffentlichung 4.16 des Projekts Linux-man-pages. Eine Beschreibung des Projekts, Informationen, wie Fehler gemeldet werden können, sowie die aktuelle Version dieser Seite finden sich unter https://www.kernel.org/doc/man-pages/.
ÜBERSETZUNG¶
Die deutsche Übersetzung dieser Handbuchseite wurde von Helge Kreutzmann <debian@helgefjell.de> 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 Übersetzer.
2. Februar 2018 | Linux |