Como uso o pm-suspend-hybrid por padrão, em vez do pm-suspend?

41

Eu gostaria de usar o método de suspensão híbrida em vez de suspender ao fechar a tampa ou selecionar "Suspender" no menu.

Posso imaginar alterar o script pm-suspend para fazê-lo automaticamente, mas pode haver uma maneira mais fácil de manter / manter.

azulado
fonte

Respostas:

44

Sono híbrido indireto

Este é o método mais antigo: primeiro suspenda e depois ative a hibernação após um atraso (15 minutos por padrão). Use isso com um kernel Linux anterior à 3.6 ou, se preferir, ele não usa mais energia após 15 minutos.

Adicione o arquivo /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

Convém garantir que o método híbrido seja suportado no seu sistema através do código a seguir. Se diz "0", deve funcionar:

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

Suspensão híbrida real com Linux 3.6+

Se você possui um kernel do Linux 3.6, pode usar o seguinte, que será suspenso no disco e na RAM desde o início.

Adicione o arquivo /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

Isso sempre gravará a imagem no disco e depois será suspensa na RAM, com os benefícios de que a retomada será sempre rápida (contanto que a bateria não acabe) e que a máquina não acorde por um curto período de tempo (após PM_HIBERNATE_DELAY) hibernar de verdade.

A desvantagem é que o processo leva mais tempo (porque sempre hiberna para o disco) e que sua bateria pode acabar a longo prazo (por exemplo, após 12 horas).

azulado
fonte
2
uma pequena nota, em vez de 'sudo pm-é suportado --suspend-hybrid && echo $?', use 'sudo pm-é suportado --suspend-hybrid; eco $? como o valor de retorno de pm-é-suportado é 0 para é suportado e 1 para não é.
James Caccese 03/08/2012
1
@ JamesCaccese: No mundo do shellscript, 0 significa "verdadeiro" e qualquer outra coisa significa "falso". Seu scriptlet funcionaria, mas o scriptlet do pôster original também funcionaria como pretendido, imprimindo um '0' no suportado e nada no não suportado. Se você deseja algo que sempre diga suporte ou não, tente 'sudo pm-is-supported --suspend-hybrid && echo "supported" || eco "não suportado" '
zanfur 28/10/12
@zanfur - Embora eu goste da sua solução fornecida subsequente para imprimir os dois estados (e nada por qualquer motivo inesperado , o suporte a pm-não seja executado conforme o esperado, isso faria coisas desconhecidas no estado de erro ), eu aprecio a menção de James Caccese a essa ressalva, pelo motivo acima mencionado .
user66001
Se você estiver usando o 16.04, veja esta resposta abaixo.
kapad
A única peça que faltava para mim era a resumediscussão /etc/default/grub.conf. Também como usuário da nvidia eu tive que definir nomodeset. Então, resultando entrada grub no meu caso é: GRUB_CMDLINE_LINUX_DEFAULT="nomodeset resume=UUID=uuidofswappartition". Não se esqueça grub-update. E também alguns módulos tem de ser descarregado de modo criado arquivo /etc/pm/config.d/00-unload_modulescom linha SUSPEND_MODULES="ath5k r8169"e apenas para ter certeza que eu também renomeado 00-use-suspender-híbrido para10-use-suspend-hybrid
mauron85
31

Ubuntu 18.04 uma opção programada

No Ubuntu 18.04 tem uma nova opção programada. Em systemdé availiable um modo novo suspend-then-hibernate. Isso começará com o modo de suspensão e depois passará para o modo de hibernação após um tempo fixo.

No hybrid-sleepmodo, a parte de hibernação só é efetiva quando a bateria está criticamente baixa e o sistema é desligado.

Para começar a usar esta função, você precisa criar um arquivo /etc/systemd/sleep.confcom o próximo conteúdo:

[Sleep]
HibernateDelaySec=3600

Isso vai do sono para a hibernação após 1 hora de sono. Você pode editar HibernateDelaySecpara alterar o atraso para hibernar.

Primeiro, teste se suspender e hibernar funciona usando o systemd

Abra um terminal pressionando Ctrl+ Alt+ Te digite:

sudo systemctl suspend-then-hibernate

Se funcionar, torne-o permanente.

  • O seguinte funciona quando fecho a tampa .

Abra o arquivo /etc/systemd/logind.confusando seu editor preferido. Você precisará chamar seu poder administrativo por sudo, gksudoou pkexeceditar este arquivo.

Encontre as duas linhas:

#HandleSuspendKey=suspend
#HandleLidSwitch=suspend

Observe que essas linhas são comentadas #na frente delas. A suspendé a ação padrão. Remova #e altere suspendpara suspend-then-hibernatenessas duas linhas para que fiquem assim:

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

