Когда мне пришлось восстанавливать свою систему 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
, чтобы их копировали.