Quando tive que reparar meu sistema Debian, tentei usar o schroot devido à conveniência de não ter que montar e vincular várias partições. Mas, ao contrário das minhas expectativas, o schroot decidiu substituir meu arquivo passwd e outros arquivos de configuração (no /etc
diretório inicial e no meu diretório pessoal) dos quais eu não gostei (e às vezes causamensagens estranhas). Existe uma maneira de evitar esse comportamento?
Usei o tipo directory
para schroot, pois parecia o que eu precisava. Eu verifiquei a página de manual e encontrei apenas uma --preserve-environment
opção, mas pela sua descrição não tenho certeza se ela preserva o ambiente do sistema chroot ou apenas copia meu ambiente de usuário para a sessão chroot em vez de uma lousa limpa (que é o padrão).
Responder1
Schroot faz uma série de coisas para tornar o sistema chroot utilizável. Este trabalho é realizado porroteiros em/etc/schroot/setup.d/
. Estas ações são configuradas por arquivos no diretório de perfil do schroot, que é indicado pela profile
chave no campoconfiguração do schroote o padrão é /etc/schroot/default/
(a configuração do schroot também pode especificar outros locais de arquivo, consulte o manual para obter detalhes). As ações de inicialização incluem:
- Monte alguns sistemas de arquivos conforme indicado pelo arquivo
fstab
no diretório de perfil. - Copie os arquivos do sistema host para o chroot. A lista de arquivos a serem copiados é lida no arquivo
copyfiles
do diretório do perfil. - Substitua os bancos de dados NSS no chroot, leia do host. A lista de bancos de dados a serem substituídos é lida no arquivo
nssdatabases
do diretório de perfil. Isto é semelhante a copiar arquivos, mas não apenas copia/etc/passwd
para o chroot, mas também recupera entradas de outras fontes, como NIS ou LDAP.
Por padrão, copyfiles
contém /etc/resolv.conf
, para garantir que os programas no chroot terão acesso DNS como aqueles fora do chroot. A configuração padrão do chroot assume que você deseja os mesmos usuários dentro e fora do chroot, portanto nssdatabases
contém todos os bancos de dados usuais, incluindo passwd
, e o perfil padrão fstab
contém não apenas sistemas de arquivos como /proc
e /dev
que são essenciais para o funcionamento de muitos programas, mas também /home
.
Se você não quiser sobrescrever nada no chroot, declare um perfil schroot sem copyfiles
e nssdatabases
. Você provavelmente desejará um fstab
que monte o essencial, mas não /home
.
Uma configuração schroot mais útil reproduziria as contas de usuário humano e seus diretórios pessoais, mas não as contas do sistema. A reprodução das contas do sistema é lamentável porque pode haver contas diferentes dentro e fora do chroot. Por exemplo, o Debian e seus derivados usam contas atribuídas dinamicamente para a maioria dos softwares de sistema, portanto a correspondência entre nome de usuário e número para a maioria das contas de sistema depende da ordem em que os programas foram instalados. Para fazer isso, remova passwd
, shadow
e do arquivo group
e escreva seu próprio script que adicione apenas as contas que devem ser copiadas.gshadow
nssdatabases
Você pode escrever o seguinte script para /etc/schroot/setup.d/20appendaccounts
copiar apenas contas na faixa de usuários reais.
#!/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 o nssdatabases
arquivo do seu perfil para conter as seguintes linhas, ou coloque setup.nssdatabases=default/nssdatabases-append
o perfil schroot e escreva as seguintes linhas em default/nssdatabases
.
#>>passwd
#>>shadow
#>>group
#>>gshadow
services
protocols
networks
hosts
Schroot não substitui nenhum arquivo em seu diretório inicial em sua configuração padrão. --preserve-environment
é sobre variáveis de ambiente e não é relevante aqui.
Responder2
Criei um segundo perfil chamado foo
; você pode simplesmente fazer isso diretamente no default
perfil. Perfis são subdiretórios de /etc/schroot/
, por exemplo /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
também existe, mas deixei isso aí, já que você normalmentefazerdeseja /etc/resolv.conf
ser copiado.