O Schroot faz uma série de coisas para tornar o sistema chrooted utilizável. Este trabalho é executado pelos scripts em /etc/schroot/setup.d/
. Essas ações são configuradas por arquivos no diretório de perfil do schroot, o que é indicado pela chave profile
no schroot configuração e padrão para /etc/schroot/default/
(a configuração do schroot também pode especificar outros locais de arquivos, consulte o manual para detalhes). As ações de inicialização incluem:
- Monte alguns sistemas de arquivos conforme indicado pelo arquivo
fstab
no diretório do perfil. - Copie arquivos do sistema host para o chroot. A lista de arquivos a serem copiados é lida no arquivo
copyfiles
do diretório do perfil. - Sobrescreve bancos de dados NSS no chroot, lidos do host. A lista de bancos de dados a serem sobrescritos é lida no arquivo
nssdatabases
do diretório do perfil. Isso é semelhante à cópia de arquivos, mas não apenas, por exemplo. copie/etc/passwd
para o chroot, ele 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 tenham acesso ao DNS como aqueles que estão fora do chroot. A configuração chroot padrão pressupõe que você deseja os mesmos usuários dentro e fora do chroot, então 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 do schroot sem copyfiles
e nssdatabases
. Você provavelmente desejará ter um fstab
que monte o essencial, mas não /home
.
Uma configuração mais útil do schroot reproduziria as contas de usuário humano e seus diretórios pessoais, mas não as contas do sistema. Reproduzir as contas do sistema é lamentável porque pode haver contas diferentes dentro e fora do chroot. Por exemplo, o Debian e seus derivados usam contas designadas dinamicamente para a maioria dos softwares de sistema, então a correspondência entre nome de usuário e número para a maioria das contas do sistema depende da ordem em que os programas foram instalados. Para fazer isso, remova passwd
, shadow
, group
e gshadow
do arquivo nssdatabases
e escreva seu próprio script que adiciona apenas as contas que devem ser copiadas.
Você pode escrever o seguinte script como /etc/schroot/setup.d/20appendaccounts
para copiar apenas as contas no intervalo real do usuário.
#!/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 <= \ && \ <= $LAST_UID";;
group) awk -F : "$FIRST_GID <= \ && \ <= $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 arquivo nssdatabases
do seu perfil para conter as seguintes linhas, ou coloque setup.nssdatabases=default/nssdatabases-append
no perfil do schroot e escreva as seguintes linhas em default/nssdatabases
.
#>>passwd
#>>shadow
#>>group
#>>gshadow
services
protocols
networks
hosts
O Schroot não sobrescreve qualquer arquivo em seu diretório pessoal em sua configuração padrão. --preserve-environment
é sobre variáveis de ambiente e não é relevante aqui.