Как предотвратить перезапись schroot-файла passwd и других файлов, уже присутствующих в chroot-системе?

Как предотвратить перезапись schroot-файла passwd и других файлов, уже присутствующих в chroot-системе?

Когда мне пришлось восстанавливать свою систему Debian, я попытался использовать schroot из-за удобства, поскольку не нужно было монтировать bind несколько разделов. Но, вопреки моим ожиданиям, schroot решил переопределить мой файл passwd и другие файлы конфигурации (в /etcмоем домашнем каталоге), что мне не понравилось (и иногда вызываетстранные сообщения). Есть ли способ предотвратить такое поведение?

Я использовал тип directoryдля schroot, так как он мне показался тем, что мне нужно. Я проверил страницу руководства и нашел только опцию --preserve-environment, но из ее описания я не уверен, сохраняет ли она среду chrooted system или просто копирует мою пользовательскую среду в сессию chroot вместо чистого листа (что является значением по умолчанию).

решение1

Schroot делает ряд вещей, чтобы сделать chrooted-систему пригодной к использованию. Эта работа выполняетсяскрипты в/etc/schroot/setup.d/. Эти действия настраиваются файлами в каталоге профиля schroot, который обозначается ключом profileвконфигурация schrootи по умолчанию /etc/schroot/default/(конфигурация schroot может также указывать другие расположения файлов, подробности см. в руководстве). Действия при запуске включают:

  • Смонтируйте несколько файловых систем, как указано в файле fstabв каталоге профиля.
  • Копировать файлы из хостовой системы в chroot. Список файлов для копирования считывается из файла copyfilesиз каталога профиля.
  • Перезаписать базы данных NSS в chroot, считанные с хоста. Список баз данных для перезаписи считывается из файла nssdatabasesв каталоге профиля. Это похоже на копирование файлов, но не только копирует, например, /etc/passwdв chroot, но и извлекает записи из других источников, таких как NIS или LDAP.

По умолчанию copyfilesсодержит /etc/resolv.conf, чтобы гарантировать, что программы в chroot будут иметь доступ к DNS, как и те, что находятся вне chroot. Настройка chroot по умолчанию предполагает, что вы хотите, чтобы внутри и вне chroot были одни и те же пользователи, поэтому nssdatabasesсодержит все обычные базы данных, включая passwd, а профиль по умолчанию fstabсодержит не только файловые системы, такие как /procи , /devкоторые необходимы для работы многих программ, но также /home.

Если вы не хотите ничего перезаписывать в chroot, объявите профиль schroot без copyfilesи nssdatabases. Вероятно, вам понадобится , fstabкоторый монтирует необходимое, но не /home.

Более полезная конфигурация schroot воспроизводила бы учетные записи пользователей и их домашние каталоги, но не системные учетные записи. Воспроизведение системных учетных записей неудачно, поскольку внутри и вне chroot могут быть разные учетные записи. Например, Debian и его производные используют динамически назначаемые учетные записи для большинства системного программного обеспечения, поэтому соответствие между именем пользователя и номером для большинства системных учетных записей зависит от порядка установки программ. Чтобы сделать это, удалите passwd, shadow, groupи gshadowиз nssdatabasesфайла и напишите собственный скрипт, который добавляет только те учетные записи, которые следует скопировать.

Вы можете написать следующий скрипт, чтобы /etc/schroot/setup.d/20appendaccountsкопировать только учетные записи из реального диапазона пользователей.

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

Отредактируйте nssdatabasesфайл вашего профиля, добавив в него следующие строки, или вставьте setup.nssdatabases=default/nssdatabases-appendпрофиль schroot и запишите следующие строки в default/nssdatabases.

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

Schroot не перезаписывает никакие файлы в вашем домашнем каталоге в конфигурации по умолчанию. --preserve-environmentкасается переменных среды и здесь не имеет значения.

решение2

Я создал второй профиль под названием foo; вы можете просто сделать это в defaultпрофиле напрямую. Профили являются подкаталогами /etc/schroot/, например /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также существует, но я оставил это там, так как обычноделатьхотят /etc/resolv.conf, чтобы их копировали.

Связанный контент