Ubuntu 18.04 nie może zostać wznowiony po hibernacji


17

Hibernacja działała poprawnie, gdy korzystałem z Ubuntu 17.04. Po aktualizacji do 17.10 nie mogłem wznowić pracy z powodu czarnego ekranu po wznowieniu ( ten błąd ).

Po aktualizacji do 18.04, jeśli spróbuję uruchomić komputer po hibernacji, uruchamia się, jakby hibernacja nie została wykonana.


Mam ten sam problem z 18.04, myślę, że rozwiązaniem musi być określenie właściwej partycji do wznowienia, ale wciąż nie mogę znaleźć sposobu, aby to zrobić. Wszystko, co znalazłem, że Google dla mnie nie działało.
user2819650

Partycja jest ustawiona poprawnie w /etc/initramfs-tools/conf.d/resume do mojej wymiany. Podejrzewam, że hibernacja nie została wykonana poprawnie lub wznowienie podczas rozruchu nie działa. Ale nie wiem, jak dalej to debugować. Syslog i dmesg nie dają żadnych wskazówek co do problemu.
Kamil

Odpowiedzi:


29

Wprowadzono zmiany w ustawieniach domyślnych w porównaniu z poprzednim LTS (16.04). W moim przypadku hibernacja nie działała, dopóki nie zrobiłem kilku kroków, między innymi zwiększyłem rozmiar pliku wymiany, włączyłem go, upewniłem się, że pozwalają na to zasady itp.

To może być moja najdłuższa odpowiedź na całej StackExchange, więc starałem się, aby nagłówki były opisowe .

Buty, ponieważ nie było hibernacji

Rozsądnie byłoby przejrzeć swoje dzienniki ( dmesgmoże pomóc) i sprawdzić, czy coś tam jest. Istnieją powody, dla których pomimo nakazania systemowi hibernacji, tak naprawdę nie chce lub zamiast tego zawiesi się w pamięci RAM (uśpienie).

Spojrzenie kern.logi syslogposzukiwanie wiadomości związanych z hibernacją również nie zaszkodzi. Sekcje zaczynające się od „problemu” mogą pomóc w określonych problemach.

Zamień plik lub partycję wymiany

Jedną z kluczowych zmian jest to, że teraz NIE MASZ partycji wymiany, ale masz PLIK wymiany.

Plik wymiany może nie działać w przypadku połączenia sprzętu / sterowników / systemu operacyjnego i hibernacji.

Hibernacja została wyłączona

Zasady mogą również wyłączać lub blokować hibernację.

Żargon

Suspend to RAM - RAM przechowuje dane, komputer idzie spać szybciej, zużywa więcej energii po zawieszeniu, budzi się szybciej. Niektórzy nazywają to snem.

Zawieś na dysk - aka hibernacji. Pamięć RAM jest zapisywana do wymiany (partycja lub plik), komputer idzie spać wolniej, zużywa mniej energii podczas hibernacji, budzi się wolniej.

Suspend-to-RAM w Linuksie autorstwa Rafaela J. Wysockiego i A. Leonarda Browna

Wymagania wstępne - czy masz wystarczająco dużo miejsca?

Aby przejść w stan hibernacji, musisz (tutaj uproszczenie) zapisać całą pamięć RAM na dysku twardym. Musisz więc zarezerwować wystarczająco dużo miejsca, aby to zrobić. Jeśli tego nie zrobisz, to się nie powiedzie i nie zahibernujesz.

  1. free -m powie ci, ile masz pamięci, ile używasz i ile jest w swapie.
  2. df -h powie ci, ile masz miejsca na dysku w każdym punkcie montowania i ile zużywasz, za darmo itp. Jest to ważne, ponieważ możesz później określić, gdzie będzie znajdować się plik wymiany, lub którą partycję „przyciąć”, aby mieć wystarczająco dużo miejsca na wymianę.
  3. cat fstabpowinien podać informacje, jeśli masz partycję lub plik wymiany. Według Ubuntu Hibernation FAQ swapfilenie zawsze działa z niektórymi kombinacjami sprzętu / sterowników.

Jeśli nie masz wystarczającej ilości miejsca, postępuj zgodnie z często zadawanymi pytaniami dotyczącymi wymiany Ubuntu . Mówi ci, jak zwiększyć plik wymiany, dodać kolejny, sprawdzić, czy jest używany itp. Z poleceniami i objaśnieniami. Naprawdę fajny zasób.

