การไฮเบอร์เนตใช้systemctl
และทำให้มันใช้งานได้ในกรณีที่ยากลำบาก
สำหรับฉันpm-hibernate
ล้มเหลวเสมอ หลังจากปรับแต่งบางอย่างฉันก็สามารถจำศีลได้โดยใช้ส่วนต่อประสานของ systemd (ระบบ init ใน 16.04 ขึ้นไป) ฉันจัดการเพื่อให้มันทำงานบน 17.04 ด้วยไฟล์สลับ กรณีศึกษานี้อาจเป็นประโยชน์สำหรับผู้อื่นที่มีปัญหา
ครั้งแรกลอง:
sudo systemctl hibernate
หากสิ่งนั้นล้มเหลวให้เริ่มการแก้ไขปัญหา: ในสถานะไฮเบอร์เนต (HTD หรือ ACPI S4) สถานะของเครื่องจะถูกเขียนลงดิสก์เพื่อไม่ต้องใช้พลังงานในการเก็บรักษาไว้ สถานะถูกเขียนลงในพาร์ติชันสลับหรือไปยังไฟล์สลับ หมายเหตุ: หากใช้ BTRFS อย่าพยายามใช้ไฟล์ swap เนื่องจากอาจทำให้ระบบไฟล์เสียหายได้
พาร์ทิชันสว็อปหรือไฟล์สว็อปของคุณอาจต้องมีขนาดเท่ากับ RAM เพื่อให้จำศีล แต่มีโอกาสที่ดีที่คุณจะสามารถจำศีลถ้ามันเป็นอย่างน้อย 2/5 ขนาดของ RAM ตามหน้าArch วิกิดังนั้นให้ลองทำตามขั้นตอนอื่น ๆ ก่อนที่จะเพิ่มขนาดสวอป
หากปัญหาของคุณคือคุณได้รับคลีนบูตแทนเรซูเม่ที่คาดไว้อย่างน้อยที่สุดคุณจำเป็นต้องตั้งค่าพารามิเตอร์การบู๊ตเพื่อค้นหาดิสก์อิมเมจ
ค้นหาพาร์ติชัน swap ของคุณ:
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
ในการกลับมาทำงานต่อให้กดปุ่มเปิดปิดและระบบจะบูต
หากคุณยังคงมีปัญหาเริ่มการดีบัก
ฉันรวมถึงกรณีของฉันด้านล่างเป็นตัวอย่าง แต่ข้อมูลรายละเอียดเกี่ยวกับการแก้จุดบกพร่อง S รัฐสามารถพบได้ในบล็อกนี้และยังเป็นหนึ่งในนี้
ตั้งค่าพารามิเตอร์การบูตเพิ่มเติมเพื่อรวบรวมข้อมูลเพิ่มเติม ลบquiet
และsplash
เพิ่มinitcall_debug
และno_console_suspend
สิ่งที่จะทำให้การเรียกระบบเริ่มต้นจะถูกพิมพ์ไปยังคอนโซลเพื่อให้คุณสามารถดูสิ่งที่ผิดพลาด ฉันตั้งสิ่งนี้:
GRUB_CMDLINE_LINUX_DEFAULT="resume=/dev/mmcblk0p3 no_console_suspend initcall_debug"
ซึ่งช่วยให้ฉันดูว่าเกิดอะไรขึ้นกับประวัติย่อจากการจำศีล
ในกรณีของฉันหลังจากที่ทำต่อฉันทำ WiFi หายและเคอร์เนลไม่พอใจอย่างชัดเจนเนื่องจากคำสั่งส่วนใหญ่ (เช่นการอ่านอะไรจากการ/sys
โหลดโมดูลหรือsystemctl
คำสั่งใด ๆ) จะไม่ทำงาน - กระบวนการจะเริ่มต้นและหยุด (ทั้งหมดนี้จะเป็น กลับสู่ปกติหลังจากรีบูตแน่นอน) การดูระบบปิดตัวลงอย่างช้า ๆ และอ่านข้อความดีบั๊กทั้งหมดฉันสังเกตว่ามีปัญหามากมายกับ "brcm" ดังนั้นฉันจึงเดาได้ว่าโมดูลไดรเวอร์ไร้สายของ Broadcom คือการตำหนิ ฉันได้ปรับกระบวนการไฮเบอร์เนตของฉันเพื่อยกเลิกการโหลดโมดูลก่อน:
sudo modprobe -r brcmfmac
sudo systemctl hibernate
เมื่อกลับมาฉันใส่โมดูลเข้าไปใหม่
sudo modprobe brcmfmac
และทุกอย่างทำงานได้อย่างสมบูรณ์ ฉันต้องขึ้นบัญชีดำของbtsdio
โมดูลที่ดูเหมือนว่าจะเข้ากันไม่ได้brcmfmac
อัปเดต: ไฮเบอร์เนตโดยใช้ไฟล์ swap ในวันที่ 17.04
อีกครั้งด้วยความช่วยเหลือจากหน้า Arch wiki และการซ่อมแซมเพิ่มเติมฉันจัดการเพื่อให้จำศีลในการทำงานกับ 17.04 ด้วยไฟล์ swap สิ่งนี้ต้องการพารามิเตอร์การบู๊ตเพิ่มเติมโดย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
เมื่อฉันต้องการที่จะจำศีลผมทำงาน มันใช้งานได้ดี
TL; DR
ใช้ systemd ตั้งค่าพารามิเตอร์การบูตสำหรับการดำเนินการต่อจาก swap ระบุไดรเวอร์ buggy และยกเลิกการโหลดพวกเขาก่อนที่จะเริ่มจำศีล หากระบบไม่สามารถทำงานได้เป็นเวลานานหากไม่มีโมดูลเหล่านั้นหรือคุณจำเป็นต้องยกเลิกการโหลดหลาย ๆ ครั้งระบบอาจใช้สคริปต์ง่าย ๆ ในการเริ่มต้นการจำศีล