12 Unshare: Grundlagen und Beispiele

12.1 Einführung

unshare ist ein Befehl unter Linux, der es ermöglicht, Prozesse in eigenen Namespaces zu starten. Namespaces sind eine Kernel-Funktion, die verschiedene Aspekte des Betriebssystems isolieren, wie Prozess-IDs (PIDs), Mount-Punkte, Netzwerkinterfaces und Benutzer-IDs. unshare ist eine zentrale Technologie für die Containerisierung, da es die Isolation von Prozessen ermöglicht.

12.2 Unshare-Befehl

Der unshare-Befehl erstellt neue Namespaces und führt einen neuen Prozess darin aus. Dadurch werden bestimmte Ressourcen des Prozesses isoliert, ohne dass sie mit anderen Prozessen des Systems geteilt werden müssen.

12.2.1 Syntax

unshare [OPTIONEN] PROGRAMM [ARGUMENTE...]

12.3 Wichtige Optionen

12.4 Beispiele

12.4.1 1. Prozess in einem neuen Mount-Namespace starten

sudo unshare -m /bin/bash

Dies startet eine neue Bash-Shell in einem separaten Mount-Namespace. Änderungen an den Mount-Punkten innerhalb dieser Shell beeinflussen nicht das Host-System.

12.4.2 2. Prozess in einem neuen PID-Namespace starten

sudo unshare -p --fork /bin/bash

Der Parameter --fork sorgt dafür, dass ein neuer Prozess-ID-Namespace erstellt wird. Innerhalb dieser neuen Bash-Shell haben alle gestarteten Prozesse ihre eigenen PID-Zuordnungen, die vom Host-System unabhängig sind.

12.4.3 3. Prozess in einem neuen Netzwerk-Namespace starten

sudo unshare -n /bin/bash

Dies startet eine Bash-Shell in einem neuen Netzwerk-Namespace. Netzwerkgeräte und -konfigurationen innerhalb dieses Namespaces sind vom Host-Netzwerk isoliert.

12.4.4 4. Prozess in einem neuen Benutzer-Namespace starten

sudo unshare -U /bin/bash

Ein neuer Benutzer-Namespace isoliert Benutzer- und Gruppen-IDs. Dies ermöglicht es, Prozesse als andere Benutzer zu betreiben, ohne die Privilegien des Host-Systems zu ändern.

12.4.5 5. Mehrere Namespaces kombinieren

sudo unshare -m -u -p --fork /bin/bash

Hier werden Mount-, UTS- und PID-Namespaces kombiniert. Dies isoliert den Prozess hinsichtlich der Mount-Punkte, des Hostnamens und der Prozess-IDs.

12.4.6 6. Netzwerk-Namespace konfigurieren

Ein neues Netzwerk-Namespace allein ist isoliert und hat keine Netzwerkkonnektivität. Um dies zu demonstrieren:

sudo unshare -n /bin/bash

Innerhalb der neuen Bash-Shell:

ip link set lo up
ip addr add 192.168.1.1/24 dev lo
ping 192.168.1.1

Hier wird das Loopback-Interface aktiviert und eine IP-Adresse zugewiesen. Dies demonstriert die Netzwerkkonfiguration innerhalb des neuen Namespaces.

12.5 Beispiel: Fork-Prozess, eigener PID-Namespace und /proc als separater Mount-Namespace

In diesem Beispiel wird gezeigt, wie man einen neuen PID-Namespace erstellt und das /proc-Verzeichnis so mountet, dass es nur die Prozesse innerhalb des neuen Namespaces anzeigt. Dabei wird die Option --mount-proc verwendet.

12.5.1 Schritt 1: Erstellen eines neuen PID-Namespace und Mounten von /proc

Verwenden Sie den folgenden Befehl, um einen neuen PID-Namespace zu erstellen und /proc zu mounten:

sudo unshare -p --fork --mount-proc=/proc /bin/bash

Dieser Befehl startet eine neue Bash-Shell in einem separaten PID-Namespace. Die Option --mount-proc=/proc sorgt dafür, dass das virtuelle Dateisystem proc im Verzeichnis /proc des neuen Namespaces gemountet wird. Dadurch werden nur die Prozesse innerhalb des neuen PID-Namespaces angezeigt.

12.5.2 Überprüfung

Um zu überprüfen, dass das /proc-Verzeichnis nur die Prozesse innerhalb des neuen PID-Namespaces anzeigt, können Sie die Prozessliste anzeigen:

ps aux

Die Ausgabe sollte nur die Prozesse innerhalb des neuen PID-Namespaces zeigen.

12.5.3 Beispielerklärung

  1. Der Befehl sudo unshare -p --fork erstellt einen neuen PID-Namespace und startet einen neuen Prozess (die Bash-Shell) darin.
  2. Die Option --mount-proc=/proc sorgt dafür, dass ein neues Mount für das /proc-Verzeichnis im neuen Namespace erstellt wird.
  3. Innerhalb der neuen Bash-Shell zeigt das /proc-Verzeichnis nur die Prozesse des neuen PID-Namespaces an.