हाइबरनेशन का उपयोग करना systemctl
और इसे कठिन मामलों में काम करना
मेरे लिए, pm-hibernate
हमेशा विफल रहता है। कुछ ट्वीक्स के बाद, मैं सिस्टमड के इंटरफेस (16.04 और इसके बाद के संस्करण में) का उपयोग करके हाइबरनेट करने में सक्षम था। मैं भी इसे स्वैप फ़ाइल के साथ 17.04 पर काम करने में कामयाब रहा। यह केस स्टडी दूसरों की समस्याओं के लिए उपयोगी हो सकती है।
पहला प्रयास:
sudo systemctl hibernate
यदि वह विफल हो जाता है, तो समस्या निवारण शुरू करें: हाइबरनेट स्थिति (HTD या ACPI S4) में मशीन स्थिति डिस्क पर लिखी जाती है ताकि इसे संरक्षित करने के लिए किसी शक्ति की आवश्यकता न हो। राज्य या तो एक स्वैप विभाजन या एक स्वैप फ़ाइल के लिए लिखा जाता है। ध्यान दें: यदि BTRFS का उपयोग कर रहा है तो स्वैप फ़ाइल का उपयोग करने का प्रयास न करें क्योंकि इससे फाइल सिस्टम भ्रष्टाचार हो सकता है
आपका स्वैप विभाजन या स्वैप फ़ाइल रैम हाइबरनेशन अनुमति देने के लिए के रूप में एक ही आकार के होने की आवश्यकता हो सकती है, लेकिन वहाँ के अनुसार एक अच्छा मौका है आप अगर यह कम से कम 2/5 राम के आकार है हाइबरनेट करने में सक्षम हो जाएगा, आर्क विकि पृष्ठ , इसलिए स्वैप आकार बढ़ाने से पहले पहले अन्य चरणों का प्रयास करें।
यदि आपकी समस्या यह है कि आपको अपेक्षित फिर से शुरू करने के बजाय एक साफ बूट मिल जाता है, तो कम से कम आपको डिस्क छवि को खोजने के लिए बूट पैरामीटर सेट करने की सबसे अधिक आवश्यकता है।
अपना स्वैप विभाजन खोजें:
grep swap /etc/fstab
मेरे लिए यह रिटर्न (आंशिक उत्पादन)
# swap was on /dev/mmcblk0p3 during installation
/dev/mmcblk0p3
निर्दिष्ट करने के लिए विभाजन कहां है
एक बूट पैरामीटर जोड़ें:
sudoedit /etc/default/grub
उद्धरणों में अनुभाग को GRUB_CMDLINE_LINUX_DEFAULT
जोड़ने वाली रेखा तक resume=/dev/YourSwapPartition
(उस विभाजन से प्रतिस्थापित करें जिसे आपने पहले पहचाना था)। मेरे उदाहरण का उपयोग करना:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash resume=/dev/mmcblk0p3"
जब भी आप इस फ़ाइल को बदलते हैं, आपको चलना चाहिए sudo update-grub
या परिवर्तनों का कोई प्रभाव नहीं होगा।
अब आपको रिबूट करने की आवश्यकता है। फिर आप कमांड जारी करके हाइबरनेट करने का प्रयास कर सकते हैं:
sudo systemctl hibernate
फिर से शुरू करने के लिए, पावर बटन दबाएं और सिस्टम बूट होगा।
यदि आपको अभी भी समस्या है, तो डिबगिंग शुरू करें।
मैं एक उदाहरण के रूप में नीचे अपने मामले को शामिल करता हूं, लेकिन एस राज्यों को डीबग करने की विस्तृत जानकारी इस ब्लॉग में मिल सकती है और यह भी ।
अधिक जानकारी कैप्चर करने के लिए कुछ और बूट पैरामीटर सेट करें। निकालें quiet
और splash
जोड़ें initcall_debug
और no_console_suspend
जिसके कारण init सिस्टम कॉल कंसोल में प्रिंट हो जाएगा ताकि आप देख सकें कि क्या गलत हो रहा है। मैंने इसे सेट किया:
GRUB_CMDLINE_LINUX_DEFAULT="resume=/dev/mmcblk0p3 no_console_suspend initcall_debug"
जिसने मुझे यह देखने में मदद की कि हाइबरनेशन से फिर से शुरू होने में क्या गलत था।
मेरे मामले में, फिर से शुरू करने के बाद मैंने वाईफाई खो दिया, और कर्नेल स्पष्ट रूप से अधिकांश आदेशों के रूप में परेशान था (उदाहरण के लिए /sys
, मॉड्यूल या किसी भी systemctl
कमांड को फिर से लोड करने से कुछ भी पढ़ने ) काम नहीं करेगा - प्रक्रिया शुरू करने के लिए प्रकट होगी और बस लटका होगा (यह सब होगा पाठ्यक्रम के रिबूट के बाद वापस सामान्य)। सिस्टम को बहुत धीरे-धीरे बंद करना और सभी डिबग संदेशों को पढ़ना, मैंने देखा कि "brcm" के साथ बहुत सारी समस्याएं थीं, इसलिए मैंने अनुमान लगाया कि मेरा ब्रॉडकॉम वायरलेस ड्राइवर मॉड्यूल को दोष देना था। निश्चित रूप से मैंने पहले मॉड्यूल को उतारने के लिए अपनी हाइबरनेशन प्रक्रिया को समायोजित किया:
sudo modprobe -r brcmfmac
sudo systemctl hibernate
फिर से शुरू करने पर मैं मॉड्यूल को पुन: स्थापित करता हूं
sudo modprobe brcmfmac
और सब कुछ पूरी तरह से काम किया। मुझे उस btsdio
मॉड्यूल को ब्लैकलिस्ट करना होगा, जो असंगत लगता हैbrcmfmac
अपडेट: 17.04 पर एक स्वैप फ़ाइल का उपयोग करके हाइबरनेशन।
एक बार फिर आर्क विकी पेज और कुछ अतिरिक्त टिंकरिंग की मदद से, मैं एक स्वैप फ़ाइल के साथ 17.04 पर काम करने के लिए हाइबरनेशन प्राप्त करने में कामयाब रहा। इसके लिए एक अतिरिक्त बूट पैरामीटर की आवश्यकता होती है, resume_offset=n
जहां n निम्न physical_offset
में से पहला नंबर है sudo filefrag -v /swapfile
:
$ sudo filefrag -v /swapfile
Filesystem type is: ef53
File size of /swapfile is 1425873920 (348114 blocks of 4096 bytes)
ext: logical_offset: physical_offset: length: expected: flags:
0: 0.. 32767: 34816.. 67583: 32768:
1: 32768.. 63487: 67584.. 98303: 30720:
....
इसलिए, मेरे मामले में अतिरिक्त बूट पैरामीटर है resume_offset=34816
। विभाजन से फिर से शुरू करने के लिए आपको अभी भी एक बूट पैरामीटर सेट करने की आवश्यकता है। यह रूट विभाजन होगा (या जो भी विभाजन आपकी स्वैप फ़ाइल पर स्थित है) मेरे पैरामीटर अब हैं:
GRUB_CMDLINE_LINUX_DEFAULT="no_console_suspend initcall_debug resume=/dev/mmcblk1p2 resume_offset=34816"
/dev/mmcblk1p2
मेरा रूट विभाजन कहां है (आपका कुछ होने की संभावना अधिक है /dev/sda2
)।
फिर से शुरू करने के दौरान मैंने छवि को सफलतापूर्वक लोड किया, लेकिन मेरे मामले में (सिर्फ एक उदाहरण - YMMVAPD) फिर कुछ और ड्राइवरों ( i2c_designware
) ने कुछ त्रुटियां फेंक दीं और मुझे फिर से शुरू होने पर एक पूरा सिस्टम फ्रीज हो गया। हाइबरनेशन काम करता है अगर मैं इसके अलावा उन मॉड्यूल को अनलोड करता हूं brcmfmac
, लेकिन सिस्टम उन मॉड्यूल के बिना जल्दी से बेकार हो जाता है। इसलिए मैंने छोटी-छोटी मॉड्यूल्स को उतारने और फिर से उन्हें फिर से शुरू करने के लिए स्क्रिप्ट का एक प्रकार बनाया:
# remove buggy modules
modprobe -r brcmfmac i2c_designware_platform i2c_designware_core &&
# hibernate
echo disk > /sys/power/state
# reinsert
modprobe i2c_designware_core i2c_designware_platform brcmfmac
जब मैं हाइबरनेट करना चाहता हूं, तो मैं दौड़ता हूं sudo bash script
। यह बहुत अच्छा काम करता है।
टी एल; डॉ
सिस्टमड का उपयोग करें, स्वैप से फिर से शुरू करने के लिए बूट पैरामीटर सेट करें, छोटी गाड़ी चालकों की पहचान करें और हाइबरनेशन शुरू करने से पहले उन्हें उतार दें। यदि सिस्टम उन मॉड्यूल के बिना लंबे समय तक काम नहीं कर सकता है या आपको कई उतारने की आवश्यकता है, तो हाइबरनेशन आरंभ करने के लिए एक सरल स्क्रिप्ट का उपयोग करना आसान हो सकता है।