Salve o arquivo. Efetue logout e efetue login novamente ou reinicie o logindserviço pelo comando:

systemctl restart systemd-logind.service

Atenção! sua sessão de usuário será reiniciada

Fonte: Tampa Fechada Suspender e Hibernar

Ubuntu 16.04 e superior

A solução por blueyed para o híbrido real suspensão com Linux 3.6+ não funcionou para mim. Eu suspeito que isso ocorre porque o Ubuntu 16.04 usa systemde não usa o arquivo /etc/pm/config.d/00-use-suspend-hybrid.

Primeiro, teste se hibernação e sono híbrido funcionam usando o systemd

Abra um terminal pressionando Ctrl+ Alt+ Te digite:

sudo systemctl hibernate

Isso deve fazer o seu computador hibernar. Para tentar o sono híbrido, digite:

sudo systemctl hybrid-sleep

Se funcionar, torne-o permanente.

  • O seguinte funciona quando fecho a tampa .

Abra o arquivo /etc/systemd/logind.confusando seu editor preferido. Você precisará chamar seu poder administrativo por sudo, gksudoou pkexeceditar este arquivo.

Encontre as duas linhas:

#HandleSuspendKey=suspend
#HandleLidSwitch=suspend

Observe que essas linhas são comentadas #na frente delas. A suspendé a ação padrão. Remova #e altere suspendpara hybrid-sleepnessas duas linhas para que fiquem assim:

HandleSuspendKey=hybrid-sleep
HandleLidSwitch=hybrid-sleep

Salve o arquivo. Saia e faça login novamente.

Nota:

  • Diferente de suspendou hybrid-sleepexiste uma terceira opção hibernate,.
  • Meu laptop não possui um botão de suspensão física. Então eu não pude testar.
  • Clicar no Suspendmenu de engrenagem coloca o computador em suspensão normal, não em suspensão híbrida.

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

Eu espero que isso ajude

user68186
fonte
2
Esta resposta precisa de mais votos. Problemas corrigidos para mim no 16.04. Obrigado.
kapad
Você é bem vindo. Agora que mudei de 14.04 para 16.04, estou encontrando a nova maneira sistemática de fazer as coisas, lentamente ao longo do tempo.
user68186
1
Também funciona com o Ubuntu GNOME 16.04.1
HarlemSquirrel
4

Na versão 12.04, notei que, quando a hibernação é acionada (usando PM_HIBERNATE_DELAY=XX), o resumo / descongelamento dos scripts do shell não desativa a variável grub recordfail. Portanto, o grub não inicializa automaticamente.

O tempo limite é definido como -1 e aguarda a seleção do usuário. Eu estou supondo que isso requer alguma edição de scripts no /etc/pm/sleep.d/10_grub-common. Sou novato, por isso não me interessou em descobrir a mudança exata, infelizmente.

bo o que
fonte
1
Provavelmente valeria a pena um relatório de bug e / ou teste, se funcionar em 12.10+.
blueyed
Eu vejo o mesmo problema em 12.10
MDCore 16/12/12
3

Essa pergunta surge com bastante frequência no Google e acho que vale a pena esbarrar. O método descrito aqui (imo) não é suspensão híbrida. É "hibernado após X minutos em suspensão". A suspensão híbrida verdadeira grava sua RAM no disco e entra em estado de baixa energia (modo de suspensão). Enquanto leva mais tempo, o resumo é instantâneo enquanto a máquina está com a bateria restante, caso contrário, retoma o disco rígido. Esse comportamento é o que a maioria das pessoas chama de suspensão híbrida e é usado por padrão nos laptops Windows e Mac mais recentes.

Veja como habilitar a suspensão híbrida real :

  • Siga a primeira parte da resposta superior. Isso substitui a chamada "suspend" para fazer um "hybrid_suspend" no pm-utils.
    % cat /etc/pm/config.d/00-use-suspend-hybrid
    # Sempre use suspend_hybrid em vez de suspend
    if ["$ METHOD" = "suspender"]; então
        MÉTODO = suspend_hybrid
    fi
  • Faça um backup de / usr / lib / pm-utils / pm-functions
  • Obtenha o patch aqui: https://bugs.freedesktop.org/attachment.cgi?id=68712
    • Este patch permite a suspensão híbrida, se disponível (ou seja, no kernels 3.6+)
  • Aplique-o usando 'patch -p0' ou mescle-o manualmente se houver falha

Este método funciona para mim no meu Sony Vaio SVS.

