Hibernuj i wznów z pliku wymiany

23

Skonfigurowałem nową instalację Ubuntu w Notatniku, aby używała pliku wymiany zamiast partycji wymiany.

Domyślnie nie jest możliwe przejście systemu Ubuntu w tryb hibernacji przy użyciu pliku wymiany, więc wypróbowałem ten samouczek , ale jest on specyficzny dla grub1 , a Ubuntu używa teraz grub2 .

Czy ktoś wie jak to zrobić?

tfmoraes
źródło

Odpowiedzi:

21

Hibernuj z plikiem wymiany za pomocą uswusp

Chociaż możliwe jest przełączenie pliku w stan hibernacji i podobno działa on z hibernacją systemd poprzez ustawienie parametrów jądra. Nie mogłem jednak go wznowić, więc zamiast tego przełączyłem się na użycie uswsusp (zawieszenie oprogramowania przestrzeni użytkownika) . Oto kroki, których użyłem na Ubuntu 17.04 / 17.10.

Utwórz plik wymiany

Polecenia utworzenia sformatowanego pliku wymiany 4GiB, zamontowanego i dodanego do /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

Sprawdź partycję wymiany pliku

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

Zainstaluj oprogramowanie Userspace Software Suspend (uswsusp)

sudo apt install uswsusp

Skonfiguruj uswsusp

Aby utworzyć /etc/uswsusp.confi odtworzyć initramfs:

sudo dpkg-reconfigure -pmedium uswsusp
  • YesKontynuować bez ważnej przestrzeni wymiany? (Kreator nie ustawił jeszcze pliku wymiany).
  • Wybierz partycję , na której znajduje się plik wymiany, odsyłając do szczegółów z findmntgóry. ( Uwaga: nie sam plik wymiany )

Uwaga: Wszelkie ręcznie wprowadzone zmiany /etc/uswsusp.confbędą wymagały initramfspóźniejszego odtworzenia za pomocą tego polecenia:

sudo update-initramfs -u

Przetestuj hibernację uswusp

sudo s2disk

Po snapshothibernacji powinny pojawić się komunikaty na ekranie i wznowić.

Użyj s2disk z hibernacją systemd

Domyślnie systemd użyje własnych poleceń hibernacji, więc zamień je na polecenia uswusp, zastępując systemd-hibernate.service:

sudo systemctl edit systemd-hibernate.service

W otwartym edytorze tekstu umieść następujący tekst (wymagany jest pusty ExecStart). Następnie zapisz i wyjdź:

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

Spowoduje to utworzenie /etc/systemd/system/systemd-hibernate.service.d/override.confpliku ze szczegółami zastąpienia.

Testuj hibernację systemową:

systemctl hibernate 

Uwaga: Aby sprawdzić, czy systemd override.confzostał utworzony, załadowany i nie zawiera błędów, uruchom:

systemctl status systemd-hibernate.service

Referencje:

Cas
źródło
Ta instrukcja wydaje się działać, ale hibernacja systemowa nie działa dla mnie. Czy przetestowałeś to samodzielnie? Powinno to ExceStart=run-parts -a post /lib/systemd/system-sleepbyćExceStartPost=run-parts -a post /lib/systemd/system-sleep
Joaquín Aramendía
Został przetestowany i działa, ale być może ten dodatek jest potrzebny. Zaktualizowałem swoją odpowiedź.
Cas
To nie wygląda całkiem dobrze. enableMożliwość systemctl dowiązania od /etc/systemd/system/celu /lib/systemd/system/. Nigdy nie powinieneś kopiować bezpośrednio do/etc/systemd/system/
Auspex
1
Nie udało mi się sprawić, by to działało 😞. Skonfigurowałem plik wymiany, zainstalowałem i skonfigurowałem uswsusp, ale sudo s2disktylko loguje Saving snapshot, niż wyłącza wyświetlacz, zawiesza się na ~ 5 minut, a następnie wyłącza komputer. Jednak po włączeniu uruchamia się normalnie, jakby nie było hibernacji.
m93a,
1
Myślę, że ten wiersz sudo findmnt -no SOURCE,UUID -T /mnt/4GiB.swappowinien zostać zmieniony nasudo findmnt -no SOURCE,UUID -T /swapfile
user1915011
12

