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

5

Quando eu tive que reparar meu sistema Debian, eu tentei usar o schroot devido à conveniência de não ter que montar várias partições. Mas, ao contrário das minhas expectativas, o schroot decidiu substituir meu arquivo passwd e outros arquivos de configuração (em /etc e meu diretório pessoal) que eu não gostei (e às vezes faz com que mensagens estranhas ). Existe uma maneira de evitar esse comportamento?

Eu usei o tipo directory para schroot, já que parecia o que eu precisava. Eu verifiquei a man page e só encontrei uma opção --preserve-environment , mas da sua descrição eu não tenho certeza se ela preserva o ambiente do sistema chrooted ou apenas copia meu ambiente de usuário para a sessão chroot ao invés de um slate limpo (que é o padrão ).

    
por Braiam 11.10.2014 / 02:14

2 respostas

4

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.

    
por 12.10.2014 / 02:23
1

Eu criei um segundo perfil chamado foo ; você poderia apenas fazer isso para o perfil default diretamente. Os perfis são subdiretórios de /etc/schroot/ , por ex. /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 lá, já que você geralmente faz deseja que o /etc/resolv.conf seja copiado.

    
por 11.10.2014 / 04:52