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 /etc
mi directorio de inicio) lo cual no me gustó (y a veces causamensajes raros). ¿Hay alguna manera de prevenir ese comportamiento?
Utilicé el tipo directory
para schroot, ya que parecía el que necesitaba. Revisé la página de manual y solo encontré una --preserve-environment
opció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 profile
clave 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
fstab
en el directorio del perfil. - Copie archivos del sistema host al chroot. La lista de archivos para copiar se lee del archivo
copyfiles
del 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
nssdatabases
del directorio del perfil. Esto es similar a copiar archivos, pero no solo copia, por ejemplo,/etc/passwd
en el chroot, sino que también recupera entradas de otras fuentes como NIS o LDAP.
De forma predeterminada, copyfiles
contiene /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 nssdatabases
contiene todas las bases de datos habituales, incluidas passwd
, y el perfil predeterminado fstab
contiene no solo sistemas de archivos como /proc
y /dev
que 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 copyfiles
y nssdatabases
. Probablemente querrás tener uno fstab
que 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
, shadow
y del archivo group
y escriba su propio script que agregue solo las cuentas que deben copiarse.gshadow
nssdatabases
Puede escribir el siguiente script para /etc/schroot/setup.d/20appendaccounts
copiar 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 nssdatabases
archivo de su perfil para que contenga las siguientes líneas, o coloque setup.nssdatabases=default/nssdatabases-append
el 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-environment
Se trata de variables de entorno y no es relevante aquí.
Respuesta2
Creé un segundo perfil llamado foo
; Puedes hacerlos default
directamente 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/copyfiles
También existe, pero lo dejé ahí, ya que normalmentehacerquiere /etc/resolv.conf
ser copiado.