Как предотвратить шлоот от переопределения файла passwd и других файлов, уже присутствующих в chrooted системе?

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

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

Schroot делает несколько вещей, чтобы сделать chrooted систему пригодной для использования. Это задание выполняется скриптами в /etc/schroot/setup.d/ . Эти действия настраиваются файлами в каталоге профиля шрота, который обозначается ключом 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 setup предполагает, что вы хотите, чтобы одни и те же пользователи nssdatabases внутри и вне chroot, поэтому nssdatabases содержит все обычные базы данных, включая passwd , а fstab по умолчанию профиля содержит не только файловые системы, такие как /proc и /dev которые необходимы для работы многих программ, но также /home .

Если вы не хотите перезаписывать что-либо в chroot, объявите профиль copyfiles без 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 и #!/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 – это переменные окружения и не имеет значения здесь.

Я создал второй профиль, называемый 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 .