Her biri bir Ubuntu yüklemesi içeren bir dizi LVM bölümüm var. Bazen, apt-get dist-upgrade
bir yüklemeyi en son paketlere güncellemek için, yapmak istiyorum . Bunu chroot ile yaparım - süreç genellikle şöyle bir şeydir:
$ 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
[gösterilmiyor: Ben de /mnt/chroot-0/{dev,sys,proc}
gerçek bağlanma bağları olarak monte ve sökmek /dev
, /sys
ve /proc
dist-yükseltme bunların mevcut gibi görünüyor]
Ancak, hassas bir sürüme yükselttikten sonra bu işlem artık işe yaramıyor - /mnt/chroot-0
dosya sisteminde hala açık dosyalar olduğu için son umount başarısız olacak . lsof
chroot'ta açık dosyaları olan işlemler olduğunu doğrular. Bu işlemler dağıtım sırasında başlatıldı, bunun nedeni service postgresql restart
, paketin yükseltildikten sonra kroottaki bazı hizmetlerin yeniden başlatılması (örneğin, aracılığıyla ) olması gerektiğine inanıyorum .
Yani, bu chroot içinde çalışan tüm hizmetleri durdurmak için upstart'a söylemem gerektiğini anlıyorum. Bunu güvenilir bir şekilde yapmanın bir yolu var mı?
Denedim:
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
Nerede initctl list
doğru olanı yapar gibi görünüyor ve sadece bu kökte başlatılan süreçleri listeler. Tuminoid tarafından önerildiği gibi bunu da eklemeyi denedim:
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
Ancak, bunlar her şeyi yakalamıyor gibi görünüyor; planlanan ve PID 1'e bildirilen işlemler durmaz. Ayrıca denedim:
sudo chroot /mnt/chroot-0 telinit 0
Ancak bu durumda, init ayrı kökleri ayırt etmez ve tüm makineyi kapatır.
Yani, init'e belirli bir kroottaki tüm süreçleri durdurmasını söylemenin bir yolu var mı, böylece dosya sistemini güvenli bir şekilde çıkarabilir miyim? Uptart'ın bir kroot içindeki tüm alt süreçleri (düzenli kapatma sırasında yapılacak gibi) SIGTERM / SIGKILL için herhangi bir tesisi var mı?