Jak domyślnie używać pm-suspend-hybrid zamiast pm-suspend?


41

Chciałbym użyć hybrydowej metody zawieszenia zamiast zawieszenia podczas zamykania pokrywy lub wybierania „Zawieś” z menu.

Mogę sobie wyobrazić zmianę skryptu PM-Suspend, aby zrobić to automatycznie, ale może istnieć łatwiejszy do utrzymania / łatwiejszy sposób.

Odpowiedzi:


44

Pośredni sen hybrydowy

Jest to starsza metoda: najpierw wstrzymaj, a następnie obudź się po hibernacji po pewnym czasie (domyślnie 15 minut). Użyj tego z jądrem Linuksa wcześniejszym niż 3.6, lub jeśli chcesz, nie zużywa żadnej mocy po 15 minutach.

Dodaj plik /etc/pm/config.d/00-use-suspend-hybrid:

# Always use suspend_hybrid instead of suspend
if [ "$METHOD" = "suspend" ]; then
  METHOD=suspend_hybrid
fi
# The delay after which hibernation gets triggered (default: 900 seconds, 15 minutes):
PM_HIBERNATE_DELAY=900

Możesz upewnić się, że metoda hybrydowa jest obsługiwana w systemie za pomocą następującego kodu. Jeśli mówi „0”, powinno działać:

sudo pm-is-supported --suspend-hybrid && echo $?

Prawdziwe hybrydowe zawieszanie w systemie Linux 3.6+

Jeśli masz jądro Linuksa 3.6, możesz użyć następujących elementów, które od początku zawieszą się zarówno na dysku, jak i pamięci RAM.

Dodaj plik /etc/pm/config.d/00-use-suspend-hybrid:

# WORKAROUND: always set the default hibernate mode first (normal mode)
# (not required if you have the patch mentioned by Rohan below (http://askubuntu.com/a/344879/169))
HIBERNATE_MODE=platform

# Always use hibernate instead of suspend, but with "suspend to both"
if [ "$METHOD" = "suspend" ]; then
  METHOD=hibernate
  HIBERNATE_MODE=suspend
fi

# Make sure to use the kernel's method, in case uswsusp is installed etc.
SLEEP_MODULE=kernel

Spowoduje to zawsze zapisanie obrazu na dysku, a następnie zawieszenie w pamięci RAM, dzięki czemu wznowienie będzie zawsze szybkie (dopóki bateria się nie wyczerpie) i że urządzenie nie obudzi się przez krótki czas (po PM_HIBERNATE_DELAY) hibernować na serio.

Wadą jest to, że proces trwa dłużej (ponieważ zawsze hibernuje na dysk) i że bateria może wyczerpać się na dłuższą metę (np. Po 12 godzinach).


2
jedna mała uwaga, zamiast „sudo pm-is-support --suspend-hybrid && echo $?”, użyj „sudo pm-is-support --suspend-hybrid; echo $? ponieważ zwracana wartość pm-is-is obsługiwana to 0 dla jest obsługiwane, a 1 dla nie jest.
James Caccese

1
@JamesCaccese: W świecie shellscript 0 oznacza „prawda”, a cokolwiek innego oznacza „fałsz”. Twój skryptlet działałby, ale skryptlet oryginalnego plakatu również działałby zgodnie z przeznaczeniem, drukując „0” na obsługiwanym i nic na nieobsługiwanym. Jeśli chcesz czegoś, co zawsze będzie obsługiwane lub nieobsługiwane, spróbuj „sudo pm-is-obsługiwane --suspend-hybrid && echo„ obsługiwane ”|| echo „nieobsługiwane” ”
zanfur

@zanfur - Chociaż podoba mi się twoje kolejne dostarczone rozwiązanie do drukowania obu stanów (i nic z jakiegokolwiek nieoczekiwanego powodu nie obsługuje pm-pm, nie działa zgodnie z oczekiwaniami, co spowodowałoby nieznane rzeczy w stanie błędu ), doceniam wspomnienie Jamesa Caccese'a o to zastrzeżenie, z wyżej wymienionego powodu.
user66001

Jeśli używasz 16.04, zobacz odpowiedź poniżej.
kapad

