Provided by: manpages-de_4.13-4_all 

BEZEICHNUNG
unshare - Programm in neuen Namensräumen ausführen
ÜBERSICHT
unshare [Optionen] [Programm [Argumente]]
BESCHREIBUNG
Der Befehl unshare erzeugt neue Namensräume (wie in den nachfolgend beschriebenen Befehlszeilenoptionen
angegeben) und führt dann das angegebene Programm aus. Falls kein Programm angegeben ist, dann wird
»${SHELL}« ausgeführt (Vorgabe: /bin/sh).
In der Voreinstellung ist ein neuer Namensraum nur so lange beständig, wie er Mitgliedprozesse hat. Ein
neuer Namensraum kann beständig gemacht werden, selbst wenn es keine Mitgliedprozesse gibt, indem
/proc/PID/ns/Typ-Dateien mit »bind« in einen Dateisystempfad eingebunden werden. Ein Namensraum, der auf
diese Weise beständig gemacht wurde, kann anschließend mit nsenter(1) betreten werden, sogar, wenn das
Programm beendet wird (außer PID-Namensräume, bei denen ein dauerhaft laufender Init-Prozess benötigt
wird). Sobald ein beständiger Namensraum nicht länger benötigt wird, kann die Beständigkeit mit umount(8)
aufgehoben werden, um die Einhängung mit bind(2) aufzuheben. Weitere Einzelheiten finden Sie im Abschnitt
BEISPIELE.
unshare verwendet seit Util-linux Version 2.36 die Dateien /proc/[PID]/ns/pid_for_children und
/proc/[PID]/ns/time_for_children für dauerhafte PID- und ZEIT-Namensräume. Diese Änderung erfordert einen
Linux-Kernel der Version 4.17 oder neuer.
Die folgenden Namensraumtypen können mit unshare erzeugt werden:
Einhänge-Namensraum
Ein- und Aushängen von Dateisystemen betrifft den Rest des Systems nicht, außer für Dateisysteme, die
explizit als Mehrfacheinhängungen markiert sind (mit mount --make-shared; siehe /proc/self/mountinfo
oder findmnt -o+PROPAGATION für die shared-Schalter). Für weitere Details siehe mount_namespaces(7).
Seit Util-Linux Version 2.27 setzt unshare die Ausbreitung in einem neuen Einhängenamensraum auf
private, um sicherzustellen, dass der neue Namensraum wirklich getrennt ist. Diese Funktionalität
kann mit der Option --propagation unchanged deaktiviert werden. Beachten Sie, dass private die
Vorgabe des Kernels ist.
UTS-Namensraum
Setzen des Rechner- oder Domain-Namens wird den Rest des Systems nicht betreffen. Für weitere Details
siehe uts_namespaces(7).
IPC-Namensraum
Der Prozess erhält einen unabhängigen Namensraum für POSIX-Meldungswarteschlangen sowie
System-V-Meldungswarteschlangen, Semaphor-Gruppen und gemeinsam genutzte Speichersegmente. Für
weitere Details siehe ipc_namespaces(7).
Netz-Namensraum
Der Prozess erhält unabhängige IPv4- und IPv6-Stapel, IP-Routing-Tabellen, Firewall-Regeln, die
Verzeichnisbäume /proc/net und /sys/class/net, Sockets usw. Für weitere Details siehe
network_namespaces(7).
PID-Namensraum
Kindprozesse werden eine eigene Gruppe von Abbildungen der PIDs zu Prozessen haben. Für weitere
Details siehe pid_namespaces(7).
Cgroup-Namensraum
Der Prozess wird über einen virtualisierten Blick auf /proc/self/cgroup verfügen und neue
Cgroup-Einhängungen werden ihre Wurzel in der Wurzel der Cgroup-Namensraum-Wurzel haben. Für weitere
Details siehe cgroup_namespaces(7).
Benutzer-Namensraum
Der Prozess wird über eine eindeutige Gruppe an UIDs, GIDS und Capabilities verfügen. Für weitere
Details siehe user_namespaces(7).
Zeit-Namensraum
Der Prozess kann eine abweichende Sicht auf CLOCK_MONOTONIC und/oder CLOCK_BOOTTIME haben, was
mittels /proc/self/timens_offsets geändert werden kann. Für weitere Details, siehe
time_namespaces(7).
OPTIONEN
-i, --ipc[=Datei]
Trennen des IPC-Namensraums. Falls eine Datei angegeben ist, wird ein beständiger Namensraum mit
einer Einhängung mit bind(2) erstellt.
-m, --mount[=Datei]
Hebt die Freigabe des eingehängten Namensraums auf. Falls eine Datei angegeben ist, wird ein
beständiger Namensraum durch ein Einhängen mit bind(2) erstellt. Beachten Sie, dass Datei auf einem
Dateisystem liegen muss, dessen Ausbreitungstyp nicht auf shared gesetzt ist (anderenfalls würde ein
Fehler auftreten). Verwenden Sie den Befehl findmnt -o+PROPAGATION, wenn Sie sich bezüglich der
derzeitigen Einstellung nicht sicher sind. Lesen Sie auch die nachfolgenden Beispiele.
-n, --net[=Datei]
Trennen des Netz-Namensraums. Falls eine Datei angegeben ist, wird ein beständiger Namensraum mit
einer Einhängung mit bind(2) erstellt.
-p, --pid[=Datei]
Trennen des PID-Namensraums. Falls eine Datei angegeben ist, wird ein beständiger Namensraum mit
einer Einhängung mit bind(2) erstellt. (Die Erstellung eines beständigen Namensraums wird
fehlschlagen, wenn nicht auch die Option --fork angegeben ist.)
Siehe auch die Optionen --fork und --mount-proc.
-u, --uts[=Datei]
Trennen des UTS-Namensraums. Falls eine Datei angegeben ist, wird ein beständiger Namensraum mit
einer Einhängung mit bind(2) erstellt.
-U, --user[=Datei]
Trennen des Benutzer-Namensraums. Falls eine Datei angegeben ist, wird ein beständiger Namensraum mit
einer Einhängung mit bind(2) erstellt.
-C, --cgroup[=Datei]
Trennen des Cgroup-Namensraums. Falls eine Datei angegeben ist, wird ein beständiger Namensraum mit
einer Einhängung mit bind(2) erstellt.
-T, --time[=Datei]
Trennen des Zeit-Namensraums. Falls eine Datei angegeben ist, wird ein beständiger Namensraum mit
einer Einhängung mit bind(2) erstellt. Mit den Optionen --monotonic und --bootime können Sie den
korrespondierenden Versatz im Zeit-Namensraum angeben.
-f, --fork
Forkt das angegebene Programm als Kindprozess von unshare, anstatt es direkt auszuführen. Dies ist
nützlich, wenn Sie einen neuen PID-Namensraum erstellen. Beachten Sie: Wenn unshare auf einen
Kindprozess wartet, dann ignoriert es SIGINT und SIGTERM und leitet keine Signale an den Kindprozess
weiter. Es ist daher nötig, Signale an den Kindprozess zu senden.
--keep-caps
stellt bei übergebener Option --user sicher, dass die im Benutzernamensraum gewährten Capabilities im
Kindprozess erhalten bleiben.
--kill-child[=Signame]
Wenn sich unshare beendet, soll Signame an den mit Fork erstellten Kindprozess gesandt werden.
Kombiniert mit --pid erlaubt dies ein leichtes und zuverlässiges Töten eines gesamten Prozessbaums
unterhalb von unshare. Falls nicht angegeben, ist Signame standardmäßig SIGKILL. Diese Option
impliziert --fork.
--mount-proc[=Einhängepunkt]
Direkt vor Ausführung des Programms wird das proc-Dateisystem unter Einhängepunkt (Vorgabe ist /proc)
eingehängt. Das ist bei der Erstellung eines neuen PID-Namensraums nützlich. Dies impliziert auch die
Erstellung eines neuen Einhängenamensraums, da die /proc-Einhängung ansonsten bestehende Programme
auf dem System durcheinanderbringen würde. Das neue proc-Dateisystem wird explizit als privat
eingehängt (mit MS_PRIVATE|MS_REC).
--map-user=UID|Name
führt das Programm erst aus, nachdem die aktuelle effektive Benutzerkennung auf UID gesetzt wurde.
Falls diese Option mehrfach angegeben wird, hat die zuletzt angegebene Option Vorrang. Diese Option
impliziert --user.
--map-group=GID|Name
führt das Programm erst aus, nachdem die aktuelle effektive Gruppenkennung auf GID gesetzt wurde.
Falls diese Option mehrfach angegeben wird, hat die zuletzt angegebene Option Vorrang. Diese Option
impliziert --setgroups=deny und --user.
-r, --map-root-user
Führt das Programm erst aus, wenn die effektive Benutzer- und Gruppenkennungen auf die UID und GID
des Systemverwalters in dem neu erstellten Namensraum abgebildet wurde. Dies ermöglicht es, bequem
die benötigten Capabilities zu erlangen, um verschiedene Aspekte in dem neu erstellten Namensraum zu
verwalten (wie die Konfiguration von Schnittstellen im Netz-Namensraum oder das Einhängen von
Dateisystemen in dem Einhängenamensraum), selbst bei unprivilegierter Ausführung. Als reine
Bequemlichkeitsfunktionalität unterstützt es keine fortgeschritteneren Anwendungsfälle, wie das
Abbilden von mehreren Bereichen von UIDs und GIDs. Diese Option impliziert --setgroups=deny und
--user. Diese Option ist äquivalent zu --map-user=0 --map-group=0.
-c, --map-current-user
führt das Programm erst aus, nachdem die aktuellen effektiven Benutzer- und Gruppenkennungen im neu
erzeugten Benutzernamensraum auf die gleiche UID und GID gesetzt wurde. Diese Option impliziert
--setgroups=deny und --user. Diese Option ist äquivalent zu --map-user=$(id -ru) --map-group=$(id
-rg).
--propagation private|shared|slave|unchanged
Setzt den Einhängeausbreitungsschalter in dem neuen Einhängenamensraum rekursiv. Die Vorgabe ist, die
Ausbreitung auf private zu setzen. Es ist möglich, diese Funktionalität mit dem Argument unchanged zu
deaktivieren. Diese Option wird ohne Rückmeldung ignoriert, wenn der Einhängenamensraum (--mount)
nicht angefordert wird.
--setgroups allow|deny
Erlaubt oder verweigert den Systemaufruf setgroups(2) in Benutzer-Namensräumen.
Um setgroups(2) aufrufen zu können, muss der aufrufende Prozess mindestens über CAP_SETGID verfügen.
Seit Linux 3.19 gilt eine weitere Einschränkung: Der Kernel erteilt die Berechtigung, setgroups(2)
aufzurufen, nur nachdem die GID-Abbildung (/proc/PID/gid_map) eingerichtet wurde. Die GID-Abbildung
ist durch Root beschreibbar, wenn setgroups(2) aktiviert ist (d.h. allow, die Vorgabe) und die
GID-Abbildung wird durch unprivilegierte Prozesse beschreibbar, wenn setgroups(2) permanent
deaktiviert ist (mit deny).
-R, --root=Verzeichnis
führt den Befehl aus, wobei das Wurzelverzeichnis auf das angegebene Verzeichnis gesetzt wird.
-w, --wd=Verzeichnis
ändert das Arbeitsverzeichnis auf das angegebene Verzeichnis.
-S, --setuid UID
legt die Benutzerkennung fest, die in dem betretenen Namensraum verwendet wird.
-G, --setgid GID
legt die Gruppenkennung fest, die in dem betretenen Namensraum verwendet wird und entfernt
zusätzliche Gruppen.
--monotonic Versatz
legt den Versatz von CLOCK_MONOTONIC fest, der im betretenen Zeit-Namensraum verwendet wird. Diese
Option erfordert die Trennung eines Zeit-Namensraums mit --time.
--boottime Versatz
legt den Versatz von CLOCK_BOOTTIME fest, der im betretenen Zeit-Namensraum verwendet wird. Diese
Option erfordert die Trennung eines Zeit-Namensraums mit --time.
-V, --version
zeigt Versionsinformationen an und beendet das Programm.
-h, --help
zeigt einen Hilfetext an und beendet das Programm.
ANMERKUNGEN
Die proc- und sysfs-Dateisystemeinhängungen als Root in einem Benutzernamensraum müssen eingeschränkt
werden, so dass ein weniger privilegierter Benutzer nicht mehr Zugriffe auf sensible Dateien haben kann,
als ein höher privilegierter Benutzer unverfügbar gemacht hat. Kurz gesagt, die Regeln für proc und sysfs
sind so ähnlich zu einer Einhängung mit bind(2) wie möglich.
BEISPIELE
Der folgende Befehl erzeugt einen PID-Namensraum, wobei --fork verwendet wird, um sicherzustellen, dass
der aufgerufene Befehl in einem Kind-Namensraum ausgeführt wird (welcher der erste Prozess im Namensraum
ist), der die PID 1 hat. Die Option --mount-proc sorgt dafür, dass gleichzeitig auch ein neuer
Einhängenamensraum erzeugt und ein neues proc(5)-Dateisystem eingehängt wird, das Informationen zum neuen
PID-Namensraum enthält. Wenn der Befehl readlink beendet wird, werden die neuen Namensräume automatisch
zerstört.
# unshare --fork --pid --mount-proc readlink /proc/self
1
Mit den Rechten eines unprivilegierten Benutzers einen neuen Benutzernamensraum erstellen, in welchem die
Anmeldedaten des Benutzers auf die Root-Kennungen innerhalb des Namensraums abgebildet werden:
$ id -u; id -g
1000
1000
$ unshare --user --map-root-user \
sh -c ''whoami; cat /proc/self/uid_map /proc/self/gid_map''
root
0 1000 1
0 1000 1
Der erste der folgenden Befehle erzeugt einen neuen dauerhaften UTS-Namenraum und ändert den Rechnernamen
so, wie er im Namensraum gesehen wird. Der Namensraum wird dann mit nsenter(1) betreten, um den
geänderten Rechnernamen anzuzeigen; dieser Schritt demonstriert, dass der UTS-Namensraum weiter
existiert, obwohl der Namensraum nach dem Beenden des unshare-Prozesses keine eigenen Mitgliedprozesse
mehr hat. Der Namensraum wird dann durch Entfernen der Einhängung mit bind(2) zerstört.
# touch /root/uts-ns
# unshare --uts=/root/uts-ns hostname FOO
# nsenter --uts=/root/uts-ns hostname
FOO
# umount /root/uts-ns
Die folgenden Befehle etablieren einen dauerhaften Einhängenamensraum, der von der Einhängung mit bind(2)
/root/namespaces/mnt angegeben wird. Um sicherzustellen, dass die Erzeugung dieser Einhängung mit bind(2)
erfolgreich ist, wird das Elternverzeichnis (/root/namespaces) zu einer Einhängung mit bind(2), deren
Ausbreitungstyp nicht shared ist.
# mount --bind /root/namespaces /root/namespaces
# mount --make-private /root/namespaces
# touch /root/namespaces/mnt
# unshare --mount=/root/namespaces/mnt
Die folgenden Befehle demonstrieren die Verwendung der Option --kill-child beim Erzeugen eines
PID-Namensraums, um sicherzustellen, dass beim Töten von unshare alle Prozesse innerhalb des
PID-Namensraums getötet werden.
# set +m # Keine Meldungen zum Auftragsstatus ausgeben
# unshare --pid --fork --mount-proc --kill-child -- \
bash --norc -c ''(sleep 555 &) && (ps a &) && sleep 999'' &
[1] 53456
# PID TTY STAT TIME COMMAND
1 pts/3 S+ 0:00 sleep 999
3 pts/3 S+ 0:00 sleep 555
5 pts/3 R+ 0:00 ps a
# ps h -o 'comm' $! # Zeigen, dass der Hintergrund-Job unshare(1) ist
unshare
# kill $! # unshare(1) töten
# pidof sleep
Der Befehl pidof(1) gibt nichts aus, da die Kindprozesse getötet wurden. Genauer gesagt: Wenn der
sleep-Prozess, der in dem Namensraum die Prozesskennung 1 hat (also der Init-Prozess dieses Namensraums)
getötet wurde, dann werden daraufhin alle anderen Prozesse in diesem Namensraum getötet. Im Gegensatz
dazu zeigt eine ähnliche Reihe von Befehlen, bei denen die Option --kill-child nicht verwendet wird, dass
die Prozesse in diesem PID-Namensraum beim Beenden von unshare nicht getötet werden:
# unshare --pid --fork --mount-proc -- \
bash --norc -c ''(sleep 555 &) && (ps a &) && sleep 999'' &
[1] 53479
# PID TTY STAT TIME COMMAND
1 pts/3 S+ 0:00 sleep 999
3 pts/3 S+ 0:00 sleep 555
5 pts/3 R+ 0:00 ps a
# kill $!
# pidof sleep
53482 53480
Der folgende Befehl demonstriert die Erzeugung eines Zeit-Namensraums, in dem die Bootzeit-Uhr auf einen
Zeitpunkt gesetzt ist, der einige Jahre in der Vergangenheit liegt:
# uptime -p # Betriebszeit im ursprünglichen Zeit-Namensraum anzeigen
up 21 hours, 30 minutes
# unshare --time --fork --boottime 300000000 uptime -p
up 9 years, 28 weeks, 1 day, 2 hours, 50 minutes
AUTOREN
Mikhail Gusarov <dottedmag@dottedmag.net>, Karel Zak <kzak@redhat.com>
SIEHE AUCH
clone(2), unshare(2), namespaces(7), mount(8)
FEHLER MELDEN
Verwenden Sie zum Melden von Fehlern das Fehlererfassungssystem auf
https://github.com/karelzak/util-linux/issues.
VERFÜGBARKEIT
Der Befehl unshare ist Teil des Pakets util-linux, welches heruntergeladen werden kann von: Linux Kernel
Archive <https://www.kernel.org/pub/linux/utils/util-linux/>.
ÜBERSETZUNG
Die deutsche Übersetzung dieser Handbuchseite wurde von Chris Leick <c.leick@vollbio.de>, Dr. Tobias
Quathamer <toddy@debian.org>, Helge Kreutzmann <debian@helgefjell.de> und Mario Blättermann
<mario.blaettermann@gmail.com> 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.
util-linux 2.37.3 24. Januar 2022 UNSHARE(1)