Hibernasi dan lanjutkan dari file swap

23

Saya telah mengonfigurasi instalasi Ubuntu baru di Notebook untuk menggunakan file swap, alih-alih menggunakan partisi swap.

Secara default tidak memungkinkan Ubuntu untuk hibernasi menggunakan file swap, jadi saya mencoba tutorial ini , tetapi khusus untuk grub1 , dan Ubuntu sekarang menggunakan grub2 .

Adakah yang tahu bagaimana melakukan ini?

tfmoraes
sumber

Jawaban:

21

Hibernasi dengan file Swap menggunakan uswusp

Meskipun dimungkinkan untuk melakukan hibernate untuk menukar file dan itu seharusnya bekerja dengan systemd hibernate dengan mengatur parameter kernel. Namun, saya tidak dapat melanjutkannya, alih-alih beralih menggunakan uswsusp (menangguhkan perangkat lunak userspace) . Berikut adalah langkah-langkah yang saya gunakan di Ubuntu 17.04 / 17.10.

Buat File Swap

Perintah untuk membuat file swap 4GiB yang diformat, dipasang dan ditambahkan ke /etc/fstab:

sudo fallocate -l 4g /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile swap swap defaults 0 0' | sudo tee -a /etc/fstab

Verifikasi Partisi File Swap

sudo findmnt -no SOURCE,UUID -T /swapfile
> /dev/sda1 11cc33ee-1234-abcd-1234-ddeeff112233

Instal Penangguhan Perangkat Lunak Userspace (uswsusp)

sudo apt install uswsusp

Konfigurasikan uswsusp

Untuk membuat /etc/uswsusp.confdan membuat ulang initramfs:

sudo dpkg-reconfigure -pmedium uswsusp
  • Yesuntuk ' Lanjutkan tanpa ruang swap yang valid? ' (Wizard belum menyetel file swap.)
  • Pilih partisi tempat file swap berada, referensi silang dengan detail dari findmntatas. ( Catatan: bukan file swap itu sendiri )

Catatan: Setiap perubahan yang dilakukan secara manual /etc/uswsusp.confakan membutuhkan pembuatan ulang initramfssetelahnya dengan perintah ini:

sudo update-initramfs -u

Uji menggunakan hibernasi

sudo s2disk

Seharusnya ada snapshotpesan di layar saat hibernasi dan lanjutkan.

Gunakan s2disk dengan systemd hibernate

Secara default systemd akan menggunakan perintah hibernate miliknya sendiri, jadi gantilah dengan perintah uswusp dengan mengganti systemd-hibernate.service:

sudo systemctl edit systemd-hibernate.service

Di editor teks yang terbuka masukkan teks berikut (ExecStart kosong diperlukan). Kemudian simpan dan keluar:

[Service]
ExecStart=
ExecStart=/usr/sbin/s2disk 
ExecStartPost=/bin/run-parts -a post /lib/systemd/system-sleep

Ini akan membuat /etc/systemd/system/systemd-hibernate.service.d/override.conffile dengan menimpa detail.

Test systemd hibernate:

systemctl hibernate 

Catatan: Untuk memeriksa apakah systemd override.conftelah dibuat, dimuat dan tidak ada kesalahan, jalankan:

systemctl status systemd-hibernate.service

Referensi:

Cas
sumber
Instruksi ini tampaknya berfungsi tetapi hibernasi systemd tidak berfungsi untuk saya. Sudahkah Anda menguji ini sendiri? Jika hal ini ExceStart=run-parts -a post /lib/systemd/system-sleepmenjadiExceStartPost=run-parts -a post /lib/systemd/system-sleep
Joaquín Aramendia
Sudah diuji dan berfungsi, tetapi mungkin penambahan itu diperlukan. Saya telah memperbarui jawaban saya.
Cas
Ini kelihatannya tidak benar. The enablepilihan untuk systemctl symlink dari /etc/systemd/system/ke /lib/systemd/system/. Anda tidak boleh menyalin secara langsung ke/etc/systemd/system/
Auspex
1
Saya tidak berhasil membuat ini berfungsi 😞. Saya mengatur swapfile, menginstal dan mengkonfigurasi uswsusp, tetapi sudo s2diskhanya log Saving snapshot, daripada mematikan layar, hang selama ~ 5 menit dan kemudian dimatikan komputer. Namun setelah saya nyalakan, boot secara normal seperti tidak ada hibernasi.
m93a
1
Saya pikir baris ini sudo findmnt -no SOURCE,UUID -T /mnt/4GiB.swapharus diubah menjadisudo findmnt -no SOURCE,UUID -T /swapfile
user1915011
12

