Chroot

From Gentoo Wiki
Jump to:navigation Jump to:search
This page is a translated version of the page Chroot and the translation is 96% complete.
Outdated translations are marked like this.
Resources

chroot (Change root) (zu deutsch etwa: wechsel [das] Wurzel[verzeichnis]) ist ein Unix-Dienstprogramm, mit dem das scheinbare Root-Verzeichnis gewechselt werden kann. Damit wird eine neue Umgebung geschaffen, die logisch vom Root-Verzeichnis des Hauptsystems getrennt ist. Diese neue Umgebung wird als "chroot jail" (zu deutsch etwa: chroot-Gefängnis) bezeichnet. Innerhalb des "chroot jails" Eingesperrte, können Dateien, die sich außerhalb dieser Umgebung befinden, weder sehen noch auf diese zugreifen.

Einer der Einsatzschwerpunkte von chroot ist das Erstellen eines separaten Linux-Systems innerhalb des bestehenden Systems zum Zwecke des Testens oder zur Erlangung von Software-Kompatibilität. Chroot wird oft als eine leichtgewichtige Alternative zur Virtualisierung gesehen, weil es ohne den Ballast eines Hypervisors auskommt.

Voraussetzungen

Die Umgebung aufsetzen

Damit ein neues chroot-Setup erstellt werden kann, wird zunächst ein Verzeichnis benötigt, in dem sich das chroot befinden kann. Beispielsweise könnte ein chroot in /mnt/mychroot erstellt werden:

root #mkdir /mnt/mychroot
root #cd /mnt/mychroot

Um eine existierende Installation von einer Partition zu mounten, kann der folgende Befehl ausgeführt werden. Im folgenden Beispiel muss die <DEVICE> Zeichenkette durch das Laufwerk und die Partition der existierenden Installation ersetzt werden:

root #mkdir /mnt/mychroot
root #mount /dev/<DEVICE> /mnt/mychroot

Wenn zuvor bereits eine Installation in einem Unterverzeichnis des aktuellen Root-Dateisystems erzeugt wurde, können die obigen Schritte übersprungen werden.

Entpacken der Systemdateien

Bei einer Neuinstallation besteht der nächste Schritt darin, den stage3-Tarball herunterzuladen und in der Chroot-Umgebung zu entpacken. Weiterführende Informationen sind unter Stage-Tarball herunterladen und Stage-Tarball entpacken im Gentoo Handbuch zu finden.

root #links http://distfiles.gentoo.org/releases/amd64/autobuilds/
root #tar xpvf stage3-*.tar.xz --xattrs-include='*.*' --numeric-owner -C /mnt/mychroot

Bitte beachten, dass das Entpacken als root durchgeführt werden muss. Andernfalls wird bei der System Aktualisierung der Fehler /proc: mount failed auftreten.

Konfiguration

Vor dem Wechseln in die chroot Umgebung müssen einige Verzeichnisse gemountet werden:

root #mount --rbind /dev /mnt/mychroot/dev
root #mount --make-rslave /mnt/mychroot/dev
root #mount -t proc /proc /mnt/mychroot/proc
root #mount --rbind /sys /mnt/mychroot/sys
root #mount --make-rslave /mnt/mychroot/sys
root #mount --rbind /tmp /mnt/mychroot/tmp
root #mount --bind /run /mnt/mychroot/run

Einige grundlegende Konfigurationsdateien müssen vom Host kopiert werden. Bei der Verwendung einer bestehenden Installation, die Datei /etc/portage/make.conf nicht kopieren:

root #cp /etc/portage/make.conf /mnt/mychroot/etc/portage # Wenn Sie eine bestehende Installation verwenden, überspringen Sie diesen Befehl.
root #cp /etc/resolv.conf /mnt/mychroot/etc

Bedienung

Ist dieser Schritt erfolgt, kann die Chroot-Umgebung durch die Ausführung der folgenden Befehle betreten werden:

root #chroot /mnt/mychroot /bin/bash
root #. /etc/profile
root #export PS1="(chroot) $PS1"

Um sie persistent zu machen, können diese Befehle der .bashrc hinzugefügt werden:

DATEI /root/.bashrc
. /etc/profile
export PS1="(chroot) $PS1"

Falls der Fehler Error opening terminal: xterm-kitty auftritt, kann Folgendes zur .bashrc hinzugefügt werden:

DATEI /root/.bashrc
export TERM=xterm

Falls eine neue Installation erstellt wird, sollte Portage synchronisiert werden um sicherzustellen, dass alles aktuell ist.

(chroot) root #emerge-webrsync
(chroot) root #emerge --sync

Das System ist jetzt bereit. In diesem kann nun Software installiert, mit Einstellungen herumgespielt, Experimentelle Pakete und Konfigurationen getestet werden, ohne negative Effekte auf das Haupt-System fürchten zu müssen. Um die chroot Umgebung zu verlassen genügt es exit einzugeben, oder Ctrl+d zu drücken. Hierdurch wird die Konsole in die normale Umgebung zurückgesetzt. Die Verzeichnisse, die zuvor gemountet wurden, sollten nun wieder ausgehängt (unmount) werden.

systemd-nspawn

Wird auf dem System systemd eingesetzt, kann systemd-nspawn verwendet werden, welches einige Standardroutinen automatisiert, die zur Verwaltung von chroots benötigt werden. Um zum Beispiel ein chroot mit der gleichen Konfiguration, wie im Abschnitt Konfiguration spezifiziert, mittels systemd-nspawn zu betreten, reicht folgender Befehl:

root #cp /etc/portage/make.conf /mnt/mychroot/etc/portage
root #systemd-nspawn -D /mnt/mychroot --bind=/tmp --resolv-conf=/etc/resolv.conf

Init-Skripte

Wenn das Aufsetzen von chroots eine Aufgabe ist, die oft durchgeführt werden muss, ist es möglich, das Mounten der Verzeichnisse durch das Verwenden eines Init-Skripts zu beschleunigen. Das Skript kann zum Standard-Runlevel hinzugefügt und somit automatisch beim Systemstart eingerichtet werden:

DATEI /etc/init.d/mychroot
#!/sbin/openrc-run
 
depend() {
   need localmount
   need bootmisc
}
 
start() {
     ebegin "Mounte chroot-Verzeichnisse"
     mount -o rbind /dev /mnt/mychroot/dev > /dev/null &
     mount -t proc none /mnt/mychroot/proc > /dev/null &
     mount -o bind /sys /mnt/mychroot/sys > /dev/null &
     mount -o bind /tmp /mnt/mychroot/tmp > /dev/null &
     eend $? "Beim Mounten der chroot-Verzeichnisse ist ein Fehler aufgetreten"
}
 
stop() {
     ebegin "Unmounte chroot-Verzeichnisse"
     umount -f /mnt/mychroot/dev > /dev/null &
     umount -f /mnt/mychroot/proc > /dev/null &
     umount -f /mnt/mychroot/sys > /dev/null &
     umount -f /mnt/mychroot/tmp > /dev/null &
     eend $? "Beim Unmounten der chroot-Verzeichnisse ist ein Fehler aufgetreten"
}

Falls ein anderes Verzeichnis oder eine andere Partition verwenden werden, müssen lediglich die notwendigen Mount-Befehle in der Funktion start() hinzugefügt und /mnt/chroot auf den passenden Namen geändert werden.

Ton und Grafik

Software die innerhalb des chroot läuft, hat standardmäßig keinen Zugriff auf Sound- oder Display-Dienste des Systems. Dies kann behoben werden, indem entweder ein Socket geteilt wird oder indem die Kommunikation per TCP über localhost läuft.

Wayland

Wayland verwendet einen Socket, um Clients mit dem Compositor zu verbinden. Dieser Socket muss mit der chroot Umgebung geteilt werden, um grafische Anwendungen laufen lassen zu können. Das allgemeine Verfahren, um diesen Socket zu finden ist: [1]

  1. Wenn WAYLAND_SOCKET gesetzt ist, interpretiere es als Dateideskriptor Nummer unter welcher die Verbindung bereits aufgebaut ist und gehe davon aus, dass der Elternprozess die Verbindung für uns konfiguriert hat.
  2. Wenn WAYLAND_DISPLAY gesetzt ist, hänge es an XDG_RUNTIME_DIR an, um den Pfad zum Unix Socket zu bilden.
  3. Nehme an, dass der Socket Name wayland-0 ist und hänge diesen an XDG_RUNTIME_DIR an, um den Pfad zum Unix Socket zu bilden.

