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

41

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

Posso imaginar alterar o script pm-suspend para fazer isso automaticamente, mas pode haver uma maneira mais fácil e mais fácil de manter.

    
por blueyed 02.06.2012 / 12:38

7 respostas

44

Sono híbrido indireto

Este é o método mais antigo: primeiro suspender e depois acordar para hibernar após um atraso (15 minutos por padrão). Use isto com um kernel Linux antes do 3.6, ou se você gosta disso, não usa mais energia depois de 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
% bl0ck_qu0te%

Suspensão híbrida real com o Linux 3.6 +

Se você tiver um kernel Linux 3.6, você pode usar o seguinte, que será suspenso para o disco e a 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 grava a imagem no disco e depois a suspende para a RAM, tendo os benefícios que a retomada será sempre rápida (contanto que a bateria não se esgote) e que a máquina não acorde por um curto período de tempo ( depois de PM_HIBERNATE_DELAY) para hibernar de verdade.

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

por blueyed 02.06.2012 / 22:52
29

Ubuntu 18.04 uma opção cronometrada

No Ubuntu 18.04 tem uma nova opção cronometrada. Em systemd está disponível um novo modo suspend-then-hibernate . Isso iniciará com o modo de suspensão e, em seguida, fará a transição para o modo de hibernação após um período fixo.

No modo hybrid-sleep , a parte de hibernação torna-se efetiva somente quando a bateria está criticamente baixa e o sistema é desligado.

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

[Sleep]
HibernateDelaySec=3600

Isto irá do modo de suspensão para o estado de hibernação após 1 hora de sono. Você pode editar HibernateDelaySec para alterar o atraso para hibernar.

Primeiro, teste se o suspend-then-hibernate funciona usando o systemd

Abra um terminal pressionando Ctrl + Alt + T e digite:

sudo systemctl suspend-then-hibernate

Se funcionar, torná-lo permanente.

  • Os seguintes itens funcionam quando fecho a tampa .

Abra o arquivo /etc/systemd/logind.conf usando seu editor preferido. Você precisará invocar seu poder administrativo por sudo , gksudo ou pkexec para editar este arquivo.

Encontre as duas linhas:

#HandleSuspendKey=suspend
#HandleLidSwitch=suspend

Observação: essas linhas são comentadas com # na frente delas. O suspend é a ação padrão. Remova o # e altere suspend para suspend-then-hibernate nessas duas linhas para que elas fiquem assim:

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

Salve o arquivo. Efetue logout e login novamente ou reinicie o logind service pelo comando:

systemctl restart systemd-logind.service

aviso! sua sessão de usuário será reiniciada

Fonte: Tampa Fechada Suspender e Hibernar

Ubuntu 16.04 e acima

O solução por blueyed para suspensão híbrida Real com o Linux 3.6 + não trabalhe para mim. Eu suspeito que isso é porque o Ubuntu 16.04 usa systemd e não usa o arquivo /etc/pm/config.d/00-use-suspend-hybrid .

Primeiro, teste se o hibernate e o hybrid-sleep funcionam usando systemd

Abra um terminal pressionando Ctrl + Alt + T e digite:

sudo systemctl hibernate

Isso deve fazer com que o computador entre em hibernação. Para tentar o sono híbrido, digite:

sudo systemctl hybrid-sleep

Se funcionar, torná-lo permanente.

  • Os seguintes itens funcionam quando fecho a tampa .

Abra o arquivo /etc/systemd/logind.conf usando seu editor preferido. Você precisará invocar seu poder administrativo por sudo , gksudo ou pkexec para editar este arquivo.

Encontre as duas linhas:

#HandleSuspendKey=suspend
#HandleLidSwitch=suspend

Observação: essas linhas são comentadas com # na frente delas. O suspend é a ação padrão. Remova o # e altere suspend para hybrid-sleep nessas duas linhas para que elas fiquem assim:

HandleSuspendKey=hybrid-sleep
HandleLidSwitch=hybrid-sleep

Salve o arquivo. Faça logout e faça login novamente.

Nota:

  • Diferente de suspend ou hybrid-sleep , há 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 menu Suspend from the cog coloca o computador em suspender normal não sono híbrido.

Fonte: link

Espero que isso ajude

    
por user68186 05.06.2016 / 01:01
4

