저는 데비안 시스템을 수리해야 할 때 schroot를 사용하려고 합니다. 여러 파티션을 마운트하고 바인딩할 필요가 없기 때문에 매우 편리합니다. 그러나 내 기대와는 달리 schroot는 내 passwd 파일과 다른 구성 파일( /etc
내 홈 디렉터리에 있음)을 덮어쓰기로 결정했습니다.이상한 소식). 이 동작을 방지할 수 있는 방법이 있나요?
schroot 유형이 directory
나에게 필요한 유형인 것 같아서 사용했습니다. 매뉴얼 페이지를 확인하고 하나의 --preserve-environment
옵션만 찾았지만 설명에서 chroot 시스템 환경을 유지하는지 아니면 내 사용자 환경을 깨끗한 상태(기본값) 대신 chroot 세션에 복사하는지 잘 모르겠습니다.
답변1
Schroot는 chroot된 시스템을 사용 가능하게 만들기 위해 많은 작업을 수행합니다. 이 작품은 협찬을 받아 제작되었습니다스크립트는/etc/schroot/setup.d/
. 이러한 작업은 profile
schroot의 키로 표시되는 schroot의 프로필 디렉터리에 있는 파일로 구성됩니다.루트 구성기본값은 다음과 같습니다 /etc/schroot/default/
(schroot 구성은 다른 파일 위치를 지정할 수도 있습니다. 자세한 내용은 설명서를 참조하세요). 시작 작업에는 다음이 포함됩니다.
fstab
프로필 디렉터리에 있는 파일의 지시에 따라 일부 파일 시스템을 마운트합니다.- 호스트 시스템의 파일을 chroot로 복사합니다. 복사할 파일 목록은
copyfiles
구성 파일 디렉터리의 파일에서 읽혀집니다. - chroot에서 NSS 데이터베이스를 덮어쓰고 호스트에서 읽습니다. 덮어쓸 데이터베이스 목록은
nssdatabases
구성 파일 디렉터리의 파일에서 읽습니다. 이는 파일을 복사하는 것과 유사하지만 단순히/etc/passwd
chroot에 복사하는 대신 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 내부와 외부에 서로 다른 계정이 존재할 수 있기 때문입니다. 예를 들어 데비안과 그 파생 제품의 대부분 시스템 소프트웨어는 동적으로 할당된 계정을 사용하므로 대부분의 시스템 계정에 대한 사용자 이름과 숫자 간의 대응은 프로그램이 설치된 순서에 따라 달라집니다. 이렇게 하려면 파일에서 및 를 제거 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
복사되기를 원합니다 .