Come posso usare pm-suspend-hybrid di default invece di pm-suspend?


41

Vorrei utilizzare il metodo di sospensione ibrido invece di sospendere quando si chiude il coperchio o si seleziona "Sospendi" dal menu.

Posso immaginare di modificare lo script pm-suspend per farlo automaticamente, ma potrebbe esserci un modo più gestibile / più facile.

Risposte:


44

Sonno ibrido indiretto

Questo è il metodo più vecchio: prima sospendi e poi svegliati per andare in letargo dopo un ritardo (15 minuti per impostazione predefinita). Usalo con un kernel Linux prima della 3.6, o se ti piace che non usi più energia dopo 15 minuti.

Aggiungi il file /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

Potresti voler assicurarti che il metodo ibrido sia supportato sul tuo sistema tramite il seguente codice. Se dice "0" dovrebbe funzionare:

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

Vero ibrido sospeso con Linux 3.6+

Se si dispone di un kernel Linux 3.6, è possibile utilizzare quanto segue, che verrà sospeso su disco e RAM dall'inizio.

Aggiungi il file /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

Questo scriverà sempre l'immagine sul disco e quindi sospenderà sulla RAM, con i vantaggi che la ripresa sarà sempre veloce (fino a quando la batteria non si esaurisce) e che la macchina non si riattiverà per un breve periodo (dopo PM_HIBERNATE_DELAY) in letargo per davvero.

Lo svantaggio è che il processo impiega più tempo (perché va sempre in letargo su disco) e che la batteria potrebbe esaurirsi nel lungo periodo (ad es. Dopo 12 ore).


2
una piccola nota, invece di "sudo pm-is-support --suspend-hybrid && echo $?", usa "sudo pm-is-support --suspend-hybrid; echo $? ' poiché il valore di ritorno di pm-is-supportato è 0 per è supportato e 1 per non lo è.
James Caccese,

1
@JamesCaccese: Nel mondo shellscript, 0 significa "vero" e qualsiasi altra cosa significa "falso". Il tuo scriptlet funzionerebbe, ma anche lo scriptlet del poster originale funzionerebbe come previsto, stampando uno '0' su supportato e nulla su non supportato. Se vuoi qualcosa che dirà sempre supportato o non supportato, prova 'sudo pm-is-support --suspend-hybrid && echo "supportato" || echo "
unsupported

@zanfur - Anche se mi piace la tua successiva soluzione fornita per la stampa di entrambi gli stati (e nulla per qualsiasi motivo imprevisto supportato da pm non viene eseguito come previsto, ciò farebbe cose sconosciute allo stato di errore ), apprezzo la menzione di James Caccese su tale avvertimento, per la ragione sopra menzionata .
user66001

Se stai usando 16.04 vedi questa risposta qui sotto.
Kapad,

L'unico pezzo mancante per me era l' resumeargomento /etc/default/grub.conf. Anche come utente nvidia ho dovuto impostare nomodeset. Quindi, con conseguente ingresso grub nel mio caso è: GRUB_CMDLINE_LINUX_DEFAULT="nomodeset resume=UUID=uuidofswappartition". Non dimenticare grub-update. E anche alcuni moduli devono essere scaricati in modo da creare il file /etc/pm/config.d/00-unload_modulescon la linea SUSPEND_MODULES="ath5k r8169"e solo per essere sicuro di aver rinominato 00-use-suspend-hybrid in10-use-suspend-hybrid
mauron85

31

Ubuntu 18.04 un'opzione a tempo

In Ubuntu 18.04 ha una nuova opzione a tempo. In systemdè availiable una nuova modalità suspend-then-hibernate. Questo inizierà con la modalità di sospensione e poi passerà alla modalità di ibernazione dopo un tempo fisso.

Nella hybrid-sleepmodalità, la parte di ibernazione diventa effettiva solo quando la batteria è quasi scarica e il sistema si spegne.

Per iniziare a utilizzare questa funzione è necessario creare un file /etc/systemd/sleep.confcon il contenuto successivo:

[Sleep]
HibernateDelaySec=3600

Questo passerà dal sonno al letargo dopo 1 ora di sonno. È possibile modificare HibernateDelaySecper modificare il ritardo in letargo.

Innanzitutto, verifica se suspend-then-hibernate funziona utilizzando systemd

Apri un terminale premendo Ctrl+ Alt+ Te inserisci:

sudo systemctl suspend-then-hibernate

Se funziona rendilo permanente.

  • Quanto segue funziona quando chiudo il coperchio .

Apri il file /etc/systemd/logind.confusando il tuo editor preferito. Avrete bisogno di richiamare il vostro potere amministrativo da sudo, gksudoo pkexecper modificare questo file.

Trova le due righe:

#HandleSuspendKey=suspend
#HandleLidSwitch=suspend

