Saya memiliki sejumlah partisi LVM, masing-masing berisi instalasi Ubuntu. Kadang-kadang, saya ingin melakukan apt-get dist-upgrade
, untuk memperbarui instalasi ke paket terbaru. Saya melakukan ini dengan chroot - prosesnya biasanya seperti:
$ 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
[tidak diperlihatkan: Saya juga me-mount dan unmount /mnt/chroot-0/{dev,sys,proc}
sebagai bind-mounts ke yang asli /dev
, /sys
dan /proc
, karena dist-upgrade sepertinya mengharapkan ini ada]
Namun, setelah memutakhirkan ke tepatnya, proses ini tidak lagi berfungsi - umount terakhir akan gagal karena masih ada file yang terbuka di sistem /mnt/chroot-0
file. lsof
menegaskan bahwa ada proses dengan file terbuka di chroot. Proses-proses ini telah dimulai selama dist-upgrade, saya berasumsi ini karena layanan tertentu di chroot perlu direstart (misalnya, melalui service postgresql restart
) setelah paket ditingkatkan.
Jadi, saya pikir saya perlu memberitahu pemula untuk menghentikan semua layanan yang berjalan dalam chroot ini. Apakah ada cara untuk melakukan ini dengan andal?
Saya sudah mencoba:
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
Di mana initctl list
tampaknya melakukan hal yang benar dan hanya daftar proses yang telah dimulai di root khusus ini. Saya sudah mencoba menambahkan ini juga, seperti yang disarankan oleh 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
Namun, ini tampaknya tidak menangkap segalanya; proses yang telah daemonisasi dan telah diperbaiki ke PID 1 jangan dihentikan. Saya juga sudah mencoba:
sudo chroot /mnt/chroot-0 telinit 0
Tetapi dalam kasus ini, init tidak membedakan antara akar yang terpisah dan mematikan seluruh mesin.
Jadi, apakah ada cara untuk memberitahu init untuk menghentikan semua proses dalam chroot tertentu, sehingga saya dapat dengan aman meng-unmount sistem file? Apakah pemula memiliki fasilitas untuk SIGTERM / SIGKILL semua proses anak (seperti yang akan dilakukan selama shutdown reguler) dalam chroot?