Hibernasi menggunakan systemctl
dan membuatnya berfungsi dalam kasus sulit
Bagi saya, pm-hibernate
selalu gagal. Setelah beberapa tweak, saya bisa hibernasi menggunakan antarmuka systemd (sistem init di 16.04 ke atas). Saya juga berhasil membuatnya bekerja pada 17,04 dengan file swap. Studi kasus ini mungkin bermanfaat bagi orang lain yang bermasalah.
Percobaan pertama:
sudo systemctl hibernate
Jika gagal, mulai pemecahan masalah: dalam kondisi hibernasi (HTD atau ACPI S4) status mesin ditulis ke disk sehingga tidak diperlukan daya untuk melestarikannya. Status ditulis baik untuk partisi swap atau file swap. Catatan: jika menggunakan BTRFS JANGAN mencoba menggunakan file swap karena ini dapat menyebabkan kerusakan sistem file
Partisi swap atau file swap Anda mungkin harus memiliki ukuran yang sama dengan RAM untuk memungkinkan hibernasi, tetapi ada kemungkinan Anda dapat melakukan hibernasi jika setidaknya 2/5 ukuran RAM, menurut halaman Arch wiki , jadi coba langkah lain terlebih dahulu sebelum menambah ukuran swap.
Jika masalah Anda adalah Anda mendapatkan boot bersih alih-alih resume yang diharapkan, minimal Anda kemungkinan besar perlu mengatur parameter boot untuk menemukan image disk
Temukan partisi swap Anda:
grep swap /etc/fstab
bagi saya pengembalian ini (output parsial)
# swap was on /dev/mmcblk0p3 during installation
di mana /dev/mmcblk0p3
partisi untuk ditentukan
Tambahkan parameter boot:
sudoedit /etc/default/grub
Ke baris mulai GRUB_CMDLINE_LINUX_DEFAULT
tambahkan resume=/dev/YourSwapPartition
ke bagian dalam tanda kutip (ganti dengan partisi yang Anda identifikasi sebelumnya). Menggunakan contoh saya:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash resume=/dev/mmcblk0p3"
Setiap kali Anda mengubah file ini, Anda harus menjalankan sudo update-grub
atau perubahan tidak akan berpengaruh.
Sekarang Anda perlu reboot. Kemudian Anda dapat mencoba hibernasi, dengan mengeluarkan perintah:
sudo systemctl hibernate
Untuk melanjutkan, tekan tombol daya dan sistem akan boot.
Jika Anda masih memiliki masalah, mulailah debugging.
Saya menyertakan kasus saya di bawah ini sebagai contoh, tetapi informasi terperinci tentang status S debugging dapat ditemukan di blog ini dan juga yang ini .
Tetapkan beberapa parameter boot lagi untuk mengambil lebih banyak informasi. Hapus quiet
dan splash
tambahkan initcall_debug
dan no_console_suspend
yang akan menyebabkan panggilan sistem init dicetak ke konsol sehingga Anda dapat menonton apa yang salah. Saya mengatur ini:
GRUB_CMDLINE_LINUX_DEFAULT="resume=/dev/mmcblk0p3 no_console_suspend initcall_debug"
Yang membantu saya melihat apa yang salah pada resume dari hibernasi.
Dalam kasus saya, setelah melanjutkan saya kehilangan WiFi, dan kernel jelas kesal karena sebagian besar perintah (misalnya membaca apa pun dari /sys
, memuat ulang modul atau systemctl
perintah apa pun ) tidak akan berfungsi - proses akan muncul untuk memulai dan hanya hang (semua ini akan menjadi kembali normal setelah reboot tentu saja). Melihat sistem yang sangat lambat dimatikan dan membaca semua pesan debug, saya perhatikan ada banyak masalah dengan "brcm", jadi saya kira modul driver nirkabel Broadcom saya yang harus disalahkan. Tentu saja saya menyesuaikan prosedur hibernasi saya untuk menurunkan modul terlebih dahulu:
sudo modprobe -r brcmfmac
sudo systemctl hibernate
pada resume saya masukkan kembali modul
sudo modprobe brcmfmac
Dan semuanya bekerja dengan sempurna. Saya juga harus daftar hitam btsdio
modul yang tampaknya tidak kompatibel denganbrcmfmac
Pembaruan: Hibernasi menggunakan file swap pada 17.04.
Sekali lagi dengan bantuan dari halaman Arch wiki dan beberapa mengutak-atik tambahan, saya berhasil mendapatkan hibernasi untuk bekerja pada 17,04 dengan file swap. Ini membutuhkan parameter boot tambahan, di resume_offset=n
mana n adalah angka pertama physical_offset
dalam output dari 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:
....
Oleh karena itu, parameter boot tambahan dalam kasus saya adalah resume_offset=34816
. Anda masih perlu mengatur parameter boot untuk melanjutkan partisi. Ini akan menjadi partisi root (atau partisi apa pun tempat file swap Anda berada) Parameter saya sekarang:
GRUB_CMDLINE_LINUX_DEFAULT="no_console_suspend initcall_debug resume=/dev/mmcblk1p2 resume_offset=34816"
Di mana /dev/mmcblk1p2
partisi root saya (milik Anda lebih cenderung seperti itu /dev/sda2
).
Selama resume saya melihat pemuatan gambar berhasil, tetapi dalam kasus saya (hanya sebuah contoh - YMMVAPD) maka beberapa driver lagi ( i2c_designware
) melemparkan beberapa kesalahan dan saya mendapatkan sistem yang lengkap membeku pada resume. Hibernasi berfungsi jika saya membongkar modul-modul itu di samping brcmfmac
, tetapi sistem dengan cepat menjadi tidak dapat digunakan tanpa modul-modul itu. Karena itu saya membuat semacam skrip untuk membongkar modul kereta dan segera memasukkannya kembali di resume:
# 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
Ketika saya ingin hibernasi, saya jalankan sudo bash script
. Ini sangat bagus.
TL; DR
Gunakan systemd, atur parameter boot untuk melanjutkan dari swap, identifikasi driver kereta dan unload mereka sebelum memulai hibernasi. Jika sistem tidak dapat bekerja lama tanpa modul-modul itu atau Anda perlu membongkar beberapa modul, mungkin lebih mudah menggunakan skrip sederhana untuk memulai hibernasi.