PS: Reproduzindo o patch aqui, caso o arquivo seja excluído no 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 / energia / disco) && \
+ HIBERNATE_MODE_SAVE = "$ {HIBERNATE_MODE_SAVE ## * [}" && \
+ HIBERNATE_MODE_SAVE = "$ {HIBERNATE_MODE_SAVE %%] *}" && \
        echo -n "$ {HIBERNATE_MODE}"> / sys / power / disk
        eco -n "disco"> / sys / power / state
+ RET = $?
+ echo -n "$ HIBERNATE_MODE_SAVE"> / sys / power / disk
+ retornar "$ RET"
+}
+ fi
+
+ # para kernels que suportam suspensão para ambos (ie suspensão híbrida)
+ # desde o kernel 3.6
+ se [-z "$ SUSPEND_HYBRID_MODULE"] && \
+ [-f / sys / power / disk] && \
+ grep -q disco / sys / power / state && \
+ grep -q suspend / sys / power / disk; então
+ SUSPEND_HYBRID_MODULE = "kernel"
+ do_suspend_hybrid ()
+ {
+ HIBERNATE_MODE = "suspender"
+ do_hibernate
    }
 fi

Fontes:

Rohan Dhruva
fonte
1
Você está certo sobre a suspensão híbrida. Recentemente, mudei meu snippet. Você pode obter (quase) o mesmo resultado usando METHOD = hibernate e HIBERNATE_MODE = suspend. Estou definindo HIBERNATE_MODE = platform na parte superior do arquivo, em vez de salvar e restaurar a versão anterior (o que o patch faz). Vou atualizar minha resposta acima.
blueyed
Isso parece ótimo, obrigado pela edição, @blueyed
Rohan Dhruva
1

Existe outra solução sem adicionar nenhum arquivo no config.d, apenas usando o wakealarm em / sys / class / rtc / rtc0. Faça uso de código obsoleto nas funções pm (/ usr / lib / pm-utils) após os comentários #since o kernel não suporta diretamente ..., ('porque o kernel atual (após algo de 3.6) suporta diretamente). Reverta esse código e insira a parte do_suspend () em vez de do_suspend_hybrid () e use o patch para pm-functions (até que eles o consertem).

Código obsoleto (suspenda e hiberne quando o suspend_hybrid for chamado):

# 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

Recomendado. Ainda mais fácil de usar uswsusp, ao mesmo tempo, maximiza os benefícios do s2both, ou seja, s2both ao suspender. Coloque o código revertido na parte do_suspend () do módulo uswsusp (/usr/lib/pm-utils/module.d).

Código revertido (suspend_hybrid quando a suspensão é chamada):

        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      

Com uswsusp, podemos ver o progresso de suspender / hibernar e o processo inverso exibido no texto, até podemos abortá-lo pressionando backspace. Sem o uswsusp, suspender / hibernar apenas parece desaparecer irritantemente, especialmente quando o wakealarm é acionado e executa o hibernar (s2disk em uswsusp). Defina o período de suspensão antes da hibernação no local usual no arquivo pm-functions.

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

Aqui está o mod uswsusp: (lembre-se, este módulo é chamado de pm-functions para que as variáveis ​​inseridas sejam as mesmas)

#!/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  
marca
fonte
0

A resposta do user68186 para o Ubuntu 16.04 não funcionou para mim. No entanto, a solução aqui foi.

Primeiro, verifique se a hibernação funciona. Então

Procure e instale o dconf Editor no Ubuntu Software. Em seguida, inicie-o e navegue até org -> gnome -> daemon de configurações -> plugins -> poder.

Altere o valor de "tampa-fechar-ação-ac" e "tampa-fechar-ação-bateria".

Nas minhas configurações de energia, essas opções aparecem em branco, mas funcionam conforme o esperado.

qwr
fonte
0

No Ubuntu 18.04, é muito mais fácil. No systemd está disponível um novo modo de suspensão e hibernação . Para começar a usar esta função, você precisa criar um arquivo /etc/systemd/sleep.conf com o próximo conteúdo:

[Sleep]
HibernateDelaySec=3600

Então você pode testá-lo por comando:

sudo systemctl suspend-then-hibernate

(você pode editar o HibernateDelaySec para reduzir o atraso na hibernação). Se tudo funcionar bem, você pode alterar a ação Fechar tampa, para isso, é necessário editar o arquivo /etc/systemd/logind.conf

Você precisa encontrar a opção HandleLidSwitch = , descomente-a e mude para HandleLidSwitch = suspend-then-hibernate . Em seguida, você precisa reiniciar o serviço de logind (a sessão wirning! You user será reiniciada) pelo próximo comando:

systemctl restart systemd-logind.service

Isso é tudo! Agora você pode usar esta boa função.

PRIHLOP
fonte