Die Verwendung von WAYLAND_DISPLAY und XDG_RUNTIME_DIR passt in den meisten Fällen und kommt hier zum Einsatz. Standardmäßig ist XDG_RUNTIME_DIR auf /run/user/$(uid) gesetzt. Dieses Verzeichnis ist in der chroot Umgebung nicht verfügbar, weil im Absatz Konfiguration die bind mounts /run nicht rekursiv durchgeführt wurden. Angenommen die uid der Nutzer:in ist 1000, kann dies gelöst werden, indem entweder /run/user/1000 mit --bind eingehängt wird:

root #mkdir -p /mnt/mychroot/run/user/1000
root #mount --bind /run/user/1000 /mnt/mychroot/run/user/1000

oder indem /run einfach rekursiv mit --bind eingehängt wird:

root #mount --rbind /run /mnt/mychroot/run

Die Wayland Bibliothek dev-libs/wayland verwendet das selbe Verfahren wie oben, um den Socket zu finden. Daher genügt es XDG_RUNTIME_DIR und WAYLAND_DISPLAY zu definieren, um den Socket mit der chroot Umgebung zu teilen. Hier wird davon ausgegangen, dass der Wayland Socket Name WAYLAND_DISPLAY wayland-0 lautet.

(chroot) root #useradd -m user
(chroot) root #su -l user
(chroot) user $export XDG_RUNTIME_DIR=/run/user/1000
(chroot) user $export WAYLAND_DISPLAY=wayland-0
(chroot) user $MOZ_ENABLE_WAYLAND=1 firefox-bin

Es werden Berechtigungsfehler auftreten, wenn die Nutzer:in in der chroot Umgebung keine Rechte hat, auf den Wayland Socket zuzugreifen. Dies kann durch Zuordnung des User Namespace oder ACLs gelöst werden. Am einfachsten ist es sicherzustellen, dass die User IDs übereinstimmen. Die Option useradd -u, --uid UID kann verwendet werden, wenn eine Nutzer:in erstellt wird.

PipeWire

Wie Wayland verwendet PipeWire einen Socket, um Clients mit dem PipeWire Dienst zu verbinden.

Anwendungen gehen davon aus, dass der PipeWire Socket sich unter ${XDG_RUNTIME_DIR}/pipewire-0 befindet. Daher ist alles was zu tun ist, um PipeWire Clients mit dem Host-Dienst zu verbinden, XDG_RUNTIME_DIR in der chroot Umgebung bekannt zu machen. Das Vorgehen ist identisch zu dem in Wayland beschriebenen. Um XDG_RUNTIME_DIR bekannt zu machen, welches meistens auf /run/user/$(uid) gesetzt ist, werden die folgenden Befehle verwendet:

root #mkdir -p /mnt/mychroot/run/user/1000
root #mount --bind /run/user/1000 /mnt/mychroot/run/user/1000

XDG_RUNTIME_DIR wird beim Einloggen in die chroot Umgebung nicht gesetzt, daher muss XDG_RUNTIME_DIR exportiert werden, damit der PipeWire Client den Socket findet:

(chroot) user $export XDG_RUNTIME_DIR=/run/user/1000
(chroot) user $pw-cli

Xorg

Standardmäßig lauscht Xorg auf einem Socket der sich an /tmp/.X11-unix/X${DISPLAY} befindet, sowie auf dem localhost TCP Port 6000 + ${DISPLAY}. [2] lauschen. Die Anweisungen in Konfiguration binden /tmp mit --bind ein, daher ist keine weitere Konfiguration nötig, außer dem Setzen der DISPLAY Variable, um eine grafische Anwendung laufen zu lassen:

(chroot) user $DISPLAY=:0 firefox-bin

Wenn die uid der Nutzer:in innerhalb der chroot Umgebung nicht mit der der uid außerhalb der chroot Umgebung übereinstimmt, ist es erforderlich die Berechtigungen mit xhost zu setzen. Um alle lokalen Verbindungen zu erlauben, muss das Folgende außerhalb von chroot ausgeführt werden:

user $xhost +local:

Siehe auch

Externe Quellen

Einzelnachweise

  1. https://wayland-book.com/protocol-design/wire-protocol.html
  2. Wenn also DISPLAY=:12 ist, dann wird Xorg auf localhost TCP port 6012