Mam wiele partycji LVM, z których każda zawiera instalację Ubuntu. Czasami chcę to zrobić apt-get dist-upgrade
, aby zaktualizować instalację do najnowszych pakietów. Robię to za pomocą chroot - proces ten zwykle przypomina:
$ 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
[nie pokazano: montuję i odmontowuję także /mnt/chroot-0/{dev,sys,proc}
jako bind-mounty do rzeczywistych /dev
, /sys
a /proc
ponieważ dist-upgrade wydaje się oczekiwać, że będą obecne]
Jednak po aktualizacji do dokładności ten proces już nie działa - końcowy umount zakończy się niepowodzeniem, ponieważ w /mnt/chroot-0
systemie plików nadal są otwarte pliki . lsof
potwierdza, że w chroot są procesy z otwartymi plikami. Procesy te zostały uruchomione podczas aktualizacji dist, zakładam, że dzieje się tak, ponieważ niektóre usługi w chroot muszą zostać zrestartowane (np. Poprzez service postgresql restart
) po aktualizacji pakietu.
Tak więc, myślę, że muszę powiedzieć upstart, aby zatrzymać wszystkie usługi uruchomione w tym chroot. Czy istnieje sposób, aby to zrobić niezawodnie?
Próbowałem:
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
Gdzie initctl list
wydaje się, że robi to dobrze i wyświetla listę procesów, które zostały uruchomione w tym konkretnym katalogu głównym. Próbowałem też dodać to, jak sugeruje 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
Nie wydają się one jednak łapać wszystkiego; procesy, które zostały zdemonizowane i ponownie powiązane z PID 1, nie zostają zatrzymane. Próbowałem też:
sudo chroot /mnt/chroot-0 telinit 0
Ale w tym przypadku init nie rozróżnia oddzielnych korzeni i zamyka całą maszynę.
Czy jest więc jakiś sposób, aby powiedzieć initowi, aby zatrzymał wszystkie procesy w konkretnym chroocie, abym mógł bezpiecznie odmontować system plików? Czy upstart ma jakieś możliwości SIGTERM / SIGKILL wszystkich procesów potomnych (tak jak w przypadku regularnego wyłączania) w chroot?