Nie mam wystarczającej ilości miejsca, aby zmieścić się w mojej pamięci RAM!

Dokumenty jądra mówią:

/ sys / power / image_size kontroluje rozmiar obrazu utworzonego przez mechanizm zawieszenia na dysk. Można zapisać ciąg reprezentujący nieujemną liczbę całkowitą, która będzie używana jako górna granica wielkości obrazu w bajtach. Mechanizm zawieszenia na dysk dołoży wszelkich starań, aby rozmiar obrazu nie przekroczył tej liczby. Jeśli jednak okaże się to niemożliwe, i tak spróbuje zawiesić, używając najmniejszego możliwego obrazu. W szczególności, jeśli do tego pliku zostanie zapisane „0”, obraz zawieszenia będzie tak mały, jak to możliwe. Odczyt z tego pliku wyświetli bieżący limit rozmiaru obrazu, który jest domyślnie ustawiony na 2/5 dostępnej pamięci RAM.

Spróbuj zmodyfikować rozmiar obrazu. Jak - zadaj kolejne pytanie.

Wymagania wstępne - czy twoje jądro obsługuje zawieszanie na dysk?

Jądro obsługuje wszystko, co jest wymienione /sys/power/state, więc:

cat /sys/power/state

Dozwolone (według mojej wiedzy) pozycje nie obejmują: mem, standby, freeze, disk. Wyjaśnienie:

  • mem- ma kilka znaczeń, które dokładnie znajdziesz w swoim systemie cat /sys/power/mem_sleep. Mam:s2idle [deep]
  • standby - Zawieszenie po włączeniu zasilania (jeśli jest obsługiwane)
  • freeze - Suspend To Idle (STI)
  • disk- Suspend To Disk (STD), hibernacja . To - chcesz.

Następnie musimy sprawdzić cat /sys/power/disk. Jeśli tak, disabledto zanurz się w BIOSie, szukając Bezpiecznego rozruchu - to jedyny pomysł, jaki mogę zaoferować i jedyne, co wiem, może przeszkadzać i wyłączać hibernację. Chociaż znam tylko SecureBoot, mogą występować inne zakłócenia, więc spojrzenie na BIOS jest dobrym pomysłem, nawet jeśli nie masz żadnego „bezpiecznego rozruchu”.

Czytanie tutaj:

  1. Dokumentacja jądra
  2. Debian Wiki o hibernacji

TBH, nawet jeśli twoje jądro NIE obsługuje hibernacji, możesz spróbować w inny sposób, przewiń w dół do sekcjiInterfaces .

Przeczytaj to - ostrzeżenia i problemy - bez BTRFS

W szczególnej kolejności:

  1. Nie wszystkie chipsety będą działać (nie mam źródeł, które mogę tu przytoczyć, więc powiedzmy, że to jest pogłoska)
  2. VAIO ma problemy, podobno jest flaga, aby im przeciwdziałać
  3. SecureBoot jest często cytowany jako zakłócający lub wyłączający hibernację
  4. Funkcja Wake-on-LAN zużywa energię nawet podczas hibernacji
  5. Liczba modułów (szczególnie grafiki) może zostać zainicjalizowana PRZED wznowieniem działania systemu ze stanu hibernacji - jest to zwykle przyczyną czarnego ekranu po wznowieniu . Zajrzyj na ArchLinux Wiki, aby uzyskać wskazówki dotyczące debugowania problemów. Sugeruję również FAQ Ubuntu na temat problemów z hibernacją. Przeglądanie błędów Launchpad może również przynieść rezultaty. IIRC, istnieje parametr jądra określający w sekundach opóźnienie przed wznowieniem.
  6. Zezwolenie na procedurę hibernacji różni się dla różnych wersji Polkit

Nie używaj BTRFS i hibernacji: wynikiem będą uszkodzone dane.

Chcę hibernować - partycja wymiany

Zdarzają się przypadki, gdy ludzie rezygnują z wymiany plików i wracają do partycji wymiany. W końcu działało na poprzednich LTS. Nie próbowałem, więc nie oferuję wskaźników.

