Wie kann verhindert werden, dass Schroot die Passwd-Datei und andere Dateien überschreibt, die bereits auf dem Chroot-System vorhanden sind?

Wie kann verhindert werden, dass Schroot die Passwd-Datei und andere Dateien überschreibt, die bereits auf dem Chroot-System vorhanden sind?

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 /etcmeinem 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 directoryfür Schroot verwendet, da ich ihn anscheinend brauchte. Ich habe die Manpage überprüft und nur eine --preserve-environmentOption 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 profileSchlü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 fstabim Profilverzeichnis angegeben.
  • Kopieren Sie Dateien vom Hostsystem in das Chroot-System. Die Liste der zu kopierenden Dateien wird aus der Datei copyfilesim Profilverzeichnis gelesen.
  • NSS-Datenbanken im Chroot überschreiben, vom Host lesen. Die Liste der zu überschreibenden Datenbanken wird aus der Datei nssdatabasesim Profilverzeichnis gelesen. Dies ähnelt dem Kopieren von Dateien, aber es werden nicht nur z. B. /etc/passwdin das Chroot kopiert, sondern auch Einträge aus anderen Quellen wie NIS oder LDAP abgerufen.

Standardmäßig copyfilesenthä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, nssdatabasesenthält also alle üblichen Datenbanken einschließlich passwd, und das Standardprofil fstabenthält nicht nur Dateisysteme wie /procund /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 copyfilesund nssdatabases. Sie möchten wahrscheinlich ein haben, fstabdas 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, groupund gshadowaus der nssdatabasesDatei 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/20appendaccountsnur 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 nssdatabasesDatei Ihres Profils, sodass sie die folgenden Zeilen enthält, oder fügen Sie setup.nssdatabases=default/nssdatabases-appenddas 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-environmentDies betrifft Umgebungsvariablen und ist hier nicht relevant.

Antwort2

Ich habe ein zweites Profil namens erstellt foo. Sie können dieses einfach direkt zum defaultProfil 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/copyfilesexistiert auch, aber ich habe das hier gelassen, da man normalerweiseTunmöchte /etc/resolv.confkopiert werden.

verwandte Informationen