Jedynym brakującym elementem było dla mnie resumekłótnie /etc/default/grub.conf. Również jako użytkownik nvidii musiałem ustawić nomodeset. Tak otrzymaną wpis grub w moim przypadku jest: GRUB_CMDLINE_LINUX_DEFAULT="nomodeset resume=UUID=uuidofswappartition". Nie zapomnij grub-update. A także niektóre moduły muszą zostać rozładowane, więc utworzony plik /etc/pm/config.d/00-unload_modulesz linią SUSPEND_MODULES="ath5k r8169"i żeby się upewnić, że 10-use-suspend-hybrid
zmieniłem

31

Ubuntu 18.04 opcja czasowa

W Ubuntu 18.04 ma nową opcję czasową. W systemdto availiable nowy tryb suspend-then-hibernate. Rozpocznie się to od trybu uśpienia, a następnie po ustalonym czasie przejdzie w tryb hibernacji.

W hybrid-sleeptrybie hibernacja działa tylko wtedy, gdy poziom naładowania akumulatora jest krytycznie niski, a system wyłącza się.

Aby rozpocząć korzystanie z tej funkcji, musisz utworzyć plik /etc/systemd/sleep.confz następną treścią:

[Sleep]
HibernateDelaySec=3600

Przejdzie ze snu do hibernacji po 1 godzinie snu. Możesz edytować, HibernateDelaySecaby zmienić opóźnienie na hibernację.

Najpierw sprawdź, czy funkcja zawieszenia, a następnie hibernacji działa przy użyciu systemd

Otwórz terminal, naciskając Ctrl+ Alt+ Ti wprowadź:

sudo systemctl suspend-then-hibernate

Jeśli to działa, zrób to na stałe.

  • Następujące czynności działają po zamknięciu pokrywy .

Otwórz plik /etc/systemd/logind.confza pomocą preferowanego edytora. Trzeba będzie powołać swój potencjał administracyjny przez sudo, gksudolub pkexecedytować ten plik.

Znajdź dwie linie:

#HandleSuspendKey=suspend
#HandleLidSwitch=suspend

Uwaga: te wiersze są komentowane #przed nimi. Jest suspendto akcja domyślna. Usuń #i zmień suspendna suspend-then-hibernatew tych dwóch wierszach, aby wyglądały tak:

HandleSuspendKey=suspend-then-hibernate
HandleLidSwitch=suspend-then-hibernate

Zapisz plik. Wyloguj się i zaloguj ponownie lub uruchom ponownie logindusługę za pomocą polecenia:

systemctl restart systemd-logind.service

ostrzeżenie! twoja sesja użytkownika zostanie zrestartowana

Źródło: Lid Closed Suspend następnie Hibernacja

Ubuntu 16.04 i nowsze wersje

Rozwiązanie przez blueyed Real hybryda zawieszającego z Linux 3.6+ nie praca dla mnie. Podejrzewam, że systemddzieje się tak, ponieważ system Ubuntu 16.04 używa i nie korzysta z pliku /etc/pm/config.d/00-use-suspend-hybrid.

Najpierw sprawdź, czy hibernacja i sen hybrydowy działają przy użyciu systemd

Otwórz terminal, naciskając Ctrl+ Alt+ Ti wprowadź:

sudo systemctl hibernate

To powinno doprowadzić twój komputer do hibernacji. Aby wypróbować tryb hybrydowy, wprowadź:

sudo systemctl hybrid-sleep

Jeśli to działa, zrób to na stałe.

  • Następujące czynności działają po zamknięciu pokrywy .

Otwórz plik /etc/systemd/logind.confza pomocą preferowanego edytora. Trzeba będzie powołać swój potencjał administracyjny przez sudo, gksudolub pkexecedytować ten plik.

Znajdź dwie linie:

#HandleSuspendKey=suspend
#HandleLidSwitch=suspend

Uwaga: te wiersze są komentowane #przed nimi. Jest suspendto akcja domyślna. Usuń #i zmień suspendna hybrid-sleepw tych dwóch wierszach, aby wyglądały tak:

HandleSuspendKey=hybrid-sleep
HandleLidSwitch=hybrid-sleep

Zapisz plik. Wyloguj się i zaloguj ponownie.

Uwaga:

  • Inne niż suspendlub hybrid-sleepjest jeszcze trzecia opcja, hibernate.
  • Mój laptop nie ma fizycznego przycisku uśpienia. Więc nie mogłem tego przetestować.
  • Kliknięcie w Suspendmenu ząb powoduje, że komputer normalnie zawiesza się, a nie tryb hybrydowy.

Źródło: https://superuser.com/questions/719447/how-to-use-systemd-hybrid-sleep-instead-of-suspend-under-gnome-in-linux

mam nadzieję, że to pomoże


2
Ta odpowiedź wymaga więcej głosów pozytywnych. Naprawiono dla mnie problemy w 16.04. Dzięki.
kapad

Zapraszamy. Teraz, kiedy przeszedłem z 14.04 na 16.04, znajduję nowy systemowy sposób robienia rzeczy, powoli z czasem.
user68186

1
Współpracuje również z Ubuntu GNOME 16.04.1
HarlemSquirrel

4

W 12.04 zauważyłem, że kiedy hibernacja zostanie uruchomiona (za pomocą PM_HIBERNATE_DELAY=XX), wznawianie / rozmrażanie skryptów powłoki nie powoduje rozbrojenia zmiennej grub recordfail. Dlatego grub nie uruchamia się automatycznie.

Limit czasu jest ustawiony na -1 i oczekuje na wybór użytkownika. Zgaduję, że wymaga to edycji skryptów w /etc/pm/sleep.d/10_grub-common. Jestem nowicjuszem, więc nie starałem się niestety ustalić dokładnej zmiany.


1
Byłoby warte zgłoszenia błędu i / lub testowania, jeśli działa w wersji 12.10+.
blueyed

Ten sam problem widzę w 12.10
MDCore

3

To pytanie pojawia się na tyle często w Google, że myślę, że warto na niego wpadać. Metodą opisaną tutaj jest (imo) nie hybrydowe zawieszanie. Jest to „hibernacja po X minutach zawieszenia”. Prawdziwe zawieszenie hybrydowe zapisuje pamięć RAM na dysk, a następnie przechodzi w stan niskiego poboru mocy (tryb uśpienia). Podczas gdy trwa to dłużej, wznawianie jest natychmiastowe, dopóki w urządzeniu nie ma baterii, w przeciwnym razie wznawia się z dysku twardego. Takie zachowanie jest znane jako większość uśpienia hybrydowego i jest używane domyślnie w nowszych laptopach z systemem Windows i Mac.

Oto jak włączyć prawdziwe zawieszenie hybrydowe:

  • Postępuj zgodnie z pierwszą częścią najwyższej odpowiedzi. To zastępuje wywołanie „zawieszenia” w celu wykonania „hybrid_suspend” w pm-utils.
    % cat /etc/pm/config.d/00-use-suspend-hybrid
    # Zawsze używaj suspend_hybrid zamiast zawieszenia
    if ["$ METHOD" = "suspend"]; następnie
        METODA = zawiesina hybrydowa
    fi
  • Wykonaj kopię zapasową funkcji / usr / lib / pm-utils / pm-functions
  • Pobierz łatkę stąd: https://bugs.freedesktop.org/attachment.cgi?id=68712
    • Ta łatka umożliwia zawieszenie hybrydowe, jeśli jest dostępne (tj. W jądrach 3.6+)
  • Zastosuj go za pomocą „łatki-p0” lub ręcznie połącz, jeśli to się nie powiedzie

Ta metoda działa dla mnie na moim Sony Vaio SVS.

PS: Odtworzenie łatki tutaj na wypadek, gdyby plik został usunięty w przyszłości:

diff --git a / pm / pm-functions.in b / pm / pm-functions.in
--- a / pm / pm-functions.in
+++ b / pm / pm-functions.in
@@ -316,8 + 316,28 @@ jeśli [-z "$ HIBERNATE_MODULE"] && \
    {
        [-n „$ {HIBERNATE_MODE}”] && \
        grep -qw "$ {HIBERNATE_MODE}" / sys / power / disk && \
+ HIBERNATE_MODE_SAVE = $ (cat / sys / power / disk) && \
+ HIBERNATE_MODE_SAVE = "$ {HIBERNATE_MODE_SAVE ## * [}" && \
+ HIBERNATE_MODE_SAVE = "$ {HIBERNATE_MODE_SAVE %%] *}" && \
        echo -n "$ {HIBERNATE_MODE}"> / sys / power / disk
        echo -n „dysk”> / sys / power / state
+ RET = $?
+ echo -n "$ HIBERNATE_MODE_SAVE"> / sys / power / disk
+ zwróć „$ RET”
+}
+ fi
+
+ # dla jąder, które obsługują zawieszenie do obu (tj. hybrydowe zawieszenie)
+ # od jądra 3.6
+ jeśli [-z „$ SUSPEND_HYBRID_MODULE”] && \
+ [-f / sys / power / disk] && \
+ grep -q dysk / sys / power / state && \
+ grep -q suspend / sys / power / disk; następnie
+ SUSPEND_HYBRID_MODULE = „jądro”
+ do_suspend_hybrid ()
+ {
+ HIBERNATE_MODE = „zawieś”
+ do_hibernate
    }
 fi

Źródła:


1
Masz rację co do zawieszenia hybrydowego. Ostatnio sam zmieniłem swój fragment kodu. Możesz uzyskać (całkiem) ten sam wynik, używając METHOD = hibernacja i HIBERNATE_MODE = suspend. Ustawiam HIBERNATE_MODE = platforma na górze pliku, zamiast zapisywać i przywracać poprzednią wersję (co robi łatka). Zaktualizuję moją odpowiedź powyżej.
niebieskawy

To wygląda świetnie, dzięki za edycję, @blueyed
Rohan Dhruva

1

Istnieje inne rozwiązanie bez dodawania żadnego pliku w config.d, po prostu użycie wakealarm w / sys / class / rtc / rtc0. Używaj przestarzałego kodu w funkcjach pm (/ usr / lib / pm-utils) po komentarzach #, ponieważ jądro nie obsługuje bezpośrednio ..., (ponieważ obecne jądro (po 3.6 coś) bezpośrednio obsługuje). Cofnij ten kod i wstaw część do_suspend () zamiast do_suspend_hybrid () i użyj łatki dla funkcji pm (dopóki nie naprawią).

Przestarzały kod (wstrzymaj, a następnie hibernuj, gdy wywoływana jest funkcja suspend_hybrid):

# since the kernel does not directly support hybrid sleep, we do
# something else -- suspend and schedule an alarm to go into
# hibernate if we have slept long enough.
# Only do this if we do not need to do any special video hackery on resume
# from hibernate, though.
if [ -z "$SUSPEND_HYBRID_MODULE" -a -w "$PM_RTC/wakealarm" ] && \
    check_suspend && check_hibernate && ! is_set $HIBERNATE_RESUME_POST_VIDEO; \
    then
    SUSPEND_HYBRID_MODULE="kernel"
    do_suspend_hybrid() {
    WAKETIME=$(( $(cat "$PM_RTC/since_epoch") + PM_HIBERNATE_DELAY))
    echo >"$PM_RTC/wakealarm"
    echo $WAKETIME > "$PM_RTC/wakealarm"
    if do_suspend; then
        NOW=$(cat "$PM_RTC/since_epoch")
        if [ "$NOW" -ge "$WAKETIME" -a "$NOW" -lt $((WAKETIME + 30)) ]; then
        log "Woken by RTC alarm, hibernating."
        # if hibernate fails for any reason, go back to suspend.
        do_hibernate || do_suspend
        else
        echo > "$PM_RTC/wakealarm"
        fi
    else
        # if we cannot suspend, just try to hibernate.
        do_hibernate
    fi
    }
fi

Zalecana. Jeszcze łatwiejszy w użyciu uswsusp, jednocześnie maksymalizując korzyści z s2both, tj. S2both po zawieszeniu. Umieść odwrócony kod w części do_suspend () modułu uswsusp (/usr/lib/pm-utils/module.d).