Chcę hibernować - z plikiem wymiany

  1. Upewnij się, że masz wystarczająco dużo miejsca. Często zadawane pytania dotyczące wymiany Ubuntu mówią ci, ile potrzebujesz, również powyższe polecenia. Jeśli potrzebujesz więcej informacji tutaj, zadaj kolejne pytanie, ponieważ jest to długi temat.
  2. Zwiększ plik wymiany lub utwórz nowy o wystarczającej wielkości (preferowane, zgadzam się z @muru ) i zmień /etc/fstabna nowy. Uruchom ponownie, aby zobaczyć, że zmiana została podjęta dobrze (przechowuj kopię zapasową fstab, abyś mógł ją łatwo przywrócić na wszelki wypadek.
  3. Skieruj na to swoje jądro odpowiednimi parametrami, aby wiedział, skąd wznowić.
  4. Zaktualizuj / ponownie skonfiguruj moduł ładujący i uruchom ponownie.

Parametry jądra? Straszny!

Przeczytaj uważnie i zdecyduj, czy chcesz to zrobić, ale jest to tylko sposób na skonfigurowanie jądra. Hibernacja może być łatwiejsza za pomocą systemdi uswsusp(patrz Interfejsy poniżej). Może się zdarzyć, że ty - tak jak ja - ostatecznie zdecydujesz, że wystarczające jest zawieszenie do pamięci RAM i nie chcesz mieć 32 GB na pliku wymiany (na przykład nie jest to świetne dla osób z jednym dyskiem SSD w swoich laptopach). Ale!

  1. hibernacja do pliku wymiany wymaga resume=znajomości partycji, na której znajduje się plik wymiany oraz resume_offset=wiedzy o tym, w którym miejscu pliku wymiany można rozpocząć wznawianie.
  2. hibernacja do partycji wymaga resume=wskazania do zamiany partycji.
  3. rozwiązanie problemów z czarnym ekranem może wymagać resumedelay=.

Dokumentacja jądra dotycząca opóźniania wznowienia działania ze stanu hibernacji:

resumedelay = [HIBERNATION] Opóźnij (w sekundach) pauzę przed próbą odczytania plików CV

Wymagane parametry pliku wymiany i hibernacji :

resume = [SWSUSP]

      Specify the partition device for software suspend

      Format:

      {/dev/<dev> | PARTUUID=<uuid> | <int>:<int> | <hex>}

resume_offset = [SWSUSP]

      Specify the offset from the beginning of the partition
      given by "resume=" at which the swap header is located,
      in <PAGE_SIZE> units (needed only for swap files).

      See Documentation/power/swsusp-and-swap-files.txt

Do resume=wyboru ten sam styl, w jakim rootma element fstab. Tak więc albo /dev/sdaXalbo UUIDalbo LVM. W przypadku hibernacji do pliku - podaj partycję, na której znajduje się plik.

Czytanie:

  1. https://www.kernel.org/doc/Documentation/admin-guide/kernel-parameters.txt
  2. https://wiki.archlinux.org/index.php/Kernel_parameters

Problem - nie znaleziono nagłówka wymiany

Plik wymiany musi być poprawnie sformatowany. Jeśli dzienniki to mówią, oznacza to, że próbujesz hibernować do pliku lub parametr wznowienia jest nieprawidłowy.

Przełącz na partycję lub napraw plik lub zmień interfejs używany do hibernacji.

Zobacz: /unix/43508/debian-hibernate-problem-pm-swap-header-not-found

mkswapsłuży do formatowania pliku, czytaj więcej na ten temat tutaj

Problem! Hibernacja nie jest dozwolona!

Przetestuj: pm-hibernate(jeśli pakiet pm-utils jest zainstalowany) lub systemctl hibernatepowiedz, że nie masz pozwolenia. Domyślne ustawienie w Ubuntu od IIRC 12.04.

Rozwiązanie: zależy od wersji Polkit, wersji Ubuntu i smaku ... Zobacz to pytanie . Również ArchWiki na polkit może pomóc.

W przypadku mennicy patrz: https://forums.linuxmint.com/viewtopic.php?t=259912

Problem! Hibernacja została wyłączona przez coś w systemie BIOS!

Test: cat /sys/power/diskma disabled. Dzienniki pokazują „Nie można przełączyć systemu w tryb hibernacji przez logind: czasownik uśpienia nie jest obsługiwany”.

Rozwiązanie: przeszukaj BIOS i znajdź problematyczne rozwiązanie. Wyłącz to.

Rozwiązanie 2: Wypróbuj inny interfejs hibernacji.

Zobacz: Jak włączyć hibernację w 16.04.1? (systemd) .

Interfejsy

  1. swsusp - interfejs jądra niskiego poziomu. Zobacz Wymagania wstępne - jądro dla jakich plików. Bezpośrednie zapisywanie do plików może spowodować zawieszenie (do pamięci RAM, na dysk i hybrydę). Według SwapFAQ problematyczne z hibernacją do pliku.
  2. uswsusp - ArchWiki i Debian Wiki oraz ładne pytanie AskUbuntu z napisem, jak z niego korzystać .
  3. systemd - ArchWiki na ten temat
  4. pm-utils - AFAIK, który jest zbiorem skryptów pochodzących z Debiana - chętnie powitam więcej informacji.

Uwagi końcowe

Dla mnie skompilowanie tego wymagało prawie dwóch dni pracy. Mamy nadzieję, że pomoże to Tobie (i innym osobom) szybciej rozwiązać problem. Wciąż brakuje mi punktów, ale jest druga w nocy i nie mam ochoty pisać więcej. Oczywiście jestem otwarty na wszelkie wskazówki, aby to poprawić, więc skomentuj. Odpowiem, gdy tylko zasnę, pracuję itp .:-)