Em 12.04 notei que quando a hibernação é acionada (usando PM_HIBERNATE_DELAY=XX ), o currículo / descongelamento dos shell scripts não desanima a variável recordfail do grub. Portanto grub não autoboot.

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 em /etc/pm/sleep.d/10_grub-common . Sou um novato, então eu não tenho pensado em descobrir a mudança exata, infelizmente.

    
por bo what 31.10.2012 / 11:12
3

Esta questão surge com frequência suficiente no Google e acho que vale a pena bater. O método descrito aqui é (imo) não híbrido suspenso. É "hibernar após X minutos em suspensão". True hybrid suspend grava sua memória RAM no disco e entra em estado de baixa energia (modo de suspensão). Enquanto demora mais, o currículo é instantâneo enquanto a máquina está com a bateria, caso contrário, o disco rígido é retomado. Esse comportamento é o que a maioria das pessoas conhece como suspensão híbrida e usado por padrão nos laptops Windows e Mac mais recentes.

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

  • Siga a primeira parte da resposta principal. Isso substitui a chamada "suspend" para fazer um "hybrid_suspend" no pm-utils.
    % cat /etc/pm/config.d/00-use-suspend-hybrid
    # Always use suspend_hybrid instead of suspend
    if [ "$METHOD" = "suspend" ]; then
        METHOD=suspend_hybrid
    fi
  • Faça um backup de / usr / lib / pm-utils / pm-functions
  • Obtenha o patch daqui: link
    • Este patch ativa a suspensão híbrida, se disponível (ou seja, nos kernels 3.6 +)
  • Aplique-o usando 'patch -p0' ou mescle-o manualmente se isso falhar

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/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
+       return "$RET"
+   }
+fi
+
+# for kernels that support suspend to both (i.e. hybrid suspend)
+# since kernel 3.6
+if [ -z "$SUSPEND_HYBRID_MODULE" ] && \
+   [ -f /sys/power/disk ] && \
+   grep -q disk /sys/power/state && \
+   grep -q suspend /sys/power/disk; then
+   SUSPEND_HYBRID_MODULE="kernel"
+   do_suspend_hybrid()
+   {
+       HIBERNATE_MODE="suspend"
+       do_hibernate
    }
 fi

Fontes:

por Rohan Dhruva 13.09.2013 / 00:30
1

Existe outra solução sem adicionar nenhum arquivo no config.d, apenas usando o wakealarm em / sys / class / rtc / rtc0. Use código obsoleto em pm-functions (/ usr / lib / pm-utils) após os comentários #desde que o kernel não suporta diretamente ... (porque o kernel atual (após 3.6 algo) suporta diretamente). Reverta o código e coloque a parte do_suspend () ao invés do do_suspend_hybrid (), e use o patch para o pm-functions (até eles consertarem).

Código obsoleto (suspender e depois hibernar 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, enquanto o mesmo tempo maximizar o benefício de s2both, ou seja, s2both quando 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 suspend / hibernate e o processo reverso exibido no texto, até mesmo podemos abortá-lo pressionando backspace. Sem uswsusp, suspender / hibernar apenas aparecer - desaparecer irritantemente, especialmente quando o wakealarm é acionado e executar o hibernate (s2disk no uswsusp). Defina o período de suspensão antes do modo de hibernação no local habitual 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, então as variáveis inseridas são 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  
    
por mark 31.10.2013 / 14:14
0

No Ubuntu 18.04 , é muito mais fácil. Em systemd está disponível um novo modo suspend-then-hibernate . Para começar a usar essa 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 para hibernar). Se tudo funcionar bem você pode mudar o Lid Close Action, para isso você precisa editar o arquivo /etc/systemd/logind.conf

Você precisa encontrar a opção HandleLidSwitch = , descomente-a e mude para HandleLidSwitch = suspend-then-hibernate . Então você precisa reiniciar o serviço logind (wirning! Você sessão do usuário será reiniciado) pelo próximo comando:

systemctl restart systemd-logind.service

Isso é tudo! Agora você pode usar essa função legal.

    
por PRIHLOP 17.09.2018 / 00:18
0

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

Primeiro, garanta o funcionamento da hibernação. Então

% bl0ck_qu0te%

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

    
por qwr 22.01.2017 / 21:01