우분투 설치를 포함하는 많은 LVM 파티션이 있습니다. 경우에 apt-get dist-upgrade
따라 설치를 최신 패키지로 업데이트하려고합니다. 나는 chroot로 이것을한다-프로세스는 보통 다음과 같다 :
$ sudo mount /dev/local/chroot-0 /mnt/chroot-0
$ sudo chroot /mnt/chroot-0 sh -c 'apt-get update && apt-get dist-upgrade'
$ sudo umount /mnt/chroot-0
[표시되지 않음 : 또한 /mnt/chroot-0/{dev,sys,proc}
실제에 대한 바인드 마운트 로 마운트 및 마운트 해제 합니다 /dev
. /sys
그리고 /proc
dist-upgrade는 이것들이 존재할 것으로 예상합니다]
그러나 정확한 수준으로 업그레이드 한 후에는이 프로세스가 더 이상 작동하지 않습니다 /mnt/chroot-0
. 파일 시스템 에 여전히 열려있는 파일이 있기 때문에 최종 umount가 실패합니다 . lsof
chroot에 열린 파일이있는 프로세스가 있는지 확인합니다. 이 프로세스는 dist-upgrade 중에 시작 service postgresql restart
되었습니다. 패키지를 업그레이드 한 후 chroot의 특정 서비스를 다시 시작해야한다고 가정합니다 .
따라서이 chroot 내에서 실행중인 모든 서비스를 중지하려면 upstart에게 알려 주어야한다고 생각합니다. 이 작업을 확실하게 수행 할 수있는 방법이 있습니까?
난 노력 했어:
cat <<EOF | sudo chroot /mnt/chroot-0 /bin/sh
# stop 'initctl' services
initctl list | awk '/start\/running/ {print \$1}' | xargs -n1 -r initctl stop
EOF
어디 initctl list
옳은 일이 특정 루트에서 시작 된 경우에만 목록 프로세스를 할 것으로 보인다. Tuminoid가 제안한대로 이것을 추가하려고 시도했습니다.
cat <<EOF | sudo chroot /mnt/chroot-0 /bin/sh
# stop 'service' services
service --status-all 2>/dev/null |
awk '/^ \[ \+ \]/ { print \$4}' |
while read s; do service \$s stop; done
EOF
그러나 이것들은 모든 것을 잡는 것처럼 보이지는 않습니다. PID 1로 데몬 화되고 상쇄 된 프로세스는 중지되지 않습니다. 나는 또한 시도했다 :
sudo chroot /mnt/chroot-0 telinit 0
그러나이 경우, init 는 별도의 루트를 구분 하지 않고 전체 시스템을 종료합니다.
그래서 파일 시스템을 안전하게 마운트 해제 할 수 있도록 init에게 특정 chroot의 모든 프로세스를 중지하도록 지시 할 수있는 방법이 있습니까? upstart는 chroot 내에 모든 하위 프로세스 (정기 종료 중에 수행됨)를 SIGTERM / SIGKILL하는 기능이 있습니까?