當我必須修復 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
從設定檔目錄中的檔案讀取的。這類似於複製文件,但它不僅僅複製/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及其衍生版本的大多數系統軟體都使用動態分配的帳戶,因此大多數系統帳戶的使用者名稱和號碼之間的對應關係取決於程式安裝的順序。為此,請從檔案中刪除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
我創建了第二個配置文件,名為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
被複製。