schroot가 passwd 파일과 chroot된 시스템에 이미 존재하는 다른 파일을 재정의하는 것을 방지하는 방법은 무엇입니까?

schroot가 passwd 파일과 chroot된 시스템에 이미 존재하는 다른 파일을 재정의하는 것을 방지하는 방법은 무엇입니까?

데비안 시스템을 수리해야 할 때 여러 파티션을 바인딩할 필요가 없다는 편리함 때문에 schroot를 사용하려고 했습니다. 그러나 내 기대와는 달리 schroot는 /etc내가 좋아하지 않는(때때로 원인이 되는) 내 passwd 파일과 기타 구성 파일(및 내 홈 디렉토리) 을 재정의하기로 결정했습니다.이상한 메시지). 그런 행동을 예방할 수 있는 방법이 있나요?

나는 schroot 유형을 사용했는데 directory, 그것이 나에게 필요한 유형인 것 같았기 때문입니다. 매뉴얼 페이지를 확인하고 --preserve-environment옵션만 찾았지만 설명을 보면 chroot된 시스템 환경을 유지하는지 아니면 내 사용자 환경을 깨끗한 슬레이트(기본값) 대신 chroot 세션에 복사하는지 잘 모르겠습니다.

답변1

Schroot는 chroot된 시스템을 사용 가능하게 만들기 위해 여러 가지 작업을 수행합니다. 이 작업은 다음에 의해 수행됩니다.스크립트/etc/schroot/setup.d/. 이러한 작업은 profileschroot 의 프로필 디렉터리에 있는 파일로 구성됩니다.슈루트 구성기본값은 다음과 같습니다 /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의 어떤 것도 덮어쓰지 않으려면 copyfiles및 없이 schroot 프로필을 선언하세요 nssdatabases. 아마도 fstab필수 요소를 탑재한 를 갖고 싶지만 그렇지 않은 경우도 있을 것입니다 /home.

보다 유용한 schroot 구성은 인간 사용자 계정과 해당 홈 디렉터리를 재현하지만 시스템 계정은 재현하지 않습니다. chroot 내부와 외부에 서로 다른 계정이 있을 수 있으므로 시스템 계정을 재현하는 것은 불행한 일입니다. 예를 들어 데비안과 그 파생 제품은 대부분의 시스템 소프트웨어에 동적으로 할당된 계정을 사용하므로 대부분의 시스템 계정에 대한 사용자 이름과 번호 간의 대응은 프로그램이 설치된 순서에 따라 달라집니다. 그렇게 하려면 파일 에서 passwd, shadow및 를 제거 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복사되기를 원합니다 .

관련 정보