Nie jestem pewien, czy hibernacja na dysk jest taka świetna. W końcu poszedłem spać. Ale dla mnie problemem było posiadanie pliku o pojemności 32 GB, aby móc hibernować, ponieważ zwykle w ogóle unikam zamiany. Mój początkowy plik wymiany miał pojemność 2 GB i był w większości pusty. YMMV. Niemniej powodzenia! I zacznij od dzienników!


Świetna odpowiedź! Ale to, co ostatecznie rozwiązało mój przypadek, to połączone FAQ wymiany i które mówiło mi, aby dodać „resume = UUID” do zmiennej w moim pliku konfiguracyjnym grub i / lub coś podobnego z initramfs-tools. Z jakiegoś powodu miałem tam niewłaściwy UUID, co prawdopodobnie było problemem. Proponuję więc komuś, kto ma podobny problem, aby najpierw zapoznał się z treścią Często zadawanych pytań dotyczących wymiany w części „Jak dodać lub zmodyfikować partycję wymiany?” Oraz trzeci punkt dotyczący hibernacji.
RimaNari,

1
„disk - Suspend To Disk (STD), hibernacja. To - chcesz”. Czy tylko ja mnie to wyrzuciło? Dzięki wielkie.
spakmad

świetna odpowiedź! jedna mała uwaga: na jednej z moich maszyn wznawiam po hibernacji działał tylko po drugiej próbie rozruchu (nic nie było wyświetlane na monitorze przy pierwszej próbie). mogę to naprawić, instalując stos HWE: $ sudo apt install linux-generic-hwe-18.04(w przypadku niektórych urządzeń linux-generic-hwe-18.04-edgewarto nawet spróbować ).
główny bohater Hiro,

1
Ach Nie zamierzam hibernować! Mam 512 GB pamięci RAM. No cóż ... (Mam wystarczająco dużo miejsca na moim dysku twardym 10 TB, ale ponowne uruchomienie zajmie kilka godzin!)
Alexis Wilke

9

Użyj UUID partycji wymiany zamiast jego punktu montowania w parametrze RESUME resume=UUID=<#>zarówno w, jak /etc/default/grubi/etc/initramfs-tools/conf.d/resume

Utwórz wpis dla partycji wymiany /etc/fstab bez punktu montażowego coś takiego

# Entry for Swap : 
UUID=# none  swap    sw              0       0

W /etc/default/grubUżyłem osobnego wpisu do wznowienia hibernacji

# FOR HIBERNATION 
GRUB_CMDLINE_LINUX="resume=UUID=..."

Utwórz zestaw polityk we władzach lokalnych (pkla)

sudo gedit /etc/polkit-1/localauthority/50-local.d/com.ubuntu.enable-hibernate.pkla

I wstaw tam

[Re-enable hibernate by default in upower]
Identity=unix-user:*
Action=org.freedesktop.upower.hibernate
ResultActive=yes

[Re-enable hibernate by default in logind]
Identity=unix-user:*
Action=org.freedesktop.login1.hibernate;org.freedesktop.login1.handle-hibernate-key;org.freedesktop.login1;org.freedesktop.login1.hibernate-multiple-sessions;org.freedesktop.login1.hibernate-ignore-inhibit
ResultActive=yes

