Como evitar que o schroot substitua o arquivo passwd e outros arquivos já presentes no sistema chroot?

Como evitar que o schroot substitua o arquivo passwd e outros arquivos já presentes no sistema chroot?

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 /etcdiretó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 directorypara schroot, pois parecia o que eu precisava. Eu verifiquei a página de manual e encontrei apenas uma --preserve-environmentopçã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 profilechave 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 fstabno diretório de perfil.
  • Copie os arquivos do sistema host para o chroot. A lista de arquivos a serem copiados é lida no arquivo copyfilesdo 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 nssdatabasesdo diretório de perfil. Isto é semelhante a copiar arquivos, mas não apenas copia /etc/passwdpara o chroot, mas também recupera entradas de outras fontes, como NIS ou LDAP.

Por padrão, copyfilesconté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 nssdatabasescontém todos os bancos de dados usuais, incluindo passwd, e o perfil padrão fstabcontém não apenas sistemas de arquivos como /proce /devque 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 copyfilese nssdatabases. Você provavelmente desejará um fstabque 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, shadowe do arquivo groupe escreva seu próprio script que adicione apenas as contas que devem ser copiadas.gshadownssdatabases

Você pode escrever o seguinte script para /etc/schroot/setup.d/20appendaccountscopiar 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 nssdatabasesarquivo do seu perfil para conter as seguintes linhas, ou coloque setup.nssdatabases=default/nssdatabases-appendo 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 defaultperfil. 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/copyfilestambém existe, mas deixei isso aí, já que você normalmentefazerdeseja /etc/resolv.confser copiado.

informação relacionada