Chroot
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:
/root/.bashrc. /etc/profile
export PS1="(chroot) $PS1"
Falls der Fehler Error opening terminal: xterm-kitty auftritt, kann Folgendes zur .bashrc hinzugefügt werden:
/root/.bashrcexport 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 --syncDas 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:
/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]
- 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.
- Wenn WAYLAND_DISPLAY gesetzt ist, hänge es an XDG_RUNTIME_DIR an, um den Pfad zum Unix Socket zu bilden.
- Nehme an, dass der Socket Name
wayland-0ist 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/1000root #mount --bind /run/user/1000 /mnt/mychroot/run/user/1000oder indem /run einfach rekursiv mit --bind eingehängt wird:
root #mount --rbind /run /mnt/mychroot/runDie 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-binEs 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/1000root #mount --bind /run/user/1000 /mnt/mychroot/run/user/1000XDG_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-cliXorg
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-binWenn 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
- Project:X86/Chroot Guide — provides instructions on how to create a fresh Gentoo installation inside a chroot to assist in testing Gentoo packages for stabilization and for other sundry testing.
- Knowledge Base:Chrooting returns exec format error
- Chroot-Proxy-Dienste
- Chrooting und virtuelle Server
- PRoot — a user-space implementation of chroot, mount --bind, and binfmt_misc.
Externe Quellen
- chroot im Archlinux Wiki
Einzelnachweise
- ↑ https://wayland-book.com/protocol-design/wire-protocol.html
- ↑ Wenn also DISPLAY=:12 ist, dann wird Xorg auf localhost TCP port 6012