schroot - häufig gestellte Fragen
Diese Handbuchseite deckt viele verschiedene häufig gestellte Fragen
über die Konfiguration und Benutzung von Schroot ab.
Standardmäßig kopiert Schroot die NSS-Datenbanken des Systems
(»passwd«, »shadow«, »group«,
»gshadow«, »services«, »protocols«,
»networks« und »hosts«, etc.) in die Chroot
hinein. Der Grund dafür ist, dass die Chroot-Umgebung kein
vollständig separates System ist und es durch das Kopieren synchron
gehalten wird. Dies ist jedoch nicht immer erwünscht, insbesondere,
wenn ein Paket in die Chroot installiert wird, das Systembenutzer und Gruppen
erzeugt, die auf dem Wirtsystem nicht vorhanden sind, da diese beim
nächsten Herüberkopieren der Datenbanken verschwinden werden.
Die hier vorgeschlagene Behelfslösung besteht darin, das Kopieren zu
deaktivieren, indem der Schlüssel
setup.nssdatabases in
schroot.conf geleert wird. In früheren Veröffentlichungen
von Schroot wurde dies durch Auskommentieren der Datei NSSDATABASES für
die Chroot erreicht (standardmäßig
/etc/schroot/default/config). Die Datenbankliste kann ebenfalls durch
Bearbeiten der Datei angepasst werden, die die Datenbankliste enthält
(standardmäßig
/etc/schroot/default/nssdatabases.
In Zukunft wird an einem besseren Schema gearbeitet, um die Rechner- und
Chroot-Datenbanken synchron zu halten. Es kann Einträge
zusammenführen, anstatt die ganze Datenbank zu überschreiben,
wodurch Chroot-spezifische Änderungen erhalten bleiben.
Diese beiden Chroot-Typen sind im Grunde identisch, da sie beide nur
Verzeichnisse im Dateisystem sind. »plain« ist sehr einfach und
führt keine Einrichtungsaufgaben durch. Der einzige Grund, aus dem Sie
es möglicherweise verwenden würden, ist, wenn Sie ein Upgrade
eines Programms wie
dchroot(1) oder
chroot(8)
durchführen, das nichts anderes tut, als einen Befehl oder eine Shell
in einem Verzeichnis ausführen. Demgegenüber führen
Verzeichnis-Chroots Einrichtungsskripte aus, die zusätzliche
Dateisysteme einhängen und andere Einrichtungsaufgaben erledigen
können.
Einige Chroot-Typen unterstützen das
Klonen. Das heißt,
dass Sie, wenn Sie eine Sitzung starten, eine
Kopie der Chroot
erhalten, die nur während der Lebensdauer der Sitzung besteht. Dies ist
nützlich, wenn Sie vorübergehend eine saubere Kopie des Systems
für eine einzelne Aufgabe möchten, die dann automatisch
gelöscht wird, wenn Sie damit fertig sind. Die
Debian-Paketbau-Dæmons führen zum Beispiel
sbuild(1) aus,
um Debian-Pakete zu bauen und dieses Programm verwendet Schroot, um eine
saubere Bau-Umgebung für jedes einzelne Paket zu erstellen. Ohne
Schnappschüsse müsste die Chroot am Ende jedes Bauens auf ihren
Anfangszustand zurückgesetzt werden, um für das nächste
bereit zu sein und jedes zurückgelassene Überbleibsel vom
Entfernen des Pakets oder früherem Bauen könnte mit dem
nächsten Bauen wechselwirken.
Die am häufigsten benutzte Methode zum Erstellen von
Schnappschüssen ist die Verwendung von LVM-Schnappschüssen
(Chroot-Typ »lvm-snapshot«). In diesem Fall muss die Chroot auf
einem logischen LVM-Laufwerk (LV) existieren. Schnappschüsse eines LV
können während der Sitzungseinrichtung mit
lvcreate(8)
erstellt werden. Diese verbrauchen jedoch viel Platz auf der Platte. Eine
neuere Methode ist die Verwendung von Btrfs-Schnappschüssen (Chroot-Typ
»btrfs-snapshot«), die viel weniger Plattenplatz beanspruchen
und zuverlässiger als LVM-Schnappschüsse sind. Btrfs ist
allerdings immer noch experimentell, aber es besteht die Hoffnung, dass es die
empfohlene Methode wird, wenn es reift.
Unions sind eine Alternative zu Schnappschüssen. In dieser Situation
wird, anstatt eine Kopie des Chroot-Dateisystems zu erstellen, ein
vorübergehendes Schreib-/Lesedateisystem oben auf das
Chroot-Dateisystem gelegt, so dass Änderungen im
darüberliegenden Dateisystem gespeichert werden und das
Original-Chroot-Dateisystem unberührt bleibt. Der Linux-Kernel muss
erst die Unterstützung von Union-Dateisystemen wie Aufs und Unionfs
integrieren, daher sind LVM-Schnappschüsse derzeit immer noch die
empfohlene Methode.
Ein häufiges Problem beim Versuch einen Dæmon in einer Chroot
auszuführen ist, dass Sie bemerken, dass er gar nicht läuft.
Typischerweise wurde der Dæmon kurz nach dem Start gekillt.
Wenn Schroot ausgeführt wird, startet es eine Sitzung, führt den
angegebenen Befehl oder die Shell aus, wartet auf das Beenden des Befehls oder
der Shell und beendet dann die Sitzung. Für einen normalen Befehl oder
eine Shell funktioniert das sehr gut. Dæmons starten normalerweise
jedoch im Hintergrund und lösen sich vom steuernden Terminal. Sie tun
dies, indem sie sich zweimal verzweigen und den Elternprozess enden lassen.
Unglücklicherweise bedeutet dies, dass Schroot das Beenden des
Programms bemerkt (der Dæmon ist ein verwaister Enkel dieses Prozesses)
und dann die Sitzung beendet. Teil des Beendens der Sitzung ist das Killen
aller Prozesse, die innerhalb der Chroot laufen, was wiederum bedeutet, dass
der Dæmon beim Beenden der Sitzung gekillt wird.
Als Folge davon ist es nicht möglich, einen Dæmon
direkt
mit Schroot auszuführen. Sie können es dennoch tun, wenn Sie
eine Sitzung mit
--begin-session erstellen und dann den Dæmon
mit
--run-session ausführen. Es liegt dann in Ihrer
Verantwortung, die Sitzung mit
--end-session zu schließen, wenn
der Dæmon beendet wurde und Sie ihn nicht länger
benötigen.
Gelegentlich kann es nötig sein, Sitzungen von Hand aufzuräumen.
Falls sich etwas auf Ihrem System ändert, das ein Fehlschlagen des
Einrichtungsskripts beim Beenden der Sitzung zur Folge hat, zum Beispiel das
Entfernen einer benötigten Datei oder eines Verzeichnisses, ist es
Schoot möglicherweise nicht möglich, alles automatisch
aufzuräumen. Für jedes im Abschnitt »
Sitzungsverzeichnisse« in
schroot(1) aufgeführte
Sitzungsverzeichnis müssen alle Dateien mit dem Namen der
Sitzungskennung gelöscht und alle Verzeichnisse mit dem Namen der
Sitzungskennung ausgehängt (falls es darunter eingehängte
Dateisysteme gibt) und dann auch gelöscht werden.
Um zum Beispiel die Sitzung mit Namen
meine-Sitzung von Hand zu
entfernen:
- •
- die Konfigurationsdatei der Sitzung entfernen
% rm /var/lib/schroot/session/meine-Sitzung↵
- •
- auf eingehängte Dateisysteme prüfen
% /usr/lib/x86_64-linux-gnu/schroot/schroot-listmounts -m \
/var/run/schroot/mount/meine-Sitzung↵
- •
- eingehängte Dateisysteme aushängen
- •
-
/var/run/schroot/mount/meine-Sitzung entfernen
- •
- dies für andere Verzeichnisse wie
/var/lib/schroot/union/underlay,
/var/lib/schroot/union/overlay und /var/lib/schroot/unpack
wiederholen
HINWEIS: Entfernen Sie keine Verzeichnisse, ohne zu prüfen, ob
darunter irgendwelche Dateisysteme eingehängt sind, da Dateisysteme wie
/home immer noch mit der Option »bind« eingehängt
sein könnten. Dies dennoch zu tun, könnte zum Verlust
unwiederbringlicher Daten führen.
Im normalen Betrieb führen Sie einen Befehl ähnlich diesem aus:
% schroot -c squeeze -- Befehl↵
Dadurch würde der Befehl
Befehl in der Chroot
squeeze
ausgeführt. Während es hier nicht offensichtlich ist, dass eine
Sitzung benutzt wird, unternimmt Schroot die folgenden Schritte:
- •
- Es wird mittels der Chroot squeeze eine Sitzung
erstellt. Dieser wird automatisch ein eindeutiger Name wie
squeeze-57a69547-e014-4f5d-a98b-f4f35a005307 gegeben, obwohl Sie
normalerweise nichts darüber wissen möchten.
- •
- Einrichtungsskripte werden zum Erstellen der
Sitzungs-Chroot ausgeführt und richten sie Ihnen ein.
- •
- Der Befehl Befehl wird innerhalb der Sitzungs-Chroot
ausgeführt.
- •
- Zum Aufräumen der Sitzungs-Chroot werden
Einrichtungsskripte ausgeführt.
- •
- Die Sitzung wird gelöscht.
Falls Sie nun mehr als einen Befehl ausführen wollen, können Sie
eine Shell starten und die Befehle interaktiv starten oder Sie können
sie in ein Shell-Skript schreiben und stattdessen dieses ausführen.
Aber möglicherweise wollen Sie dazwischen etwas tun, wie etwa beliebige
Befehle von einem Programm oder Skript ausführen, von dem Sie vorher
noch nicht wissen, welche Befehle Sie ausführen müssen.
Außerdem möchten Sie vielleicht den Zustand der Chroot zwischen
zwei Befehlen konservieren, wobei die normale automatische Erstellung von
Sitzungen den Zustand zwischen jedem Befehl wieder zurücksetzen
würde. Das ist der Grund für die Sitzungen: Sobald sie erstellt
sind, ist die Sitzung beständig und wird nicht entfernt. Mit einer
Sitzung können Sie so viele Befehle ausführen, wie Sie wollen,
Sie müssen aber die Sitzung von Hand erstellen und löschen, da
Schroot selbst nicht wissen kann, wann Sie damit fertig sind, außer im
obigen Fall mit dem einzelnen Befehl. Dies ist ziemlich einfach:
% schroot --begin-session -c squeeze↵
squeeze-57a69547-e014-4f5d-a98b-f4f35a005307
Dies erzeugt eine neue Sitzung, die auf der Chroot
squeeze basiert. Der
eindeutige Name der Sitzung, die Sitzungskennung, wird auf der Standardausgabe
ausgegeben, daher kann er gleichzeitig als Shell-Variable gesichert werden wie
hier:
% SESSION=$(schroot --begin-session -c squeeze)↵
% echo $SESSION↵
squeeze-57a69547-e014-4f5d-a98b-f4f35a005307
Nun wurde die Sitzung erstellt und hat eine Sitzungskennung. In ihr
können Befehle mittels der Sitzungskennung ausgeführt werden:
% schroot --run-session -c squeeze-57a69547-e014-4f5d-a98b-f4f35a005307 \
-- Befehl1↵
oder
% schroot --run-session -c "$SESSION" -- Befehl1↵
und dann so viele andere Befehle wie gewünscht
% schroot --run-session -c "$SESSION" -- Befehl2↵
% schroot --run-session -c "$SESSION" -- Befehl3↵
% schroot --run-session -c "$SESSION" -- Befehl4↵
etc.
Wenn die Sitzung vorüber ist, kann sie mit
--end-session entfernt
werden:
% schroot --end-session -c squeeze-57a69547-e014-4f5d-a98b-f4f35a005307↵
oder
% schroot --end-session -c "$SESSION"↵
Da die automatisch generierten Sitzungsnamen lang und unhandlich sein
können, ermöglicht Ihnen die Option
--session-name Ihren
eigenen Namen zu vergeben:
% schroot --begin-session -c squeeze --session-name mein-name↵
mein-name
Die Mailingliste <
[email protected]> wird sowohl
für Anwenderunterstützung als auch Diskussionen über die
Entwicklung benutzt. Die Liste kann über die Projektseite unter
https://alioth.debian.org/projects/buildd-tools/ abonniert werden oder
über die Mailman-Listenschnittstelle unter
http://lists.alioth.debian.org/mailman/listinfo/buildd-tools-devel.
Auf Debian-Systemen können Fehler unter Benutzung des Werkzeugs
reportbug(1) oder per Mail an <
[email protected]> gemeldet
werden (Einzelheiten darüber, wie das geht, finden Sie unter
http://bugs.debian.org).
Schroot wird über das Versionskontrollsystem Git verwaltet. Sie
können die neusten Quellen über
git://git.debian.org/git/buildd-tools/schroot beziehen.
% git clone git://git.debian.org/git/buildd-tools/schroot↵
Der Zweig »master« enthält die aktuelle
Entwicklungsveröffentlichung. Stabile Veröffentlichungen werden
in Zweigen gefunden, zum Beispiel liegen die Serien 1.4 des Releases im Zweig
»schroot-1.4«.
Roger Leigh
Copyright © 2005-2012 Roger Leigh <
[email protected]>
schroot ist freie Software. Sie können es unter den Bedingungen
der GNU General Public License, wie von der Free Software Foundation
veröffentlicht, weitergeben und/oder modifizieren, entweder
gemäß Version 3 der Lizenz oder (nach Ihrer Option) jeder
späteren Version.
dchroot(1),
sbuild(1),
schroot(1),
schroot.conf(5).
schroot-setup(5),