Ho un numero di partizioni LVM, ognuna contenente un'installazione Ubuntu. Occasionalmente, voglio fare un apt-get dist-upgrade
, per aggiornare un'installazione ai pacchetti più recenti. Lo faccio con chroot - il processo è di solito qualcosa del tipo:
$ 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
[Non mostrato: ho anche montare e smontare /mnt/chroot-0/{dev,sys,proc}
come bind-monti al vero /dev
, /sys
e /proc
, come il dist-upgrade sembra aspettarsi che questi siano presenti]
Tuttavia, dopo l'upgrade per la precisione, questo processo non funziona più: l'umount finale fallirà perché ci sono ancora file aperti sul /mnt/chroot-0
filesystem. lsof
conferma che ci sono processi con file aperti nel chroot. Questi processi sono stati avviati durante l'aggiornamento dist, suppongo che ciò sia dovuto al fatto che alcuni servizi nel chroot devono essere riavviati (ad es. Attraverso service postgresql restart
) dopo l'aggiornamento del pacchetto.
Quindi, immagino di dover dire a upstart di interrompere tutti i servizi in esecuzione all'interno di questo chroot. C'è un modo per farlo in modo affidabile?
Ho provato:
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
Dove initctl list
sembra fare la cosa giusta e elenca solo i processi che sono stati avviati in questa particolare radice. Ho provato ad aggiungere anche questo, come suggerito da 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
Tuttavia, questi non sembrano catturare tutto; i processi che sono stati demonizzati e reintegrati nel PID 1 non vengono arrestati. Ho anche provato:
sudo chroot /mnt/chroot-0 telinit 0
Ma in questo caso, init non fa distinzione tra le radici separate e spegne l'intera macchina.
Quindi, c'è un modo per dire a init di interrompere tutti i processi in un chroot particolare, in modo da poter smontare in sicurezza il filesystem? Upstart ha qualche possibilità di SIGTERM / SIGKILL tutti i processi figlio (come si farebbe durante l'arresto regolare) all'interno di un chroot?