Debian システムを修復しなければならなかったとき、複数のパーティションをマウントしてバインドする必要がないという利便性から、schroot を使用しようとしました。しかし、予想に反して、schroot は私の passwd ファイルとその他の設定ファイル (および/etc
ホームディレクトリ内) を上書きすることに決めました。これは好ましくありませんでした (そして、時には奇妙なメッセージ)。この動作を防ぐ方法はありますか?
必要なものだと思われたので、schroot のタイプを使用しましたdirectory
。マニュアル ページを確認したところ、--preserve-environment
オプションしか見つかりませんでした。説明からは、chroot されたシステム環境が保持されるのか、それともクリーン スレート (デフォルト) ではなく、ユーザー環境が chroot セッションにコピーされるだけなのかはわかりません。
答え1
Schrootはchrootされたシステムを使えるようにするためにいくつかのことを行います。この作業はスクリプト/etc/schroot/setup.d/
これらのアクションは、schrootのプロファイルディレクトリ内のファイルによって設定されprofile
、schroot 構成デフォルトは です/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 とその派生製品では、ほとんどのシステム ソフトウェアに動的に割り当てられたアカウントが使用されるため、ほとんどのシステム アカウントのユーザー名と番号の対応は、プログラムがインストールされた順序によって異なります。これを実行するには、ファイルから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
プロファイルのファイルを編集して次の行を追加するか、 setup.nssdatabases=default/nssdatabases-append
schroot プロファイルを作成して次の行を に書き込みます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
コピーされたい。