schroot が chroot されたシステムに既に存在する passwd ファイルやその他のファイルを上書きするのを防ぐにはどうすればよいですか?

schroot が chroot されたシステムに既に存在する passwd ファイルやその他のファイルを上書きするのを防ぐにはどうすればよいですか?

Debian システムを修復しなければならなかったとき、複数のパーティションをマウントしてバインドする必要がないという利便性から、schroot を使用しようとしました。しかし、予想に反して、schroot は私の passwd ファイルとその他の設定ファイル (および/etcホームディレクトリ内) を上書きすることに決めました。これは好ましくありませんでした (そして、時には奇妙なメッセージ)。この動作を防ぐ方法はありますか?

必要なものだと思われたので、schroot のタイプを使用しましたdirectory。マニュアル ページを確認したところ、--preserve-environmentオプションしか見つかりませんでした。説明からは、chroot されたシステム環境が保持されるのか、それともクリーン スレート (デフォルト) ではなく、ユーザー環境が chroot セッションにコピーされるだけなのかはわかりません。

答え1

Schrootはchrootされたシステムを使えるようにするためにいくつかのことを行います。この作業はスクリプト/etc/schroot/setup.d/これらのアクションは、schrootのプロファイルディレクトリ内のファイルによって設定されprofileschroot 構成デフォルトは です/etc/schroot/default/(schroot 構成では他のファイルの場所を指定することもできます。詳細についてはマニュアルを参照してください)。起動アクションには次のものが含まれます。

  • fstabプロファイル ディレクトリ内のファイルで示されているように、いくつかのファイルシステムをマウントします。
  • ホスト システムから chroot にファイルをコピーします。コピーするファイルのリストは、copyfilesプロファイル ディレクトリのファイルから読み取られます。
  • ホストから読み取られた chroot 内の NSS データベースを上書きします。上書きするデータベースのリストは、nssdatabasesプロファイル ディレクトリのファイルから読み取られます。これはファイルのコピーに似ていますが、たとえば chroot にコピーするだけでなく/etc/passwd、NIS や LDAP などの他のソースからエントリも取得します。

デフォルトでは、copyfilesには が含まれており/etc/resolv.conf、chroot 内のプログラムが chroot 外のプログラムと同様に DNS アクセスを持つことが保証されます。デフォルトの chroot セットアップでは、chroot の内外で同じユーザーが必要であると想定されているため、nssdatabasesには を含むすべての通常のデータベースが含まれておりpasswd、デフォルト プロファイルの には、多くのプログラムの動作に不可欠な や などfstabのファイルシステムだけでなく も含まれています。/proc/dev/home

chroot 内の何も上書きしたくない場合は、 と なしで schroot プロファイルを宣言しますcopyfiles。おそらく、必須項目をマウントするが はマウントしない がnssdatabases必要になるでしょう。fstab/home

より有用な schroot 構成では、人間のユーザー アカウントとそのホーム ディレクトリは再現されますが、システム アカウントは再現されません。chroot の内外ではアカウントが異なる可能性があるため、システム アカウントの再現は不都合です。たとえば、Debian とその派生製品では、ほとんどのシステム ソフトウェアに動的に割り当てられたアカウントが使用されるため、ほとんどのシステム アカウントのユーザー名と番号の対応は、プログラムがインストールされた順序によって異なります。これを実行するには、ファイルからpasswdshadowgroupを削除し、コピーするアカウントのみを追加する独自のスクリプトを作成します。gshadownssdatabases

/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-appendschroot プロファイルを作成して次の行を に書き込みますdefault/nssdatabases

#>>passwd
#>>shadow
#>>group
#>>gshadow
services
protocols
networks
hosts

Schroot は、デフォルト設定ではホーム ディレクトリ内のファイルを上書きしません。--preserve-environmentこれは環境変数に関するもので、ここでは関係ありません。

答え2

という 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コピーされたい。

関連情報