¿Cómo evitar que schroot anule el archivo passwd y otros archivos que ya están presentes en el sistema chroot?

¿Cómo evitar que schroot anule el archivo passwd y otros archivos que ya están presentes en el sistema chroot?

Cuando tuve que reparar mi sistema Debian, intenté usar schroot debido a la conveniencia de no tener que montar varias particiones. Pero, contrariamente a mis expectativas, Schroot decidió anular mi archivo passwd y otros archivos de configuración (en /etcmi directorio de inicio) lo cual no me gustó (y a veces causamensajes raros). ¿Hay alguna manera de prevenir ese comportamiento?

Utilicé el tipo directorypara schroot, ya que parecía el que necesitaba. Revisé la página de manual y solo encontré una --preserve-environmentopción, pero según su descripción no estoy seguro si conserva el entorno del sistema chroot o simplemente copia mi entorno de usuario a la sesión chroot en lugar de hacer borrón y cuenta nueva (que es el valor predeterminado).

Respuesta1

Schroot hace una serie de cosas para que el sistema chroot sea utilizable. Este trabajo es realizado porguiones en/etc/schroot/setup.d/. Estas acciones se configuran mediante archivos en el directorio de perfil de schroot, que se indica mediante la profileclave en elconfiguración de schrooty el valor predeterminado es /etc/schroot/default/(la configuración de schroot también puede especificar otras ubicaciones de archivos; consulte el manual para obtener más detalles). Las acciones de inicio incluyen:

  • Monte algunos sistemas de archivos como lo indica el archivo fstaben el directorio del perfil.
  • Copie archivos del sistema host al chroot. La lista de archivos para copiar se lee del archivo copyfilesdel directorio del perfil.
  • Sobrescriba las bases de datos NSS en el chroot, lea desde el host. La lista de bases de datos para sobrescribir se lee del archivo nssdatabasesdel directorio del perfil. Esto es similar a copiar archivos, pero no solo copia, por ejemplo, /etc/passwden el chroot, sino que también recupera entradas de otras fuentes como NIS o LDAP.

De forma predeterminada, copyfilescontiene /etc/resolv.conf, para garantizar que los programas en el chroot tengan acceso DNS como aquellos fuera del chroot. La configuración predeterminada de chroot asume que desea los mismos usuarios dentro y fuera de chroot, por lo que nssdatabasescontiene todas las bases de datos habituales, incluidas passwd, y el perfil predeterminado fstabcontiene no solo sistemas de archivos como /procy /devque son esenciales para el funcionamiento de muchos programas, sino también /home.

Si no desea sobrescribir nada en el chroot, declare un perfil de schroot sin copyfilesy nssdatabases. Probablemente querrás tener uno fstabque incluya lo esencial, pero no /home.

Una configuración de schroot más útil reproduciría las cuentas de usuarios humanos y sus directorios personales, pero no las cuentas del sistema. Reproducir las cuentas del sistema es desafortunado porque puede haber diferentes cuentas dentro y fuera del chroot. Por ejemplo, Debian y sus derivados utilizan cuentas asignadas dinámicamente para la mayoría del software del sistema, por lo que la correspondencia entre el nombre de usuario y el número para la mayoría de las cuentas del sistema depende del orden en que se instalaron los programas. Para hacerlo, elimine passwd, shadowy del archivo groupy escriba su propio script que agregue solo las cuentas que deben copiarse.gshadownssdatabases

Puede escribir el siguiente script para /etc/schroot/setup.d/20appendaccountscopiar solo cuentas en el rango de usuarios reales.

#!/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

Edite el nssdatabasesarchivo de su perfil para que contenga las siguientes líneas, o coloque setup.nssdatabases=default/nssdatabases-appendel perfil schroot y escriba las siguientes líneas en default/nssdatabases.

#>>passwd
#>>shadow
#>>group
#>>gshadow
services
protocols
networks
hosts

Schroot no sobrescribe ningún archivo en su directorio de inicio en su configuración predeterminada. --preserve-environmentSe trata de variables de entorno y no es relevante aquí.

Respuesta2

Creé un segundo perfil llamado foo; Puedes hacerlos defaultdirectamente en el perfil. Los perfiles son subdirectorios de /etc/schroot/, por ejemplo /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/copyfilesTambién existe, pero lo dejé ahí, ya que normalmentehacerquiere /etc/resolv.confser copiado.

información relacionada