J'ai un certain nombre de partitions LVM, chacune contenant une installation Ubuntu. Parfois, je souhaite faire une apt-get dist-upgrade
mise à jour d'une installation vers les packages les plus récents. Je le fais avec chroot - le processus est généralement quelque chose comme:
$ 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 illustré: je monte et démonte également en tant que fixations /mnt/chroot-0/{dev,sys,proc}
de liaison au réel /dev
, /sys
et /proc
, comme la mise à niveau dist semble s'attendre à ce qu'elles soient présentes]
Cependant, après une mise à niveau précise, ce processus ne fonctionne plus - le umount final échouera car il y a encore des fichiers ouverts sur le /mnt/chroot-0
système de fichiers. lsof
confirme qu'il existe des processus avec des fichiers ouverts dans le chroot. Ces processus ont été lancés pendant la mise à niveau dist, je suppose que c'est parce que certains services dans le chroot doivent être redémarrés (par exemple, via service postgresql restart
) après la mise à niveau du package.
Donc, je pense que je dois dire à upstart d'arrêter tous les services qui s'exécutent dans ce chroot. Existe-t-il un moyen de le faire de manière fiable?
J'ai essayé:
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
Où initctl list
semble faire la bonne chose et ne lister que les processus qui ont été démarrés dans cette racine particulière. J'ai essayé d'ajouter cela aussi, comme suggéré par 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
Cependant, ceux-ci ne semblent pas tout attraper; les processus démonifiés et reparents au PID 1 ne sont pas arrêtés. J'ai aussi essayé:
sudo chroot /mnt/chroot-0 telinit 0
Mais dans ce cas, init ne fait pas de distinction entre les racines séparées et arrête la machine entière.
Alors, existe-t-il un moyen de dire à init d'arrêter tous les processus dans un chroot particulier, afin que je puisse démonter le système de fichiers en toute sécurité? L'arrivée a-t-elle la possibilité de SIGTERM / SIGKILL tous les processus enfants (comme ce serait le cas lors d'un arrêt normal) dans un chroot?