Cofnięty kod (suspend_hybrid po wywołaniu zawieszenia):

        WAKETIME=$(( $(cat "$PM_RTC/since_epoch") + PM_HIBERNATE_DELAY))
        echo >"$PM_RTC/wakealarm"
        echo $WAKETIME > "$PM_RTC/wakealarm"
        if do_suspend_hybrid; then
            NOW=$(cat "$PM_RTC/since_epoch")
            if [ "$NOW" -ge "$WAKETIME" -a "$NOW" -lt $((WAKETIME + 30)) ];             then
            log "Woken by RTC alarm, hibernating."
            # if hibernate fails for any reason, go back to suspend_hybrid.
            do_hibernate || do_suspend_hybrid
            else
            echo > "$PM_RTC/wakealarm"
            fi
        else
            # when do_suspend is being called, convert to suspend_hybrid.
            do_suspend_hybrid
        fi      

Za pomocą uswsusp możemy zobaczyć postęp zawieszenia / hibernacji i proces odwrotny wyświetlany w tekście, nawet możemy go przerwać, naciskając klawisz Backspace. Bez uswsusp, zawieszanie / hibernacja po prostu pojawiają się - znikają irytujące, szczególnie gdy wakealarm jest uruchamiany i wykonuje hibernację (s2disk w uswsusp). Ustaw czas snu przed hibernacją w zwykłym miejscu w pliku funkcji pm.

# variables to handle hibernate after suspend support
PM_HIBERNATE_DELAY=900  # 15 minutes
PM_RTC=/sys/class/rtc/rtc0

Oto mod uswsusp: (pamiętaj, ten moduł jest wywoływany z funkcji pm, więc wstawiane zmienne są takie same)

#!/bin/sh

# disable processing of 90chvt and 99video.
# s2ram and s2disk handle all this stuff internally.
uswsusp_hooks()
{
    disablehook 99video "disabled by uswsusp"
}

# Since we disabled 99video, we need to take responsibility for proper
# quirk handling.  s2ram handles all common video quirks internally,
# so all we have to do is translate the HAL standard options to s2ram options.
uswsusp_get_quirks()
{
    OPTS=""
    ACPI_SLEEP=0
    for opt in $PM_CMDLINE; do
        case "${opt##--quirk-}" in # just quirks, please
            dpms-on)       ;; # no-op
            dpms-suspend)      ;; # no-op
            radeon-off)        OPTS="$OPTS --radeontool" ;;
            reset-brightness)  ;; # no-op
            s3-bios)       ACPI_SLEEP=$(($ACPI_SLEEP + 1)) ;;
            s3-mode)       ACPI_SLEEP=$(($ACPI_SLEEP + 2)) ;;
            vbe-post)      OPTS="$OPTS --vbe_post" ;;
            vbemode-restore)   OPTS="$OPTS --vbe_mode" ;;
            vbestate-restore)  OPTS="$OPTS --vbe_save" ;;
            vga-mode-3)        ;; # no-op
            save-pci)          OPTS="$OPTS --pci_save" ;;
            none)          QUIRK_NONE="true" ;;
            *) continue ;;
        esac
    done
    [ $ACPI_SLEEP -ne 0 ] && OPTS="$OPTS --acpi_sleep $ACPI_SLEEP"
    # if we were told to ignore quirks, do so.
    # This is arguably not the best way to do things, but...
    [ "$QUIRK_NONE" = "true" ] && OPTS=""
}

# Since we disabled 99video, we also need to handle displaying
# help info for the quirks we handle.
uswsusp_help()
{
    echo  # first echo makes it look nicer.
    echo "s2ram video quirk handler options:"
    echo
    echo "  --quirk-radeon-off"
    echo "  --quirk-s3-bios"
    echo "  --quirk-s3-mode"
    echo "  --quirk-vbe-post"
    echo "  --quirk-vbemode-restore"
    echo "  --quirk-vbestate-restore"
    echo "  --quirk-save-pci"
    echo "  --quirk-none"
}

