web-dev-qa-db-ja.com

chrootがpasswdファイルやchrootシステムにすでに存在する他のファイルをオーバーライドしないようにするにはどうすればよいですか?

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

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

5
Braiam

Schrootは、chrootされたシステムを使用可能にするために多くのことを行います。このジョブは /etc/schroot/setup.d/のスクリプト によって実行されます。これらのアクションは、schrootのプロファイルディレクトリ内のファイルによって構成されます。これは、 schroot構成profileキーで示され、デフォルトは/etc/schroot/default/です(schroot構成では他のファイルの場所も指定します。詳細については、マニュアルを参照してください)。起動アクションは次のとおりです。

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

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

Chrootの内容を上書きしたくない場合は、copyfilesnssdatabasesを付けずにschrootプロファイルを宣言してください。必需品をマウントするが/homeをマウントしないfstabが必要になるでしょう。

より便利なschroot構成では、人間のユーザーアカウントとそのホームディレクトリは再現されますが、システムアカウントは再現されません。 chrootの内部と外部で異なるアカウントが存在する可能性があるため、システムアカウントの複製は残念です。たとえば、Debianとその派生物は、ほとんどのシステムソフトウェアに動的に割り当てられたアカウントを使用するため、ほとんどのシステムアカウントのユーザー名と番号の対応は、プログラムがインストールされた順序によって異なります。これを行うには、passwdファイルからshadowgroupgshadow、およびnssdatabasesを削除し、追加するだけの独自のスクリプトを作成します。コピーする必要のあるアカウント。

次のスクリプトを/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ファイルを編集して次の行を含めるか、schrootプロファイルにsetup.nssdatabases=default/nssdatabases-appendを入れて、次の行をdefault/nssdatabasesに書き込みます。

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

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

fooという2番目のプロファイルを作成しました。これらを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も存在しますが、通常はdo/etc/resolv.confをコピーしたいので、そのままにしておきます。

1
o11c