unshare - Programm in neuen Namensräumen
ausführen
ÜBERSICHT
unshare [Optionen] [Programm [Argumente]]
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 Bind-Einhängung
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 wird einen unabhängigen Namensraum für
POSIX-Nachrichtenwarteschlangen sowie System-V-Nachrichtenwarteschlangen,
Semaphore-Gruppen und gemeinsame Speichersegmente haben. Für
weitere Details siehe ipc_namespaces(7).
- Netz-Namensraum
- Der Prozess wird über unabhängige IPv4- und IPv6-Stapel,
IP-Routing-Tabellen, Firewall-Regeln, die Verzeichnisbäume
/proc/net und /sys/class/net usw. verfügen.
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).
- -i,
--ipc[=Datei]
- Trennen des IPC-Namensraums. Falls Datei angegeben ist, wird ein
beständiger Namensraum mit einer
»bind«-Einhängung erstellt.
- -m,
--mount[=Datei]
- Hebt die Freigabe des eingehängten Namensraums auf. Falls
Datei angegeben ist, wird ein beständiger Namensraum durch
ein Einhängen mit »bind« 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 Datei angegeben ist, wird ein
beständiger Namensraum mit einer
»bind«-Einhängung erstellt.
- -p,
--pid[=Datei]
- Trennen des PID-Namensraums. Falls Datei angegeben ist, wird ein
beständiger Namensraum mit einer
»bind«-Einhängung 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 Datei angegeben ist, wird ein
beständiger Namensraum mit einer
»bind«-Einhängung erstellt.
- -U,
--user[=Datei]
- Trennen des Benutzer-Namensraums. Falls Datei angegeben ist, wird
ein beständiger Namensraum mit einer
»bind«-Einhängung erstellt.
- -C,
--cgroup[=Datei]
- Trennen des Cgroup-Namensraums. Falls Datei angegeben ist, wird ein
beständiger Namensraum mit einer
»bind«-Einhängung erstellt.
- -T,
--time[=Datei]
- Trennen des Zeit-Namensraums. Falls Datei angegeben ist, wird ein
beständiger Namensraum mit einer
»bind«-Einhängung 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 wurden. 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.
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 Bind-Einhängung wie möglich.
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 Bind-Einhängung
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
»bind«-Einhängung /root/namespaces/mnt angegeben wird.
Um sicherzustellen, dass die Erzeugung dieser Bind-Einhängung
erfolgreich ist, wird das Elternverzeichnis (/root/namespaces) zu
einer Bind-Einhängung, 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 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
Der Befehl unshare ist Teil des Pakets util-linux und kann von
https://www.kernel.org/pub/linux/utils/util-linux/ heruntergeladen
werden.
Ü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.