Debianシステムを修復しなければならなかったとき、いくつかのパーティションをマウントバインドする必要がないという便利さから、schrootを使おうとしました。しかし、私の予想に反して、schrootは、私のpasswdファイルと他の構成ファイル(/etc
と私のホームディレクトリ内)を上書きすることにしました(そして時々 奇妙なメッセージ ) 。その動作を防ぐ方法はありますか?
必要なタイプのようだったので、schrootにはタイプdirectory
を使用しました。マニュアルページを確認したところ、--preserve-environment
オプションしか見つかりませんでしたが、その説明から、chrootされたシステム環境を保持するのか、それともユーザー環境をクリーンスレートではなくchrootセッションにコピーするだけなのかわかりません(デフォルト)。
Schrootは、chrootされたシステムを使用可能にするために多くのことを行います。このジョブは /etc/schroot/setup.d/
のスクリプト によって実行されます。これらのアクションは、schrootのプロファイルディレクトリ内のファイルによって構成されます。これは、 schroot構成 のprofile
キーで示され、デフォルトは/etc/schroot/default/
です(schroot構成では他のファイルの場所も指定します。詳細については、マニュアルを参照してください)。起動アクションは次のとおりです。
fstab
で示されるように、いくつかのファイルシステムをマウントします。copyfiles
から読み取られます。nssdatabases
から読み取られます。これはファイルのコピーに似ていますが、それだけではありません。 /etc/passwd
をchrootにコピーします。また、NISやLDAPなどの他のソースからエントリを取得します。デフォルトでは、copyfiles
には/etc/resolv.conf
が含まれており、chroot内のプログラムがchroot外のプログラムと同様にDNSアクセスを確実に持つようになっています。デフォルトのchroot設定では、chrootの内外で同じユーザーが必要であると想定しているため、nssdatabases
にはpasswd
を含むすべての通常のデータベースが含まれ、デフォルトのプロファイルのfstab
には/proc
や/dev
のようなファイルシステムは、多くのプログラムの動作に不可欠ですが、/home
も同様です。
Chrootの内容を上書きしたくない場合は、copyfiles
とnssdatabases
を付けずにschrootプロファイルを宣言してください。必需品をマウントするが/home
をマウントしないfstab
が必要になるでしょう。
より便利なschroot構成では、人間のユーザーアカウントとそのホームディレクトリは再現されますが、システムアカウントは再現されません。 chrootの内部と外部で異なるアカウントが存在する可能性があるため、システムアカウントの複製は残念です。たとえば、Debianとその派生物は、ほとんどのシステムソフトウェアに動的に割り当てられたアカウントを使用するため、ほとんどのシステムアカウントのユーザー名と番号の対応は、プログラムがインストールされた順序によって異なります。これを行うには、passwd
ファイルからshadow
、group
、gshadow
、および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
をコピーしたいので、そのままにしておきます。