Tengo varias particiones LVM, cada una con una instalación de Ubuntu. Ocasionalmente, quiero hacer un apt-get dist-upgrade
, para actualizar una instalación a los paquetes más recientes. Hago esto con chroot: el proceso suele ser algo como:
$ 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
[No se muestra: Yo también montar y desmontar /mnt/chroot-0/{dev,sys,proc}
como bind-montajes a lo real /dev
, /sys
y /proc
, como el dist-upgrade parece esperar que éstos estén presentes]
Sin embargo, después de actualizar a preciso, este proceso ya no funciona: el montaje final fallará porque todavía hay archivos abiertos en el /mnt/chroot-0
sistema de archivos. lsof
confirma que hay procesos con archivos abiertos en el chroot. Estos procesos se han iniciado durante la actualización dist, supongo que esto se debe a que ciertos servicios en el chroot deben reiniciarse (p. Ej., A través de service postgresql restart
) después de actualizar el paquete.
Entonces, me imagino que necesito decirle a advenedizo que detenga todos los servicios que se ejecutan dentro de este chroot. ¿Hay alguna manera de hacer esto de manera confiable?
He intentado:
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
Where initctl list
parece hacer lo correcto y solo enumera los procesos que se han iniciado en esta raíz en particular. Intenté agregar esto también, como lo sugiere 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
Sin embargo, estos no parecen atrapar todo; los procesos que han sido demonizados y han sido reparentados a PID 1 no se detienen. También he intentado:
sudo chroot /mnt/chroot-0 telinit 0
Pero en este caso, init no distingue entre las raíces separadas y apaga toda la máquina.
Entonces, ¿hay alguna forma de decirle a init que detenga todos los procesos en un chroot particular, para que pueda desmontar el sistema de archivos de manera segura? ¿Upstart tiene alguna facilidad para SIGTERM / SIGKILL todos los procesos secundarios (como se haría durante el apagado regular) dentro de un chroot?