Nota, queste righe sono commentate con #davanti a loro. Questa suspendè l'azione predefinita. Rimuovi #e modifica suspendin suspend-then-hibernatein queste due righe in modo che appaiano così:

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

Salva il file. Disconnettersi e riconnettersi o riavviare il logindservizio con il comando:

systemctl restart systemd-logind.service

avvertimento! la sessione utente verrà riavviata

Fonte: coperchio chiuso, sospensione, quindi ibernazione

Ubuntu 16.04 e versioni successive

La soluzione di blueyed per Real Hybrid sospesa con Linux 3.6+ non ha funzionato per me. Sospetto che ciò sia dovuto al fatto che Ubuntu 16.04 utilizza systemde non utilizza il file /etc/pm/config.d/00-use-suspend-hybrid.

Innanzitutto, verifica se l'ibernazione e l'ibrido-sonno funzionano utilizzando systemd

Apri un terminale premendo Ctrl+ Alt+ Te inserisci:

sudo systemctl hibernate

Questo dovrebbe far ibernare il tuo computer. Per provare l'ibrido-sonno, inserire:

sudo systemctl hybrid-sleep

Se funziona rendilo permanente.

  • Quanto segue funziona quando chiudo il coperchio .

Apri il file /etc/systemd/logind.confusando il tuo editor preferito. Avrete bisogno di richiamare il vostro potere amministrativo da sudo, gksudoo pkexecper modificare questo file.

Trova le due righe:

#HandleSuspendKey=suspend
#HandleLidSwitch=suspend

Nota, queste righe sono commentate con #davanti a loro. Questa suspendè l'azione predefinita. Rimuovi #e modifica suspendin hybrid-sleepin queste due righe in modo che appaiano così:

HandleSuspendKey=hybrid-sleep
HandleLidSwitch=hybrid-sleep

Salva il file. Disconnettersi e riconnettersi.

Nota:

  • Altro che suspendo hybrid-sleepc'è una terza opzione, hibernate.
  • Il mio laptop non ha un pulsante di sospensione fisico. Quindi non ho potuto provarlo.
  • Facendo clic sul Suspenddal menu del pignone, il computer non sospende la sospensione ibrida normale.

Fonte: https://superuser.com/questions/719447/how-to-use-systemd-hybrid-sleep-instead-of-suspend-under-gnome-in-linux

Spero che aiuti


2
Questa risposta richiede più voti. Risolti problemi per me nel 16.04. Grazie.
Kapad,

Prego. Ora che sono passato dal 14.04 al 16.04, sto trovando il nuovo modo di fare le cose, lentamente nel tempo.
user68186

1
Funziona anche con Ubuntu GNOME 16.04.1
HarlemSquirrel il

4

Nel 12.04 ho notato che quando si attiva l'ibernazione (usando PM_HIBERNATE_DELAY=XX), il resume / thaw degli script di shell non disinserisce la variabile grub recordfail. Pertanto grub non si avvia automaticamente.

Il timeout è impostato su -1 e attende la selezione dell'utente. Immagino che questo richieda alcune modifiche agli script in /etc/pm/sleep.d/10_grub-common. Sono un novizio, quindi non mi sono dilettato a capire il cambiamento esatto purtroppo.


1
Varrebbe probabilmente una segnalazione di bug e / o test se funziona in 12.10+.
bluato il

Vedo lo stesso problema in 12.10
MDCore

3

Questa domanda si presenta abbastanza frequentemente in Google che penso che valga la pena di essere respinta. Il metodo descritto qui è (IMO) non ibrida di sospensione. È "letargo dopo X minuti in sospensione". La vera sospensione ibrida scrive la RAM sul disco e quindi passa allo stato di risparmio energetico (modalità sospensione). Mentre richiede più tempo, il ripristino è istantaneo mentre la macchina ha la batteria rimasta, altrimenti riprende dal disco rigido. Questo comportamento è ciò che molte persone conoscono come sospensione ibrida e viene utilizzato per impostazione predefinita nei laptop Windows e Mac più recenti.

Ecco come abilitare la vera sospensione ibrida:

  • Segui la prima parte della risposta principale. Questo sovrascrive la chiamata "suspend" per fare un "hybrid_suspend" in pm-utils.
    % cat /etc/pm/config.d/00-use-suspend-hybrid
    # Usa sempre suspend_hybrid invece di suspend
    if ["$ METHOD" = "suspend"]; poi
        METODO = suspend_hybrid
    fi
  • Effettua un backup delle funzioni / usr / lib / pm-utils / pm-
  • Ottieni la patch da qui: https://bugs.freedesktop.org/attachment.cgi?id=68712
    • Questa patch abilita la sospensione ibrida se disponibile (ad es. Sui kernel 3.6+)
  • Applicalo usando 'patch -p0' o uniscilo manualmente se fallisce

