schrootがchrootシステムにすでに存在するpasswdファイルやその他のファイルを上書きするのを防ぐ方法は?

schrootがchrootシステムにすでに存在するpasswdファイルやその他のファイルを上書きするのを防ぐ方法は?

私はDebianシステムを修理する必要があるときにschrootを使用しようとしています。複数のパーティションをマウントしてバインドする必要がないため、非常に便利です。しかし、私の期待とは異なり、schrootは私のpasswdファイルとは異なる設定ファイル(/etc私のホームディレクトリにあります)を上書きすることにしました。奇妙なニュース)。この動作を防ぐ方法はありますか?

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

ベストアンサー1

Schrootは、chrootシステムを使用可能にするために多くの作業を行います。この作品は協賛を受けて制作されましたスクリプトは/etc/schroot/setup.d/。これらのアクションは、profileschrootのキーとして表示されるschrootのプロファイルディレクトリにあるファイルで構成されています。ルート構成デフォルト値は次のとおりです/etc/schroot/default/(schroot 構成では、別のファイルの場所を指定することもできます。詳細については、マニュアルを参照してください)。起動操作には以下が含まれます。

  • fstabプロファイルディレクトリにあるファイルの指示に従って、一部のファイルシステムをマウントします。
  • ホストシステムのファイルをchrootにコピーします。コピーするファイルのリストは、copyfiles構成ファイルディレクトリのファイルから読み取られます。
  • chrootでNSSデータベースを上書きし、ホストから読み取ります。上書きするデータベースのリストは、nssdatabases構成ファイルディレクトリのファイルから読み取られます。これはファイルのコピーと似ていますが、単に/etc/passwdchrootにコピーするのではなく、NISやLDAPなどの他のソースからもエントリを検索します。

chroot内部プログラムがchroot外部プログラムと同じDNSアクセス権を持つようにデフォルトでcopyfiles含まれています。/etc/resolv.confデフォルトのchroot設定は、chrootの内部と外部の両方で同じユーザーが必要であると仮定するため、を含むすべての一般的なnssdatabasesデータベースが含まれ、デフォルトのpasswd構成ファイルfstabには。/proc/dev/home

chrootの何も上書きしたくない場合は、なしでschroot設定ファイルを宣言してくださいcopyfiles。基本をマウントするがマウントしない構成ファイルをnssdatabases使用したい場合があります。fstab/home

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

/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環境変数に関するもので、これには関係ありません。

おすすめ記事