chroot

Aus wiki.archlinux.de

Das Programm chroot ermöglicht es, das Wurzelverzeichnis eines Programms zu bestimmen. Standardmäßig ist / das Wurzelverzeichnis, von dem aus alle weiteren Verzeichnisse referenziert werden können. Das Ändern des Wurzelverzeichnisses (chrooten) ist zum Beispiel nötig, wenn man ein verlorenes root-Passwort wiederherstellen muss, oder wenn man einen Prozess getrennt von anderen Prozessen laufen lassen will.

Ein geändertes Wurzelverzeichnis (Chroot) wird unter Linux gemeinhin nicht als Sicherheitsfunktion angesehen, zumal in der Dokumentation von chroot das „Ausbrechen“ aus einem Chroot beschrieben wird. Dieser Wiki-Artikel beschäftigt sich daher mit dem Einrichten und Auflösen eines Chroot zu Wartungszwecken.

Einrichten

Das Einrichten eines Chroot bedarf lediglich eines lauffähigen Systems, auf dem man root-Rechte erlangen kann. Dies kann zum Beispiel eine andere Installation oder eine Live-CD sein.

Was man verwendet, ist nicht wichtig, da chroot zum Standard-Funktionsumfang von GNU/Linux gehört. Man muss lediglich darauf achten, dass man ein System verwendet, das auf die selbe Architektur ausgelegt ist, auf die auch die installierte Distribution ausgelegt ist.

Wenn man zum Beispiel eine x86_64-Distribution installiert hat, sollte man keine i686-Live-CD verwenden, sondern zu einer x86_64-Live-CD greifen.

Man sollte auch darauf achten, dass der verwendete Kernel der Live-CD aktuell ist. Ansonsten kommt es zu folgender Fehlermeldung: 'FATAL: kernel too old' beim Aufruf von chroot.

Selbstverständlich sollte man nach dem Booten der Live-CD root-Rechte haben, oder diese durch entsprechende Befehle (siehe Dokumentation der jeweiligen Live-CD) erlangen. Sollte man spezielle Kernelmodule verwenden wollen/müssen, sollte man diese vor dem Chrooten laden. Auch kann man seine swap-Partition aktivieren.

Nun kann man sich mittels fdisk -l anzeigen lassen, welche Partitionen vom System der Live-CD erkannt wurden. Da das Chroot einen Wechsel in das installierte System ermöglichen soll, muss das Dateisystem gemountet werden, auf dem sich das Wurzelverzeichnis (/) des installierten Systems befindet.

mkdir /mnt/root
mount /dev/sda1 /mnt/root

Hier wird /dev/sda1 als /mnt/root gemountet. /dev/sda1 ist dabei natürlich an die tatsächlich vorhandene Situation anzupassen. Sollte man sein System weiter unterteilt haben, sollte man die entsprechenden Dateisysteme ebenfalls mounten. Hat man zum Beispiel /bin in einem eigenem Dateisystem, so muss man dieses entsprechend mounten.

mount /dev/sda2 /mnt/root/bin/

Hier wird /dev/sda2 als /mnt/root/bin gemountet. /dev/sda2 ist dabei natürlich an die tatsächlich vorhandene Situation anzupassen. So verfährt man mit allen weiteren, für den Systemstart nötigen Dateisystemen.

Nachdem das System soweit gemountet wurde, müssen noch die temporären Dateisysteme proc und sysfs sowie /dev gemountet werden, damit das System, in das gewechselt wird, vollständig ist.

mount -t proc proc /mnt/root/proc/
mount -t sysfs sys /mnt/root/sys/
mount -o bind /dev /mnt/root/dev/

Sofern man innerhalb der Live-CD das Netzwerk eingerichtet hat, und man dieses auch im Chroot verwenden will, und man nicht weiß, ob das installierte System über eine funktionierende Netzwerkkonfiguration bezüglich der Namensauflösung verfügt, kann man mittels cp /etc/resolv.conf /mnt/root/etc/ die resolv.conf des Live-Systems kopieren.

Chrooten

Nachdem nun alle Dateisysteme des Systems, und alle temporären Dateisysteme gemountet wurden, und man sich um die Netzwerkverbindung gekümmert hat, kann man nun in das installierte System wechseln.

chroot /mnt/root/ /bin/bash

Der erste Parameter für chroot bestimmt das neue Wurzelverzeichnis des Prozesses der Zweite Parameter bestimmt den Befehl, der in dem System, in das gewechselt wird, ausgeführt werden soll, (im Falle der Live-CD wird das eine Shell sein).

Man befindet sich jetzt in dem installierten System. Alle Befehle, die man nun ausführt, werden nicht mehr in der Umgebung der Live-CD ausgeführt, sondern durch das installierte System. Ein cd / wechselt zum Beispiel nicht in das Wurzelverzeichnis des Systems der Live-CD, sondern in das Wurzelverzeichnis des installierten Systems.

Sollte man in der globalen Konfigurationsdatei der bash Dinge stehen haben, die man verwenden will, sollte man diese mittels source /etc/profile laden. Auch sollte man sich zur besseren Unterscheidbarkeit mittels export PS1="(chroot) $PS1" das Promt im Chroot anpassen.

Es können nun alle nötigen Arbeiten am System vorgenommen werden, um das System wieder lauffähig zu bekommen.

Chroot verlassen

Wenn man mit den Arbeiten am installierten System fertig ist, sollte man es wieder „sauber“ verlassen.

exit
umount /mnt/root/proc/
umount /mnt/root/sys/
umount /mnt/root/dev/
umount …
cd
umount /mnt/root/

Sollte man beim unmounten der Dateisysteme eine Fehlermeldung darüber bekommen, dass das jeweilige Dateisystem noch beschäftigt sei, liegt es daran, dass im Chroot noch ein Prozess auf eines der Dateisysteme zugreift. Man sollte dann mittels chroot /mnt/root/ /bin/bash nochmals in das System hineingehen, und prüfen, ob wirklich alle Prozesse beendet wurden.

Wenn alle Dateisysteme des installierten Systems mittels umount erfolgreich ausgehangen wurden, kann der Computer heruntergefahren oder neu gestartet werden.

Weblinks