У меня есть несколько разделов LVM, каждый из которых содержит установку Ubuntu. Иногда я хочу сделать 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}
как bind-mounts для реального /dev
, /sys
и /proc
, как представляется, dist-upgrade ожидает, что они будут присутствовать]
Однако после точного обновления этот процесс больше не работает - окончательное размонтирование завершится неудачно, поскольку в /mnt/chroot-0
файловой системе еще есть открытые файлы . lsof
подтверждает, что в chroot есть процессы с открытыми файлами. Эти процессы были запущены во время dist-upgrade, я предполагаю, что это потому, что некоторые службы в chroot должны быть перезапущены (например, через service postgresql restart
) после обновления пакета.
Итак, я считаю, что мне нужно сказать upstart, чтобы остановить все службы, работающие в этом chroot. Есть ли способ надежно сделать это?
Я пробовал:
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
кажется, делает правильные вещи и только список процессов, которые были запущены в этом конкретном корне. Я тоже попытался добавить это, как подсказал Туминоид:
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 не различает отдельные корни и выключает всю машину.
Итак, есть ли способ сказать init остановить все процессы в определенном chroot, чтобы я мог безопасно размонтировать файловую систему? Имеет ли upstart какое-либо средство для SIGTERM / SIGKILL всех дочерних процессов (как это было бы сделано при обычном завершении работы) внутри chroot?