SCHROOT(1) | 2022 | SCHROOT(1) |
schroot - eine Chroot-Umgebung sicher betreten
schroot [-h|--help | -V|--version | -l|--list | -i|--info | --config | --location | --automatic-session | -b|--begin-session | --recover-session | -r|--run-session | -e|--end-session] [-f|--force] [-n Sitzungsname|--session-name=Sitzungsname] [-d Verzeichnis|--directory=Verzeichnis] [-u Benutzer|--user=Benutzer] [-p|--preserve-environment] [-s Shell|--shell=Shell] [-q|--quiet | -v|--verbose] [-c Chroot|--chroot=Chroot | [--all | --all-chroots | --all-source-chroots | --all-sessions] [--exclude-aliases]] [-o|--option=Schlüssel=Wert] [--] [BEFEHL [ ARG1 [ ARG2 [ ARGn]]]]
schroot ermöglicht dem Benutzer einen Befehl oder eine Login-Shell in einer Chroot-Umgebung auszuführen. Falls kein Befehl angegeben wurde, wird eine Login-Shell im aktuellen Arbeitsverzeichnis des Benutzers innerhalb der Chroot gestartet.
Der Befehl ist ein Programm plus so viele optionale Argumente wie benötigt. Jedes Argument kann separat in Anführungszeichen gesetzt werden.
Das Verzeichnis, in dem der Befehl oder die Login-Shell ausgeführt wird, hängt vom Kontext ab. Eine vollständige Beschreibung finden Sie nachfolgend unter der Option --directory.
Jede Chroot-Benutzung wird in den Systemprotokollen vermerkt. In einigen Situationen kann es nötig sein, dass sich der Benutzer selbst authentifizieren muss; lesen Sie dazu den nachfolgenden Abschnitt »Authentifizierung«.
Falls keine Chroot angegeben wurde, wird als Ausweichmöglichkeit der Name oder Alias »default« benutzt. Dies ist gleichbedeutend mit »--chroot=default«.
Es ist öfters nötig, Programme in einer virtualisierten Umgebung auszuführen, als direkt auf dem Wirtsystem. Anders als andere Virtualisierungssysteme wie kvm oder Xen virtualisiert Schroot nicht das ganze System; es virtualisiert nur das Dateisystem und einige Teile des Dateisystems können immer noch mit dem Wirt gemeinsam benutzt werden. Es ist daher schnell, leichtgewichtig und flexibel. Es virtualisiert jedoch keine anderen Aspekte des Systems wie gemeinsam genutzten Speicher, Netzwerk, Geräte etc. und könnte daher, abhängig von der geplanten Verwendung, weniger sicher sein als andere Systeme. Einige Beispiele existierender Verwendungen von Schroot beinhalten:
Eine Chroot kann durch Ausführen von chroot(8) direkt durch Root benutzt werden, aber normale Anwender können diesen Befehl nicht verwenden. schroot gibt mit dem gleichen Mechanismus normalen Benutzern Zugriff auf Chroots, aber mit mehreren zusätzlichen Funktionen. Obwohl Schroot genau wie chroot(8) ein Verzeichnis als Chroot benutzt, erfordert es nicht, das es sich dabei um ein normales Verzeichnis im Dateisystem handelt. Obwohl dies vorgegeben ist, kann die Chroot ebenso aus einer Datei, einem Dateisystem einschließlich LVM- und Btrfs-Schnappschüsse sowie Loopback-Mounts bestehen oder aus UnionFS-Einblendungen zusammengestellt sein. Da es vom Benutzer erweiterbar ist, wird der Gültigkeitsbereich für das Erstellen von Chroots aus verschiedenen Quellen nur durch Ihre Fantasie begrenzt. Schroot führt Rechteprüfungen durch und ermöglicht zusätzlich eine automatisierte Einrichtung der Chroot-Umgebung, wie das Einhängen zusätzlicher Dateisysteme oder anderer Konfigurationsaufgaben. Diese automatisierte Einrichtung wird durch die Aktion von Einrichtungsskripten erledigt, die zum Durchführen der benötigten Aktionen angepasst und erweitert werden können. Typische Aktionen beinhalten das Einhängen des Home-Verzeichnisses des Benutzers, das Einrichten des Netzwerkzugangs und von Systemdatenbanken und sogar das Starten von Diensten. Diese können wiederum vollständig durch den Admin angepasst werden. Die Einrichtungsskripte werden für alle Typen von Chroots ausgeführt mit Ausnahme des Typs »plain«, des einfachsten Chroot-Typs, der gar keine automatisierten Einrichtungsfunktionen bietet. Die Einrichtung von Chroots wird ausführlicher in schroot.conf(5) behandelt.
schroot akzeptiert die folgenden Optionen:
Falls der Benutzer kein erlaubter Benutzer oder Mitglied der erlaubten Gruppen (oder beim Wechsel zu Root, kein erlaubter Root-Benutzer oder Mitglied der erlaubten Root-Gruppen) für die angegebene(n) Chroot(s) ist, wird die Erlaubnis sofort verweigert. Falls sich der Benutzer ändert und der Benutzer, der den Befehl ausführt, Zugriff hat, ist es nötig, dass sich der Benutzer selbst mittels der Anmeldedaten des Benutzers authentifizieren muss, zu dem gewechselt wird.
Auf Systemen, die anschließbare Authentifizierungsmodule (Pluggable Authentication Modules, PAM) unterstützen, wird Schroot PAM zur Authentifizierung und Autorisierung von Benutzern verwenden. Falls dies der Fall ist, wird Schroot nach einem Passwort fragen, wenn erforderlich. Falls PAM nicht verfügbar ist, wird jegliche Authentifizierung automatisch fehlschlagen (Benutzerwechsel ohne PAM wird nicht unterstützt).
Beachten Sie, dass dem Benutzer Root, falls PAM benutzt wird, standardmäßig keine Sonderrechte im Programm gewährt werden. Die Standard-PAM-Konfiguration erlaubt Root jedoch die Anmeldung ohne Passwort (pam_rootok.so). Dies kann aber deaktiviert sein, um Root daran zu hindern auf alle Chroots zuzugreifen, es sei denn, dies ist eigens erlaubt. In einer derartigen Situation muss Root zu den erlaubten Benutzern oder Gruppen hinzugefügt werden, wie andere Benutzer und Gruppen. Falls PAM nicht verfügbar ist, wird es dem Benutzer Root erlaubt sein, auf alle Chroots zuzugreifen, sogar, wenn nicht explizit Zugriff gewährt wurde.
Es gibt drei unterschiedliche Chroot-Typen: normale Chroots, Source-Chroots und Sitzungs-Chroots. Diese unterschiedlichen Typen von Chroots werden in unterschiedliche Namensräume aufgeteilt. Ein Namensraum ist ein Präfix eines Chroot-Namens. Derzeit gibt es drei Namensräume: »chroot:«, »source:« und »session:«. Benutzen Sie --list --all, um alle verfügbaren Chroots in allen Namensräumen aufzuführen. Da »:« als Trenner zwischen Namensräumen und Chroot-Namen benutzt wird, ist es nicht erlaubt, dieses Zeichen in Chroot-Namen zu verwenden.
Abhängig davon, welche Aktion Sie von Schroot abfragen, kann es nach der Chroot in einem der drei Namensräume nachsehen oder es könnte ein bestimmter Namensraum angegeben werden. Eine Chroot mit Namen »sid« heißt zum Beispiel tatsächlich »chroot:sid«, falls der Namensraum enthalten ist, der Namensraum kann aber für die meisten Aktionen weggelassen werden.
Einige Chroot-Typen, zum Beispiel LVM- und Btrfs-Schnappschüsse, stellen durch die Sitzung verwaltete Copy-On-Write-Schnappschüsse der Chroot bereit. Diese stellen außerdem eine Source-Chroot bereit, um einen einfachen Zugriff auf das Dateisystem zu ermöglichen, das als Quelle für Schnappschüsse verwendet wird. Dies sind ebenso normale Chroots, bei denen nur die Schnappschüsse deaktiviert sind. Für eine Chroot mit Namen »sid-snapshot« (d.h. mit einem vollqualifizierten Namen »chroot:sid-snapshot«) wird es auch eine entsprechende Source-Chroot mit Namen »source:sid-snapshot« geben. Frühere Versionen von Schroot stellten Source-Chroots mit einer Endung »-source« zur Verfügung. Diese werden aus Kompatibilitätsgründen ebenfalls bereitgestellt. In diesem Beispiel wäre dies »chroot:sid-snapshot-source«. Diese Kompatibilitätsnamen werden in zukünftigen Versionen fallengelassen, daher sollten Programme und Skripte zur Benutzung namensraumqualifizierter Namen wechseln, statt die alte Endung zu verwenden.
Alle Sitzungen, die mit --begin-session erzeugt wurden, werden innerhalb des Namensraums »session:« platziert. Ein Sitzungsname mit --session-name kann irgendeinen Namen haben, sogar den selben Namen wie die Chroot, aus der er erstellt wurde, vorausgesetzt, dass er innerhalb dieses Namensraums eindeutig ist. Dies war in früheren Versionen von Schroot, die keine Namensräume hatten, nicht erlaubt.
Alle Aktionen mit Ausnahme einiger Sitzungsaktionen benutzen »chroot:« als Standardnamensraum. --run-session, --recover-session und --end-session verwenden stattdessen »session:« als Standardnamensraum, da diese Aktionen mit Sitzungs-Chroots arbeiten. Das Ergebnis ist, dass der Namensraum normalerweise nie benötigt wird, es sei denn, Sie möchten mit einer Chroot in einem anderen als dem vorgegebenen Namensraum arbeiten, wie etwa wenn eine Source-Chroot benutzt wird. Um die Chroot-Auswahl unmissverständlich zu machen, ist es immer möglich, den vollständigen Namen einschließlich des Namensraums zu verwenden, sogar wenn dies nicht strikt erforderlich ist.
Auf einigen Dateisystemen, zum Beispiel Btrfs, ist die Leistung wegen der vielen durchgeführten Fsync-Transaktionen schlecht, wenn Dpkg ausgeführt wird. Dies kann durch die Installation des Pakets »eatmydata« und anschließendem Hinzufügen von »eatmydata« zum Konfigurationsschlüssel command-prefix, der alle Fsync-Transaktionen deaktiviert, gemildert werden. Beachten sie, dass dies in Schnappschuss-Chroots getan werden sollte, in denen Datenverlust kein Problem darstellt. Dies ist nützlich, wenn eine Chroot zum Beispiel zum Bauen von Paketen benutzt wird.
Schroot wird ein geeignetes Verzeichnis auswählen, das innerhalb der Chroot benutzt werden soll, abhängig davon, ob eine interaktive Login-Shell benutzt werden soll, welcher Befehl ausgeführt oder ob zusätzlich die Option --directory verwendet wird. Im Fall, dass Befehle direkt ausgeführt werden oder explizit ein Verzeichnis angegeben wird, wird aus Sicherheits- und Konsistenzgründen nur ein Verzeichnis benutzt, während für eine Login-Shell mehrere Möglichkeiten ausprobiert werden können. Die folgenden Unterabschnitte führen die Reserveabfolge für jeden Fall auf. CWD ist das aktuelle Arbeitsverzeichnis, DIR ist das mit --directory angegebene Verzeichnis.
Übergang | |
(Rechner → Chroot) | Kommentar |
CWD → CWD | normales Verhalten (falls --directory nicht benutzt wird) |
CWD → $HOME | falls CWD nicht existiert und --preserve-environment benutzt wird |
CWD → passwd pw_dir | falls CWD nicht existiert (oder --preserve-environment benutzt wird und $HOME nicht existiert) |
CWD → / | keins davon existiert |
FAIL | falls / nicht existiert |
Übergang | |
(Rechner → Chroot) | Kommentar |
CWD → CWD | normales Verhalten (falls --directory nicht benutzt wird) |
FAIL | falls CWD nicht existiert |
Unter irgendwelchen Umständen kann es vorkommen, dass keine Reserve existiert.
Übergang | |
(Rechner → Chroot) | Kommentar |
CWD → VERZ | normales Verhalten |
FAIL | falls VERZ nicht existiert |
Unter irgendwelchen Umständen kann es vorkommen, dass keine Reserve existiert.
Beachten Sie, dass --debug=Mitteilung die interne Reserveliste anzeigen wird, die für diese Sitzung berechnet wurde.
% schroot -l↵
chroot:default
chroot:etch
chroot:sid
chroot:testing
chroot:unstable
% schroot -i -c sid↵
——— Chroot ———
Name sid
Beschreibung Debian sid (unstable)
Typ plain
Priorität 3
Benutzer rleigh
Gruppen sbuild
Root-Benutzer
Root-Gruppen sbuild
Alias-Kennungen unstable unstable-sbuild unstable-powerpc-sbuild
Umgebungsfilter ^(BASH_ENV|CDPATH|ENV|HOSTALIASES|IFS|KRB5_CONFIG|
KRBCONFDIR|KRBTKFILE|KRB_CONF|LD_.*|LOCALDOMAIN|
NLSPATH|PATH_LOCALE|RES_OPTIONS|TERMINFO|
TERMINFO_DIRS|TERMPATH)$
Einr.-Skripte ausf. true
Skript-Konfiguration script-defaults
Verwaltete Sitzung true
Persönlichkeit linux32
Ort /srv/chroot/sid
Verwenden Sie --all beziehungsweise mehrfach -c, um alle oder mehrere Chroots zu benutzen.
% schroot -c sid /bin/ls↵ [sid chroot] Befehl »/bin/ls« gestartet CVS sbuild-chroot.c sbuild-session.h schroot.conf.5 Makefile sbuild-chroot.h schroot.1 schroot.conf.5.in Makefile.am sbuild-config.c schroot.1.in Makefile.in sbuild-config.h schroot.c pam sbuild-session.c schroot.conf % schroot -c sid -- ls -1 | head -n 5↵ [sid chroot] Befehl »ls -1« gestartet ABOUT-NLS AUTHORS COPYING ChangeLog INSTALL
benutzt --, um zu ermöglichen, dass Optionen, die im Befehl mit »-« oder »--« beginnen, in der Chroot ausgeführt werden. Dies verhindert, dass sie als Optionen für Schroot selbst interpretiert werden. Beachten Sie, dass die obere Zeile auf die Standardfehlerausgabe und die übrigen Zeilen auf die Standardausgabe ausgegeben werden. Dies ist beabsichtigt, so dass Programmausgaben von in der Chroot ausgeführten Befehlen weiter- und umgeleitet werden können, wenn nötig. Die Daten werden die selben sein, wie bei der Ausführung des Befehls direkt auf dem Wirtsystem.
% schroot -c sid -u root↵
Passwort:
[sid chroot] (rleigh→root) Login-Shell »/bin/bash«
gestartet:
#
Falls der Benutzer »rleigh« in root-users in /etc/schroot/schroot.conf war oder zu einer der Gruppen in root-groups gehörte, würde ihm Root-Zugriff gewährt, aber der PAM-Autorisierungsschritt wird immer noch angewandt.
Es könnte nötig sein, dass eine Chroot mehr als einen Befehl ausführt. Dies ist hauptsächlich dann nötig, wenn die Chroot direkt von einem LVM-LV oder einer Datei auf der Platte erstellt wurde, um sie während eine Aufgabe (oder ein Satz von Aufgaben) durchgeführt wird, beständig zu machen. Zu diesem Zweck existieren Sitzungen. Für einfache Chroot-Typen wie »plain« und »directory« können Sitzungen erstellt werden, sind aber nicht zwingend nötig.
Lassen Sie uns starten, indem wir uns eine sitzungsfähige Chroot ansehen:
% schroot -i -c sid-snap↵
——— Chroot ———
Name sid-snap
Beschreibung Debian sid snapshot
Typ lvm-snapshot
Priorität 3
Benutzer maks rleigh
Gruppen sbuild
Root-Benutzer
Root-Gruppen sbuild
Aliase-Kennungen
Umgebungsfilter ^(BASH_ENV|CDPATH|ENV|HOSTALIASES|IFS|KRB5_CONFIG|
KRBCONFDIR|KRBTKFILE|KRB_CONF|LD_.*|LOCALDOMAIN|
NLSPATH|PATH_LOCALE|RES_OPTIONS|TERMINFO|
TERMINFO_DIRS|TERMPATH)$
Einr.-Skripte ausf. true
Skript-Konfiguration script-defaults
Verwaltete Sitzung true
Persönlichkeit linux
Gerät /dev/hda_vg/sid_chroot
Einbindungsoptionen -o atime,async,user_xattr
Quellbenutzer
Quellgruppen root rleigh
Quell-Root-Benutzer
Quell-Root-Gruppen root rleigh
LVM-Schnappschuss-Opt. --size 2G -c 128
Beachten Sie, dass die Option Verwaltete Sitzung auf »true« gesetzt ist. Dies ist eine Voraussetzung, um die Sitzungsverwaltung zu benutzen und wird von den meisten Chroot-Typen unterstützt. Als nächstes werden wir eine neue Sitzung erstellen:
% schroot -b -c sid-snap↵
sid-snap-46195b04-0893-49bf-beb8-0d4ccc899f0f
Die Sitzungskennung der neu erstellten Sitzung wird auf der Standardausgabe zurückgegeben. Es ist üblich, sie wie hier gezeigt zu speichern:
% SESSION=$(schroot -b -c sid-snap)↵ % echo $SESSION↵ sid-snap-46195b04-0893-49bf-beb8-0d4ccc899f0f
Die Sitzung kann genauso wie jede normale Chroot benutzt werden. Die Sitzung sieht etwa so aus:
% schroot -i -c sid-snap-46195b04-0893-49bf-beb8-0d4ccc899f0f↵
——— Session ———
Name sid-snap-46195b04-0893-49bf-beb8-0d\
4ccc899f0f
Beschreibung Debian sid snapshot
Typ lvm-snapshot
Priorität 3
Benutzer maks rleigh
Gruppen sbuild
Root Users
Root-Gruppen root sbuild
Alias-Kennungen
Umgebungsfilter ^(BASH_ENV|CDPATH|ENV|HOSTALIASES|IFS|KRB5_CONFIG|
KRBCONFDIR|KRBTKFILE|KRB_CONF|LD_.*|LOCALDOMAIN|
NLSPATH|PATH_LOCALE|RES_OPTIONS|TERMINFO|
TERMINFO_DIRS|TERMPATH)$
Einr.-Skripte ausf. true
Skript-Konfiguration script-defaults
Verwaltete Sitzung true
Persönlichkeit linux
Einbindungsort /var/lib/schroot/mount/sid-snap-461\
95b04-0893-49bf-beb8-0d4ccc899f0f
Pfad /var/lib/schroot/mount/sid-snap-461\
95b04-0893-49bf-beb8-0d4ccc899f0f
Einzubindendes Gerät /dev/hda_vg/sid-snap-46195b04-0893-\
49bf-beb8-0d4ccc899f0f
Gerät /dev/hda_vg/sid_chroot
Einbindungsoptionen -o atime,async,user_xattr
Quellbenutzer
Quellgruppen root rleigh
Quell-Root-Benutzer
Quell-Root-Gruppen root rleigh
LVM-Schnappsch.-Gerät /dev/hda_vg/sid-snap-46195b04-0893-\
49bf-beb8-0d4ccc899f0f
LVM-Schnappschuss-Opt. --size 2G -c 128
Nun wurde die Sitzung erstellt, Befehle können darin ausgeführt werden:
% schroot -r -c sid-snap-46195b04-0893-49bf-beb8-0d4ccc899f0f -- \ uname -sr↵ I: [sid-snap-46195b04-0893-49bf-beb8-0d4ccc899f0f chroot] Befehl \ »uname -sr« gestartet Linux 2.6.18-3-powerpc % schroot -r -c $SESSION -- uname -sr↵ I: [sid-snap-fe170af9-d9be-4800-b1bd-de275858b938 chroot] Befehl \ »uname -sr« gestartet Linux 2.6.18-3-powerpc
Wenn alle Befehle, die in der Sitzung ausgeführt werden sollen, durchgeführt wurden, kann die Sitzung beendet werden:
% schroot -e -c sid-snap-46195b04-0893-49bf-beb8-0d4ccc899f0f↵ % schroot -e -c $SESSION↵
Letztendlich können Sitzungsnamen lang und unhandlich sein. Statt die automatisch erzeugte Sitzungskennung zu benutzen, kann ein Name angegeben werden.
% schroot -b -c sid-snap -n mein-Sitzungsname↵ mein-Sitzungsname
Falls etwas nicht funktioniert und aus den Fehlermeldungen nicht hervorgeht, was falsch ist, versuchen Sie die Option --debug=Stufe zu benutzen, um Debug-Meldungen einzuschalten. Dies gibt eine große Menge weiterer Informationen. Gültige Debug-Stufen sind »none« und »notice«, »info«, »warning« und »critical« nach zunehmender Schwere geordnet. Je niedriger der Schweregrad desto mehr wird ausgegeben.
Falls Sie immer noch Schwierigkeiten haben, können die
Entwickler auf der Mailingliste kontaktiert werden:
Debian-Buildd-Tools-Entwickler
<buildd-tools-devel@lists.alioth.debian.org>
Auf den Architekturen mips und mipsel haben Linux-Kernel bis einschließlich Version 2.6.17 kaputte personality(2)-Unterstützung, die dazu führt, dass das Setzen der Persönlichkeit fehlschlägt. Dies wird als ein »Transaktion nicht erlaubt«-Fehler (EPERM) gesehen. Um dieses Problem zu umgehen setzen Sie personality auf »undefined« oder führen Sie ein Upgrade auf einen aktuelleren Kernel durch.
Standardmäßig werden die Umgebungsvariablen nicht aufbewahrt. Die folgenden sind definiert: HOME, LOGNAME, PATH, SHELL, TERM (aufbewahrt, falls bereits definiert) und USER. Die Umgebungsvariablen SCHROOT_COMMAND, SCHROOT_USER, SCHROOT_GROUP, SCHROOT_UID und SCHROOT_GID, die innerhalb der Chroot gesetzt sind, geben den ausgeführten Befehl, den Benutzernamen, den Gruppennamen, die Benutzer- beziehungsweise die Gruppenkennung an. Zusätzlich geben die Umgebungsvariablen SCHROOT_SESSION_ID, SCHROOT_CHROOT_NAME und SCHROOT_ALIAS_NAME die Sitzungskennung, den Original-Chroot-Namen vor dem Erstellen der Sitzung beziehungsweise den Alias, mit dem die ursprünglich ausgewählte Chroot identifiziert wird, an.
Die folgenden möglicherweise gefährlichen Umgebungsvariablen sind aus Sicherheitsgründen entfernt: BASH_ENV, CDPATH, ENV, HOSTALIASES, IFS, KRB5_CONFIG, KRBCONFDIR, KRBTKFILE, KRB_CONF, LD_.*, LOCALDOMAIN, NLSPATH, PATH_LOCALE, RES_OPTIONS, TERMINFO, TERMINFO_DIRS und TERMPATH. Falls gewünscht, wird der Konfigurationsschlüssel environment-filter das Ändern der Auschlussliste ermöglichen. Weitere Einzelheiten finden Sie unter schroot.conf(5).
Jedes Verzeichnis enthält ein Verzeichnis oder eine Datei mit dem Namen von jeder Sitzung. Nicht alle Chroot-Typen benutzen alle folgenden Verzeichnisse.
Roger Leigh
Copyright © 2005-2012 Roger Leigh <rleigh@codelibre.net>
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), chroot(2), schroot.conf(5). schroot-setup(5), schroot-faq(7), run-parts(8),
14 | Aug |