schroot가 chroot된 시스템에 이미 존재하는 passwd 파일 및 기타 파일을 덮어쓰는 것을 방지하는 방법은 무엇입니까?

schroot가 chroot된 시스템에 이미 존재하는 passwd 파일 및 기타 파일을 덮어쓰는 것을 방지하는 방법은 무엇입니까?

저는 데비안 시스템을 수리해야 할 때 schroot를 사용하려고 합니다. 여러 파티션을 마운트하고 바인딩할 필요가 없기 때문에 매우 편리합니다. 그러나 내 기대와는 달리 schroot는 내 passwd 파일과 다른 구성 파일( /etc내 홈 디렉터리에 있음)을 덮어쓰기로 결정했습니다.이상한 소식). 이 동작을 방지할 수 있는 방법이 있나요?

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

답변1

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

보다 유용한 schroot 구성은 인간 사용자 계정과 해당 홈 디렉터리를 재현하지만 시스템 계정은 재현하지 않습니다. 시스템 계정을 복제하는 것은 불행한 일입니다. chroot 내부와 외부에 서로 다른 계정이 존재할 수 있기 때문입니다. 예를 들어 데비안과 그 파생 제품의 대부분 시스템 소프트웨어는 동적으로 할당된 계정을 사용하므로 대부분의 시스템 계정에 대한 사용자 이름과 숫자 간의 대응은 프로그램이 설치된 순서에 따라 달라집니다. 이렇게 하려면 파일에서 및 를 제거 passwd하고 복사해야 하는 계정만 추가하는 스크립트를 직접 작성하세요.shadowgroupgshadownssdatabases

/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복사되기를 원합니다 .

관련 정보