Ubuntuがインストールされた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 は個別のルートを区別せず、マシン全体をシャットダウンします。
だから、ファイルシステムを安全にアンマウントできるように、特定のchrootのすべてのプロセスを停止するようにinitに指示する方法はありますか?upstartには、chroot内のすべての子プロセスをSIGTERM / SIGKILLする機能がありますか?