# This idiom is used for all sleep methods.  Only declare the actual
# do_ method if:
# 1: some other sleep module has not already done so, and
# 2: this sleep method can actually work on this system.
#
# For suspend, if SUSPEND_MODULE is set then something else has already
# implemented do_suspend.  We could just check to see of do_suspend was
# already declared using command_exists, but using a dedicated environment
# variable makes it easier to debug when we have to know what sleep module
# ended up claiming ownership of a given sleep method.
if [ -z "$SUSPEND_MODULE" ] && command_exists s2ram && \
    ( grep -q mem /sys/power/state || \
        ( [ -c /dev/pmu ] && check_suspend_pmu; ); ); then
    SUSPEND_MODULE="uswsusp"
    do_suspend()
    {
        WAKETIME=$(( $(cat "$PM_RTC/since_epoch") + PM_HIBERNATE_DELAY))
        echo >"$PM_RTC/wakealarm"
        echo $WAKETIME > "$PM_RTC/wakealarm"
        if do_suspend_hybrid; then
            NOW=$(cat "$PM_RTC/since_epoch")
            if [ "$NOW" -ge "$WAKETIME" -a "$NOW" -lt $((WAKETIME + 30)) ];             then
            log "Woken by RTC alarm, hibernating."
            # if hibernate fails for any reason, go back to suspend_hybrid.
            do_hibernate || do_suspend_hybrid
            else
            echo > "$PM_RTC/wakealarm"
            fi
        else
            # when do_suspend is being called, convert to suspend_hybrid.
            do_suspend_hybrid
        fi      
    }
fi

if [ -z "$HIBERNATE_MODULE" ] && \
    [ -f /sys/power/disk ] && \
    grep -q disk /sys/power/state && \
    [ -c /dev/snapshot ] &&
    command_exists s2disk; then
    HIBERNATE_MODULE="uswsusp"
    do_hibernate()
    {
        s2disk
    }
fi

if [ -z "$SUSPEND_HYBRID_MODULE" ] && 
    grep -q mem /sys/power/state && \
    command_exists s2both && \
    check_hibernate; then
    SUSPEND_HYBRID_MODULE="uswsusp"
    do_suspend_hybrid()
    {   
        uswsusp_get_quirks
        s2both --force $OPTS 
    }
    if [ "$METHOD" = "suspend_hybrid" ]; then
        add_before_hooks uswsusp_hooks
        add_module_help uswsusp_help
    fi
fi  

0

Odpowiedź użytkownika 68686 dla Ubuntu 16.04 nie działała dla mnie. Jednak rozwiązało to tutaj .

Najpierw upewnij się, że hibernacja działa. Następnie

Wyszukaj i zainstaluj edytor dconf w oprogramowaniu Ubuntu. Następnie uruchom go i przejdź do org -> gnome -> demon ustawień -> wtyczki -> moc.

Zmień wartość „działanie przy zamkniętej pokrywie” i „działanie przy zamkniętej pokrywie akumulatora”.

W moich ustawieniach mocy opcje te są wyświetlane jako puste, ale działają zgodnie z przeznaczeniem.


0

W Ubuntu 18.04 jest znacznie łatwiejszy. W systemd dostępny jest nowy tryb wstrzymania, a następnie hibernacji . Aby rozpocząć korzystanie z tej funkcji, musisz utworzyć plik /etc/systemd/sleep.conf z następną zawartością:

[Sleep]
HibernateDelaySec=3600

Następnie możesz to przetestować za pomocą polecenia:

sudo systemctl suspend-then-hibernate

(możesz edytować HibernateDelaySec, aby zmniejszyć opóźnienie do hibernacji). Jeśli wszystko działa dobrze, możesz zmienić akcję Zamknij pokrywkę, aby to zrobić, musisz edytować plik /etc/systemd/logind.conf

Musisz znaleźć opcję HandleLidSwitch = , odkomentować i zmienić na HandleLidSwitch = zawiesić, a następnie hibernację . Następnie musisz zrestartować usługę logowania (wirowanie! Sesja użytkownika zostanie zrestartowana) za pomocą następnego polecenia:

systemctl restart systemd-logind.service

To wszystko! Teraz możesz użyć tej ładnej funkcji.

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.