Questo metodo funziona per me sul mio Sony Vaio SVS.

PS: Riproduzione della patch qui nel caso in cui il file venga eliminato in futuro:

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 @@ if [-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 "disk"> / sys / power / state
+ RET = $?
+ echo -n "$ HIBERNATE_MODE_SAVE"> / sys / power / disk
+ ritorna "$ RET"
+}
+ fi
+
+ # per i kernel che supportano la sospensione di entrambi (ovvero la sospensione ibrida)
+ # dal kernel 3.6
+ if [-z "$ SUSPEND_HYBRID_MODULE"] && \
+ [-f / sys / power / disk] && \
+ grep -q disk / sys / power / state && \
+ grep -q suspend / sys / power / disk; poi
+ SUSPEND_HYBRID_MODULE = "kernel"
+ do_suspend_hybrid ()
+ {
+ HIBERNATE_MODE = "sospendi"
+ do_hibernate
    }
 fi

fonti:


1
Hai ragione sulla sospensione ibrida. Di recente ho cambiato il mio frammento da solo. Puoi ottenere (quasi) lo stesso risultato usando METHOD = hibernate e HIBERNATE_MODE = suspend. Sto impostando HIBERNATE_MODE = piattaforma nella parte superiore del file, invece di salvare e ripristinare la versione precedente (cosa fa la patch). Aggiornerò la mia risposta sopra.
blueyed

Sembra fantastico, grazie per la modifica, @blueyed
Rohan Dhruva,

1

C'è un'altra soluzione senza aggiungere alcun file in config.d, usando semplicemente wakealarm in / sys / class / rtc / rtc0. Usa il codice obsoleto nelle funzioni pm (/ usr / lib / pm-utils) dopo i commenti # poiché il kernel non supporta direttamente ..., (quindi il kernel corrente (dopo 3.6 qualcosa) supporta direttamente). Ripristina quel codice e inserisci la parte do_suspend () invece di do_suspend_hybrid () e usa la patch per le funzioni pm (fino a quando non lo risolvono).

Codice obsoleto (sospendi quindi ibernazione quando viene chiamato 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

Consigliato. Ancora più facile da usare uswsusp mentre allo stesso tempo massimizza il vantaggio di s2both, ovvero s2both quando viene sospeso. Inserisci il codice ripristinato nella parte do_suspend () del modulo uswsusp (/usr/lib/pm-utils/module.d).

Codice ripristinato (suspend_hybrid quando viene chiamato 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      

Con uswsusp, possiamo vedere l'avanzamento della sospensione / ibernazione e il processo inverso visualizzati nel testo, anche se possiamo interromperlo premendo backspace. Senza uswsusp, la sospensione / ibernazione appare e scompare in modo fastidioso, specialmente quando viene attivato il wakealarm ed esegue l'ibernazione (disco s2 in uswsusp). Impostare il periodo di sospensione prima dell'ibernazione nella solita posizione sul file delle funzioni pm.

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

Ecco la mod uswsusp: (ricorda, questo modulo è chiamato dalle funzioni pm quindi le variabili inserite sono le stesse)

#!/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

La risposta dell'utente68186 per Ubuntu 16.04 non ha funzionato per me. Tuttavia, la soluzione qui ha fatto.

Innanzitutto, assicurati che il letargo funzioni. Poi

Cerca e installa dconf Editor nel software Ubuntu. Quindi avvialo e vai su org -> gnome -> daemon delle impostazioni -> plugin -> potenza.

Modificare il valore di "coperchio-chiusura-azione-ac" e "coperchio-chiusura-azione-batteria".

Nelle mie impostazioni di risparmio energia, queste opzioni appaiono vuote, ma funzionano come previsto.


0

In Ubuntu 18.04 è molto più semplice. In systemd è disponibile una nuova modalità suspend-then-hibernate . Per iniziare a utilizzare questa funzione è necessario creare un file /etc/systemd/sleep.conf con il contenuto successivo:

[Sleep]
HibernateDelaySec=3600

Quindi puoi testarlo con il comando:

sudo systemctl suspend-then-hibernate

(è possibile modificare HibernateDelaySec per ridurre il ritardo alla sospensione). Se tutto funziona correttamente, è possibile modificare l'azione di chiusura del coperchio, per farlo è necessario modificare il file /etc/systemd/logind.conf

È necessario trovare l'opzione HandleLidSwitch = , decommentarlo e passare a HandleLidSwitch = suspend-then-hibernate . Quindi è necessario riavviare il servizio logind (wirning! La sessione utente verrà riavviata) dal comando successivo:

systemctl restart systemd-logind.service

È tutto! Ora puoi usare questa bella funzione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.