chroot

Mit chroot (für change root) ist es möglich, das aktuelle root-Verzeichnis (/) für den aktuellen Prozess und alle Kindprozesse zu wechseln. Nach dem Wechsel mittels chroot kann nicht mehr auf Daten zugegriffen werden, die sich außerhalb des neuen Dateibaumes beginnend ab / befinden. In diesem Zusammenhang spricht man auch von einem “chroot jail”.

Eine weitere sehr machtvolle Anwendung ist es, mittels chroot in ein bereits existierendes Linux-System zu wechseln, um dort innerhalb dieses Systems Änderungen vorzunehmen. So ist es beispielsweise möglich, nach dem Wechsel in ein solches Linux das Passwort zu ändern, sollte man es vergessen haben, oder aber das System zu reparieren, falls etwas das System vermeintlich unbrauchbar gemacht hat.

chroot in ein bestehendes Linux

Nehmen wir an, wir haben ein Linux-System, dass aufgrund eines Software-Fehlers nicht mehr verwendbar ist. Wir wissen aber, wie wir diesen beheben könnten, sofern wir Zugriff darauf erlangen. Dazu ist es nötig, dass System in irgendeiner Weise von einem anderweitig gestarteten Linux mounten zu können. Entweder, indem das zu reparierende System an ein bestehendes Linux angeschlossen werden kann, z. B. in Form einer SD-Karte oder externer Festplatte, oder aber mittels eines Live-Systems, dass auf der Hardware mit dem reparaturbedürftigen Linux gestartet wird.

Ist dies geschehen, kann das beschädigte System auf dem laufenden Linux gemountet werden. Dazu kann mittels lsblk herausgefunden werden, welche Partition auf welchem Datenträger von Interesse ist. Mehr Infos liefert der Aufruf von sudo fdisk -l. Ist die Partition mit dem betroffenen System ausgemacht, kann es mittels

sudo mount /dev/sdXY /mnt

eingebunden werden. Weiter werden noch spezielle Verzeichnisse benötigt, die Hardware-Informationen bereitstellen und die für viele Anwendungen benötigt werden:

sudo mount --bind /dev /mnt/dev
sudo mount --bind /proc /mnt/proc
sudo mount --bind /sys /mnt/sys

Nun ist alles eingerichtet, um chroot anzuwenden. Das allgemeine Muster ist

sudo chroot <Verzeichnis> <Befehl>

chroot muss immer mit root-Rechten ausgeführt werden. Wird kein Befehl angegeben, wird ${SHELL} -i nach dem Wechsel in das neue Wurzelverzeichnis ausgeführt, wobei die als Umgebungsvariable definierte Shell, zumeist /bin/bash, im interaktiven Modus (-i) gestartet wird.

Wir wechseln also folgend den oben verwendeten Pfaden mit

sudo chroot /mnt

in die eingebundene Partition und werden mit einer interaktiven Shell als root-Benutzer im eingebunden System begrüßt. Nun können die entsprechenden Aufgaben erledigt werden, um das System zu reparieren.

Ist alles erledigt, können wir die chroot-Umgebung mittels exit oder Strg+D wieder verlassen. Die eingebundenen Verzeichnisse und Partitionen werden wieder ausgehängt:

sudo umount /mnt/sys
sudo umount /mnt/proc
sudo umount /mnt/dev
sudo umount /mnt

Wurde ein externer Datenträger eingebunden, kann es sinnvoll sein, noch mit einem sudo sync die im Speicher liegenden Daten aus dem Buffer auf den Datenträger zu schreiben. Damit sind wir fertig und können, wurde ein Live-System gestartet, mit einem sudo reboot now einen Neustart auslösen.