मेरे पास कई LVM विभाजन हैं, जिनमें से प्रत्येक में एक Ubuntu इंस्टालेशन है। कभी-कभी, मैं apt-get dist-upgrade
सबसे हाल के पैकेजों के लिए एक इंस्टॉलेशन को अपडेट करने के लिए एक करना चाहता हूं । मैं चेरोट के साथ ऐसा करता हूं - प्रक्रिया आमतौर पर कुछ इस तरह होती है:
$ 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}
वास्तविक के लिए बाइंड-माउंट के रूप में भी माउंट और अनमाउंट करता हूं /dev
, /sys
और /proc
, जैसा कि डिस्ट-अपग्रेड से लगता है कि ये मौजूद हैं]
हालांकि, सटीक में अपग्रेड करने के बाद, यह प्रक्रिया अब काम नहीं करती है - अंतिम umount विफल हो जाएगा क्योंकि /mnt/chroot-0
फाइल सिस्टम पर अभी भी खुली फाइलें हैं । lsof
पुष्टि करता है कि चेरोट में खुली फाइलों के साथ प्रक्रियाएं हैं। इन प्रक्रियाओं को डिस्ट-अपग्रेड के दौरान शुरू किया गया है, मैं यह मान रहा हूं क्योंकि service postgresql restart
पैकेज अपग्रेड होने के बाद चेरोट में कुछ सेवाओं को फिर से शुरू करने की आवश्यकता होती है (जैसे, के माध्यम से )।
इसलिए, मुझे लगता है कि मुझे इस चेरोट के भीतर चल रही सभी सेवाओं को रोकने के लिए ऊपर बताने की आवश्यकता है। क्या मज़बूती से ऐसा करने का एक तरीका है?
मैंने कोशिश की:
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
सही काम करने के लिए लगता है और केवल उन प्रक्रियाओं को सूचीबद्ध करता है जो इस विशेष रूट में शुरू किए गए हैं। मैंने इसे जोड़ने की कोशिश की है, जैसा कि 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
हालाँकि, ये सब कुछ नहीं पकड़ते हैं; ऐसी प्रक्रियाएँ जिन्हें पीआईडी 1 के लिए निर्धारित किया गया है और उनका निवारण नहीं किया गया है। मैंने भी कोशिश की है:
sudo chroot /mnt/chroot-0 telinit 0
लेकिन इस मामले में, init अलग-अलग जड़ों के बीच अंतर नहीं करता है और पूरी मशीन को बंद कर देता है।
तो, क्या किसी विशेष चिरोट में सभी प्रक्रियाओं को रोकने के लिए init बताने का कोई तरीका है, ताकि मैं सुरक्षित रूप से फाइलसिस्टम को अनमाउंट कर सकूं? क्या अपस्टार्ट में चिरोट के भीतर SIGTERM / SIGKILL की सभी बाल प्रक्रियाओं (जैसा कि नियमित रूप से बंद होने के दौरान किया जाएगा) में कोई सुविधा नहीं है?