如何防止 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從設定檔目錄中的檔案讀取的。這類似於複製文件,但它不僅僅複製/etc/passwd到 chroot,它還從其他來源(例如 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及其衍生版本的大多數系統軟體都使用動態分配的帳戶,因此大多數系統帳戶的使用者名稱和號碼之間的對應關係取決於程式安裝的順序。為此,請從檔案中刪除passwdshadow和,group然後編寫您自己的腳本,僅新增應複製的帳戶。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

我創建了第二個配置文件,名為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被複製。

相關內容