Tôi có một số phân vùng LVM, mỗi phân vùng chứa cài đặt Ubuntu. Thỉnh thoảng, tôi muốn thực hiện một apt-get dist-upgrade
, để cập nhật cài đặt lên các gói gần đây nhất. Tôi làm điều này với chroot - quá trình thường là như sau:
$ 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
[không được hiển thị: Tôi cũng gắn kết và ngắt /mnt/chroot-0/{dev,sys,proc}
kết nối dưới dạng gắn kết với thực tế /dev
, /sys
và /proc
, vì sự nâng cấp xa dường như mong đợi những thứ này sẽ có mặt]
Tuy nhiên, sau khi nâng cấp lên chính xác, quá trình này không còn hoạt động nữa - lần cuối cùng sẽ thất bại vì vẫn còn các tệp đang mở trên /mnt/chroot-0
hệ thống tệp. lsof
xác nhận rằng có các quy trình với các tệp đang mở trong chroot. Các quy trình này đã được bắt đầu trong quá trình nâng cấp, tôi cho rằng điều này là do các dịch vụ nhất định trong chroot cần được khởi động lại (ví dụ: thông qua service postgresql restart
) sau khi gói được nâng cấp.
Vì vậy, tôi cho rằng tôi cần phải nói trước để ngăn chặn tất cả các dịch vụ đang chạy trong chroot này. Có cách nào đáng tin cậy để làm điều này?
Tôi đã thử:
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
Nơi initctl list
dường như làm đúng và chỉ liệt kê các quy trình đã được bắt đầu trong root cụ thể này. Tôi cũng đã thử thêm điều này, theo đề xuất của 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
Tuy nhiên, những thứ này dường như không bắt được mọi thứ; các quy trình đã được chỉnh sửa và được sửa chữa thành PID 1 không bị dừng. Tôi cũng đã thử:
sudo chroot /mnt/chroot-0 telinit 0
Nhưng trong trường hợp này, init không phân biệt giữa các rễ riêng biệt và tắt toàn bộ máy.
Vì vậy, có cách nào để bảo init dừng tất cả các tiến trình trong một chroot cụ thể, để tôi có thể ngắt kết nối hệ thống tập tin một cách an toàn không? Có bắt đầu có bất kỳ cơ sở để SIGTERM / SIGKILL tất cả các quy trình con (như sẽ được thực hiện trong khi tắt máy thường xuyên) trong một chroot?