데비안 시스템을 수리해야 할 때 여러 파티션을 바인딩할 필요가 없다는 편리함 때문에 schroot를 사용하려고 했습니다. 그러나 내 기대와는 달리 schroot는 /etc
내가 좋아하지 않는(때때로 원인이 되는) 내 passwd 파일과 기타 구성 파일(및 내 홈 디렉토리) 을 재정의하기로 결정했습니다.이상한 메시지). 그런 행동을 예방할 수 있는 방법이 있나요?
나는 schroot 유형을 사용했는데 directory
, 그것이 나에게 필요한 유형인 것 같았기 때문입니다. 매뉴얼 페이지를 확인하고 --preserve-environment
옵션만 찾았지만 설명을 보면 chroot된 시스템 환경을 유지하는지 아니면 내 사용자 환경을 깨끗한 슬레이트(기본값) 대신 chroot 세션에 복사하는지 잘 모르겠습니다.
답변1
Schroot는 chroot된 시스템을 사용 가능하게 만들기 위해 여러 가지 작업을 수행합니다. 이 작업은 다음에 의해 수행됩니다.스크립트/etc/schroot/setup.d/
. 이러한 작업은 profile
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의 어떤 것도 덮어쓰지 않으려면 copyfiles
및 없이 schroot 프로필을 선언하세요 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
복사되기를 원합니다 .