Inilah yang saya lakukan untuk membuatnya bekerja dengan Ubuntu 18.04.

  • Jadikan Anda /swapfilememiliki setidaknya ukuran RAM Anda

    sudo swapoff /swapfile
    sudo dd if=/dev/zero of=/swapfile bs=$(cat /proc/meminfo | grep MemTotal | grep -oh '[0-9]*') count=1024 conv=notrun
    sudo mkswap /swapfile
    sudo swapon /swapfile
    
  • Perhatikan UUID partisi yang berisi /swapfile:

    $ sudo findmnt -no SOURCE,UUID -T /swapfile
    /dev/nvme0n1p5 20562a02-cfa6-42e0-bb9f-5e936ea763d0
    
  • Konfigurasikan ulang paket uswsuspuntuk menggunakan swapfile dengan benar:

    sudo dpkg-reconfigure -pmedium uswsusp
    # Answer "Yes" to continue without swap space
    # Select "/dev/disk/by-uuid/20562a02-cfa6-42e0-bb9f-5e936ea763d0" replace the UUID with the result from the previous findmnt command
    # Encrypt: "No"
    
  • Edit layanan hibernasi SystemD menggunakan sudo systemctl edit systemd-hibernate.servicedan isi dengan konten berikut:

    [Service]
    ExecStart=
    ExecStartPre=-/bin/run-parts -v -a pre /lib/systemd/system-sleep
    ExecStart=/usr/sbin/s2disk
    ExecStartPost=-/bin/run-parts -v --reverse -a post /lib/systemd/system-sleep
    
  • Perhatikan resume resume Anda /swapfile:

    $ sudo swap-offset /swapfile
    resume offset = 34818
    
  • Konfigurasikan Grub untuk melanjutkan dari swapfile dengan mengedit /etc/default/grubdan memodifikasi baris berikut:

    GRUB_CMDLINE_LINUX_DEFAULT="resume=UUID=20562a02-cfa6-42e0-bb9f-5e936ea763d0 resume_offset=34818 quiet splash"
    
  • Perbarui Grub:

    sudo update-grub
    
  • Buat yang berikut ini /etc/initramfs-tools/conf.d/resume:

    RESUME=UUID=20562a02-cfa6-42e0-bb9e-5e936ea763d0 resume_offset=34816
    # Resume from /swapfile
    
  • Perbarui initramfs:

    sudo update-initramfs -u -k all
    

Sekarang Anda dapat berhibernasi dengan sudo systemctl hibernate.

Anda juga dapat membuat skrip tersebut:

    sudo tee /usr/local/bin/gotosleep <<EOF
    dbus-send --type=method_call --dest=org.gnome.ScreenSaver /org/gnome/ScreenSaver org.gnome.ScreenSaver.Lock
    sleep 2
    sudo /usr/sbin/s2both
    EOF
    sudo chmod +x /usr/local/bin/gotosleep
    sudo tee /usr/local/bin/gotohibernation <<EOF
    dbus-send --type=method_call --dest=org.gnome.ScreenSaver /org/gnome/ScreenSaver org.gnome.ScreenSaver.Lock
    sleep 2
    sudo systemctl hibernate
    EOF
    sudo chmod +x /usr/local/bin/gotohibernation

Jadi Anda bisa tidur dengan gotosleepatau berhibernasi dengan gotohibernation.