Oto, co zrobiłem, aby działało z Ubuntu 18.04.

  • Upewnij się, że /swapfilemasz przynajmniej rozmiar pamięci RAM

    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
    
  • Zanotuj identyfikator UUID partycji zawierającej /swapfile:

    $ sudo findmnt -no SOURCE,UUID -T /swapfile
    /dev/nvme0n1p5 20562a02-cfa6-42e0-bb9f-5e936ea763d0
    
  • Ponownie skonfiguruj pakiet uswsusp, aby poprawnie używać pliku wymiany:

    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"
    
  • Edytuj usługę hibernacji SystemD za pomocą sudo systemctl edit systemd-hibernate.servicei wypełnij ją następującą treścią:

    [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
    
  • Zwróć uwagę na przesunięcie wznowienia swojego /swapfile:

    $ sudo swap-offset /swapfile
    resume offset = 34818
    
  • Skonfiguruj Gruba, aby wznowił pracę z pliku wymiany, edytując /etc/default/grubi modyfikując następujący wiersz:

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

    sudo update-grub
    
  • Utwórz następujące elementy /etc/initramfs-tools/conf.d/resume:

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

    sudo update-initramfs -u -k all
    

Teraz możesz hibernować sudo systemctl hibernate.

Można również utworzyć te skrypty:

    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

Możesz więc spać gotosleeplub hibernować gotohibernation.

Musisz być w stanie wykonać sudo s2both, sudo s2rami sudo systemctl hibernatebez konieczności podawania hasła do poprzednich skryptów do pracy.

Możesz to zrobić na przykład, tworząc powerdevgrupę, dodając do niej bieżącego użytkownika i konfigurując następującą konfigurację sudoers (edytuj ją sudo visudo -f /etc/sudoers.d/powerdev):

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

Wykorzystana dokumentacja:

Anthony O.
źródło
Dziękuję Ci za to! Wypróbowałem wiele metod, ale tylko Twoja działa dla mnie na Ubuntu 18.04 :)
jirislav
To prawie sprawia, że ​​mam ochotę ponownie spróbować hibernacji - miałem problem z sporadycznym uszkodzeniem na moich dyskach, co najwyraźniej było związane z procesem hibernacji. Czy napotkałeś coś takiego?
Charles Green
Dziękuję, @Anthony! Próbowałem tylu rzeczy, aby hibernacja zadziałała. Twoje było ostatecznym rozwiązaniem. Wydaje mi się bardzo dziwne, że nie jest to od razu poprawnie skonfigurowane. :(
Mike Williamson,
Dzięki za ten przewodnik. Po wykonaniu kroków, a następnie próbie hibernacji za pomocą $ sudo systemctl hibernacja, mój laptop budzi się kilka sekund po próbie hibernacji. / var / log / syslog pokazuje wiele błędów, ale te wydają się najbardziej istotne: - Nie udało się ustawić trybu oszczędzania energii dla wyjścia eDP-1: Odmowa uprawnień ... - Obiekt .Gjs_AppIndicatorIconActor__1 (0x561c60a4d150), został już sfinalizowany. Nie można ustawić dla niego żadnej właściwości. ... - s2disk: Nie można użyć wznawiania urządzenia (spróbuj swapon -a). Powód: Brak takiego urządzenia - systemd-hibernate.service: Proces główny zakończony, kod = zakończony, ...
Jelani Nelson
1
To jedyne rozwiązanie, które działało dla mnie. Zalogowano się, aby głosować na tę odpowiedź. Dzięki.
dpetrini,
8

Szybko przeczytałem samouczek i, jeśli dobrze zrozumiałem, wystarczy podać resumeopcje wiersza polecenia systemu Linux. Z Grub2 jest naprawdę prosty, a twoje zmiany zawsze zostaną zachowane. Musisz edytować /etc/default/grubplik, w szczególności ten wiersz:

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

Następnie biegnij, sudo update-grubaby zmiany zostały wprowadzone.

Zmiana GRUB_CMDLINE_LINUXnie wpłynie na inne instalacje Linuksa (ponieważ /etc/grub.d/30_os-probernie używa tej zmiennej).

O twoim problemie: czy partycja pliku wymiany jest zaszyfrowana? Jeśli tak, hibernacja nie będzie działać. Jeśli nie, wynik filefrag -v /swapfilemoże być pomocny.

Andrea Corbellini
źródło
Dzięki! Spróbuję. Ale myślę, że konfiguruje wszystkie wpisy linuksa w grub z tą linią.
tfmoraes
Nie zapomnij: po zmianie /etc/default/grubmusisz biec update-grub.
JanC
@tfmoraes: dlaczego nie chcesz tego dodawać do wszystkich pozycji linuxa?
JanC
@JanC: Ponieważ mogę mieć zainstalowane inne dystrybucje Linuksa.
tfmoraes
1
@ didi_X8 ten komentarz został napisany 8 lat temu. Możliwe, że od tego czasu wszystko się zmieniło. Dzięki za udostępnienie.
Andrea Corbellini,