Als ich mein Debian-System reparieren musste, versuchte ich, Schroot zu verwenden, da es praktischer war, nicht mehrere Partitionen zu mounten. Aber entgegen meiner Erwartungen entschied sich Schroot, meine Passwd-Datei und andere Konfigurationsdateien (in /etc
meinem Home-Verzeichnis) zu überschreiben, was mir nicht gefiel (und manchmal dazu führt,seltsame Nachrichten). Gibt es eine Möglichkeit, dieses Verhalten zu verhindern?
Ich habe den Typ directory
für Schroot verwendet, da ich ihn anscheinend brauchte. Ich habe die Manpage überprüft und nur eine --preserve-environment
Option gefunden, aber anhand der Beschreibung bin ich mir nicht sicher, ob sie die chroot-Systemumgebung beibehält oder einfach meine Benutzerumgebung in die Chroot-Sitzung kopiert, anstatt eine saubere Version zu erstellen (was die Standardeinstellung ist).
Antwort1
Schroot macht eine Reihe von Dingen, um das Chroot-System benutzbar zu machen. Diese Aufgabe wird ausgeführt vonSkripte in/etc/schroot/setup.d/
. Diese Aktionen werden durch Dateien im Profilverzeichnis des Schroots konfiguriert, das durch den profile
Schlüssel imSchroot-Konfigurationund standardmäßig /etc/schroot/default/
(die Schroot-Konfiguration kann auch andere Dateispeicherorte angeben, Einzelheiten finden Sie im Handbuch). Zu den Startaktionen gehören:
- Mounten Sie einige Dateisysteme, wie in der Datei
fstab
im Profilverzeichnis angegeben. - Kopieren Sie Dateien vom Hostsystem in das Chroot-System. Die Liste der zu kopierenden Dateien wird aus der Datei
copyfiles
im Profilverzeichnis gelesen. - NSS-Datenbanken im Chroot überschreiben, vom Host lesen. Die Liste der zu überschreibenden Datenbanken wird aus der Datei
nssdatabases
im Profilverzeichnis gelesen. Dies ähnelt dem Kopieren von Dateien, aber es werden nicht nur z. B./etc/passwd
in das Chroot kopiert, sondern auch Einträge aus anderen Quellen wie NIS oder LDAP abgerufen.
Standardmäßig copyfiles
enthält es /etc/resolv.conf
, um sicherzustellen, dass Programme im Chroot genauso DNS-Zugriff haben wie Programme außerhalb des Chroot. Das Standard-Chroot-Setup geht davon aus, dass Sie innerhalb und außerhalb des Chroot dieselben Benutzer haben möchten, nssdatabases
enthält also alle üblichen Datenbanken einschließlich passwd
, und das Standardprofil fstab
enthält nicht nur Dateisysteme wie /proc
und /dev
, die für die Funktion vieler Programme unerlässlich sind, sondern auch /home
.
Wenn Sie nichts im Chroot überschreiben möchten, deklarieren Sie ein Schroot-Profil ohne copyfiles
und nssdatabases
. Sie möchten wahrscheinlich ein haben, fstab
das das Wesentliche mountet, aber nicht /home
.
Eine nützlichere Schroot-Konfiguration würde die Benutzerkonten und ihre Home-Verzeichnisse reproduzieren, nicht jedoch die Systemkonten. Die Reproduktion der Systemkonten ist ungünstig, da es innerhalb und außerhalb des Chroot unterschiedliche Konten geben kann. Beispielsweise verwenden Debian und seine Derivate dynamisch zugewiesene Konten für die meisten Systemsoftwareprogramme, sodass die Entsprechung zwischen Benutzername und Nummer für die meisten Systemkonten von der Reihenfolge abhängt, in der die Programme installiert wurden. Entfernen Sie dazu passwd
, shadow
, group
und gshadow
aus der nssdatabases
Datei und schreiben Sie Ihr eigenes Skript, das nur die Konten hinzufügt, die kopiert werden sollen.
Sie können das folgende Skript schreiben, um /etc/schroot/setup.d/20appendaccounts
nur Konten im tatsächlichen Benutzerbereich zu kopieren.
#!/bin/sh
## Append users and groups from the host.
set -e
. "$SETUP_DATA_DIR/common-data"
. "$SETUP_DATA_DIR/common-functions"
. "$SETUP_DATA_DIR/common-config"
if [ -z "$SETUP_NSSDATABASES" ] || ! [ -f "$SETUP_NSSDATABASES" ]; then
exit 0
fi
DATABASES='group gshadow passwd shadow'
want () {
grep -qx "#>>$1" "$SETUP_NSSDATABASES"
}
start () {
sed -i -e '/^#begin added by schroot$/,/^#end added by schroot$/d' "$tmpfile"
{
echo '#begin added by schroot'
getent "$db" | case $db in
## passwd, group: copy the range for local human accounts
passwd) awk -F : "$FIRST_UID <= \$3 && \$3 <= $LAST_UID";;
group) awk -F : "$FIRST_GID <= \$3 && \$3 <= $LAST_GID";;
## shadow, gshadow: copy only entries with a password hash
shadow|gshadow) awk -F : '$2 ~ /^\$/';;
esac
echo '#end added by schroot'
} >>"$tmpfile"
}
iterate () {
for db in $DATABASES; do
want "$db" || continue
dbfile=$CHROOT_PATH/etc/$db
tmpfile=$dbfile.$$
[ -f "$dbfile" ] || continue
cp -f -- "$dbfile" "$tmpfile"
"$@"
if ! [ -s "$tmpfile" ] || cmp -s -- "$dbfile" "$tmpfile"; then
rm -f -- "$tmpfile"
else
mv -- "$tmpfile" "$dbfile"
fi
done
}
case $STAGE in
setup-start|setup-recover)
FIRST_UID=1000
LAST_UID=29999
FIRST_GID=1000
LAST_GID=29999
if [ -e /etc/adduser.conf ]; then . /etc/adduser.conf; fi
umask 600
iterate start;;
esac
Bearbeiten Sie die nssdatabases
Datei Ihres Profils, sodass sie die folgenden Zeilen enthält, oder fügen Sie setup.nssdatabases=default/nssdatabases-append
das Schroot-Profil ein und schreiben Sie die folgenden Zeilen in default/nssdatabases
.
#>>passwd
#>>shadow
#>>group
#>>gshadow
services
protocols
networks
hosts
Schroot überschreibt in seiner Standardkonfiguration keine Dateien in Ihrem Home-Verzeichnis. --preserve-environment
Dies betrifft Umgebungsvariablen und ist hier nicht relevant.
Antwort2
Ich habe ein zweites Profil namens erstellt foo
. Sie können dieses einfach direkt zum default
Profil hinzufügen. Profile sind Unterverzeichnisse von /etc/schroot/
, z. B. /etc/schroot/foo/
, /etc/schroot/default/
.
diff -ruw default/fstab foo/fstab
--- default/fstab 2014-05-25 14:03:42.000000000 -0700
+++ foo/fstab 2014-04-03 16:36:42.644336952 -0700
@@ -7,7 +7,7 @@
/sys /sys none rw,bind 0 0
/dev /dev none rw,bind 0 0
/dev/pts /dev/pts none rw,bind 0 0
-/home /home none rw,bind 0 0
+#/home /home none rw,bind 0 0
/tmp /tmp none rw,bind 0 0
# It may be desirable to have access to /run, especially if you wish
diff -ruw default/nssdatabases foo/nssdatabases
--- default/nssdatabases 2014-05-25 14:03:42.000000000 -0700
+++ foo/nssdatabases 2014-04-03 16:36:55.760398695 -0700
@@ -1,11 +1,11 @@
# System databases to copy into the chroot from the host system.
#
# <database name>
-passwd
-shadow
-group
-gshadow
-services
-protocols
-networks
-hosts
+#passwd
+#shadow
+#group
+#gshadow
+#services
+#protocols
+#networks
+#hosts
/etc/default/copyfiles
existiert auch, aber ich habe das hier gelassen, da man normalerweiseTunmöchte /etc/resolv.conf
kopiert werden.