Anda harus dapat mengeksekusi sudo s2both, sudo s2ramdan sudo systemctl hibernatetanpa harus memasukkan kata sandi Anda agar skrip sebelumnya berfungsi.

Anda dapat melakukannya misalnya dengan membuat powerdevgrup, menambahkan pengguna Anda saat ini ke dalamnya, dan mengkonfigurasi konfigurasi sudoers berikut (edit dengan sudo visudo -f /etc/sudoers.d/powerdev):

     %powerdev ALL=NOPASSWD: /usr/sbin/s2both, /usr/sbin/s2ram, /bin/systemctl hibernate

Dokumentasi yang digunakan:

Anthony O.
sumber
Terima kasih untuk ini! Saya sudah mencoba banyak metode, tetapi hanya milik Anda yang bekerja untuk saya di Ubuntu 18.04 :)
jirislav
Ini hampir membuat saya merasa ingin mencoba hibernasi lagi - saya punya masalah dengan korupsi sesekali pada disk saya, yang tampaknya terkait dengan proses hibernasi. Pernahkah Anda mengalami hal seperti itu?
Charles Green
Terima kasih, @Anthony! Saya mencoba banyak hal agar hibernate bekerja. Milikmu adalah solusi terakhir yang berhasil. Rasanya sangat aneh bagi saya bahwa ini tidak langsung diatur dengan benar. :(
Mike Williamson
Terima kasih untuk panduan ini. Setelah mengikuti langkah-langkah lalu mencoba hibernasi menggunakan $ sudo systemctl hibernate, laptop saya bangun beberapa detik setelah mencoba hibernasi. / var / log / syslog menunjukkan banyak kesalahan, tetapi ini tampaknya yang paling relevan: - Gagal mengatur mode hemat daya untuk output eDP-1: Izin ditolak ... - Obyek .Gjs_AppIndicatorIconActor__1 (0x561c60a4d150), telah selesai. Tidak mungkin mengatur properti apa pun padanya. ... - s2disk: Tidak dapat menggunakan perangkat resume (coba swapon -a). Alasan: Tidak ada perangkat seperti itu - systemd-hibernate.service: Proses utama keluar, kode = keluar, ...
Jelani Nelson
1
Ini adalah satu-satunya solusi yang berhasil untuk saya. Masuk hanya untuk mengunggah jawaban ini. Terima kasih.
dpetrini
8

Saya telah memberikan bacaan cepat ke tutorial dan, jika saya mengerti dengan benar, Anda hanya perlu menentukan resumeopsi untuk baris perintah Linux. Dengan Grub2 sangat sederhana, dan perubahan Anda akan selalu dipertahankan. Anda perlu mengedit /etc/default/grubfile, khususnya baris ini:

GRUB_CMDLINE_LINUX="resume=... resume_offset=..."

Setelah itu, jalankan sudo update-grubagar perubahan diterapkan.

Mengubah GRUB_CMDLINE_LINUXtidak akan memengaruhi instalasi Linux lain yang Anda miliki (karena /etc/grub.d/30_os-probertidak menggunakan variabel ini).

Tentang masalah yang Anda alami: apakah partisi swapfile dienkripsi? Jika demikian, hibernasi tidak akan berfungsi. Jika tidak, maka output dari filefrag -v /swapfiledapat membantu.

Andrea Corbellini
sumber
Terima kasih! Saya akan mencoba. Tapi saya pikir itu mengkonfigurasi semua entri linux di grub dengan baris ini.
tfmoraes
Jangan lupa: setelah mengubah /etc/default/grubAnda harus menjalankan update-grub.
JanC
@ tfmoraes: mengapa Anda tidak ingin ini ditambahkan ke semua entri linux?
JanC
@JanC: Karena saya mungkin sudah menginstal distribusi Linux lainnya.
tfmoraes
1
@ didi_X8 komentar itu ditulis 8 tahun yang lalu. Mungkin saja hal-hal telah berubah sejak saat itu. Terima kasih telah berbagi.
Andrea Corbellini