[Enable hibernate to be run via cron]
Identity=unix-user:*
Action=org.freedesktop.login1.hibernate;org.freedesktop.login1.hibernate-multiple-sessions
ResultAny=yes

Po tej aktualizacji initramfs i GRUB

sudo update-initramfs -u -k all
sudo update-grub

Uruchom ponownie, otwórz niektóre aplikacje i użyj systemctl hibernate(bez sudo), aby sprawdzić, czy to działa


działa w porządku! wielkie dzięki.
Yossarian42

dzięki stary, uratowałeś mnie!
Vahe Shadunts

1

Dla mnie zawsze działało do 18.04, a po 18.04 włączyłem go tak, jak w wielu artykułach, ale nagle przestało działać wczoraj (działa dobrze przez 4-5 miesięcy),

a oto ... JEDNA RZECZ, która sprawiła, że ​​znów działa

Powiedz grub2, gdzie jest partycja wymiany:

Najpierw dowiedz się, na której partycji jest on, używając poniższego polecenia:

cat /etc/fstab

Mój jest na sda7, podobnie jak następujące dane wyjściowe:

swap był włączony / dev / sda7 podczas instalacji

Następnie dodaj w Grub2 następujący dodatek do następującego wiersza, używając następującego polecenia:

sudo gedit / etc / default / grub

GRUB_CMDLINE_LINUX_DEFAULT = "intel_pstate = wyłącz wznawianie = / dev / sda7"

Ważną częścią jest resume=/dev/sda7

/ dev / sda7 w moim przypadku

Następnie zaktualizuj Grub za pomocą następującego polecenia, a następnie znów zaczął działać idealnie:

sudo update-grub

Po wielu próbach było to jedno, co zadziałało, być może było to spowodowane aktualizacją jądra, która go zepsuła, ale tym bardziej to działało.


0

mam nadzieję, że to komuś pomoże, ale uruchamiam popos / ubuntu 19.04. W mojej konfiguracji mogłem hibernować za pomocą s2disk lub pm-hibernacji, ale wznawianie nie powiodło się. Aby to naprawić, ponieważ mój system jest uruchamiany przy użyciu UEFI zamiast grub. Musiałem tylko ponownie zainstalować moduł ładujący. Aby sprawdzić, czy korzystasz z interfejsu UEFI, wykonaj następujące czynności:

[ -d /sys/firmware/efi ] && echo "Installed in UEFI mode" || echo "Installed in Legacy mode"

jeśli w trybie UEFI, postępowałem zgodnie z tym przewodnikiem, aby ponownie zainstalować program ładujący, różni się, jeśli używasz dysku nvme lub dysku sata: https://support.system76.com/articles/bootloader/

upewnij się, że w opcjach kernalboot określasz partycję lub identyfikator UUID, z którego chcesz wznowić, np. coś takiego:

resume = UUID = ed8347ed-2eb4-40bc-bc77-cc53b987ed88

Możesz to dodać: 1) sudo kernel-stub -a "resume = UUID = ..." 2) edytuj plik /etc/initramfs-tools/conf.d/resume i dodaj: resume = UUID = ed8347ed- 2eb4-40bc-bc77-cc53b987ed88

sprawdzam plik / var / log / syslog pod kątem czegoś takiego: 4 sierpnia 22:26:42 pop-os / usr / bin / kernelstub [19639]: kernelstub: DEBUG kopts: root = UUID = b37019a8-91f5-445f-94c1 -7359a49ed5df ro quiet loglevel = 0 systemd .show_status = false resume = UUID = ed8347ed-2eb4-40bc-bc77-cc53b987ed88

Jeśli wznowienie brakuje lub jest nieprawidłowe, musisz ponownie zaktualizować jądro rozruchowe.


0

Oprócz ustawienia punktu wznowienia wymiany w grub, o którym mowa w odpowiedzi Sam73 , stwierdziłem, że moje Ubuntu 18.04 musi również zainstalować laptop-mode-tools:

$sudo apt install laptop-mode-tools

następnie zmień ENABLE_LAPTOP_MODE_ON_AC=1plik konfiguracyjny:

$sudo vim /etc/laptop-mode/laptop-mode.conf

uruchom tryb laptopa z:

$sudo laptop_mode start

PS Możesz sprawdzić, czy laptop zaczyna, czy nie

$cat /proc/sys/vm/laptop_mode

Jeśli drukuje 0, laptop_modeoznacza to , że nie działa, w przeciwnym razie oznacza, że ​​działa dobrze.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.