¿Cómo uso pm-suspend-hybrid de forma predeterminada en lugar de pm-suspend?

41

Me gustaría utilizar el método híbrido de suspensión en lugar de suspender al cerrar la tapa o seleccionar "Suspender" del menú.

Puedo imaginar cambiar el script pm-suspend para hacerlo automáticamente, pero puede haber una manera más fácil de mantener.

azulado
fuente

Respuestas:

44

Sueño híbrido indirecto

Este es el método más antiguo: primero suspender y luego despertar para hibernar después de un retraso (15 minutos por defecto). Úselo con un kernel de Linux anterior a 3.6, o si le gusta, ya no usa energía después de 15 minutos.

Agrega el archivo /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

Es posible que desee asegurarse de que el método híbrido sea compatible con su sistema a través del siguiente código. Si dice "0" debería funcionar:

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

Suspensión híbrida real con Linux 3.6+

Si tiene un núcleo Linux 3.6, puede usar lo siguiente, que se suspenderá tanto en el disco como en la RAM desde el principio.

Agrega el archivo /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

Esto siempre escribirá la imagen en el disco y luego se suspenderá en la RAM, con los beneficios de que la reanudación siempre será rápida (siempre que la batería no se agote) y que la máquina no se despierte por un corto tiempo (después de PM_HIBERNATE_DELAY) hibernar de verdad.

El inconveniente es que el proceso lleva más tiempo (porque siempre hiberna en el disco) y que la batería puede agotarse a largo plazo (por ejemplo, después de 12 horas).

azulado
fuente
2
una pequeña nota, en lugar de 'sudo pm-is-support --suspend-hybrid && echo $?', use 'sudo pm-is-support --suspend-hybrid; echo $? como el valor de retorno de pm-is-support es 0 para se admite y 1 para no.
James Caccese
1
@JamesCaccese: en el mundo shellscript, 0 significa "verdadero" y cualquier otra cosa significa "falso". Su scriptlet funcionaría, pero el scriptlet del póster original también funcionaría según lo previsto, imprimiendo un '0' en compatible y nada en no compatible. Si desea algo que siempre diga admitido o no admitido, pruebe 'sudo pm-is-support --suspend-hybrid && echo "support" || echo "no compatible" '
zanfur
@zanfur - Si bien me gusta su solución suministrada posterior para imprimir ambos estados (y nada por cualquier razón inesperada pm-is-support no se ejecuta como se esperaba, eso haría cosas desconocidas para el estado de error ), agradezco la mención de James Caccese de esa advertencia, por la razón antes mencionada .
user66001
Si usa 16.04, vea esta respuesta a continuación.
kapad
La única pieza que faltaba para mí era la resumediscusión /etc/default/grub.conf. También como usuario de nvidia tuve que configurar nomodeset. Por lo que resulta entrada de GRUB en mi caso es: GRUB_CMDLINE_LINUX_DEFAULT="nomodeset resume=UUID=uuidofswappartition". No se olvide grub-update. Y también algunos módulos deben descargarse para crear un archivo /etc/pm/config.d/00-unload_modulescon línea SUSPEND_MODULES="ath5k r8169"y solo para asegurarse de que también 10-use-suspend-hybrid
cambié el
31

Ubuntu 18.04 una opción cronometrada

En Ubuntu 18.04 tiene una nueva opción temporizada. En systemdestá disponible un nuevo modo suspend-then-hibernate. Esto comenzará con el modo de suspensión y luego pasará al modo de hibernación después de un tiempo fijo.

En el hybrid-sleepmodo, la parte de hibernación se hace efectiva solo cuando la batería está muy baja y el sistema se apaga.

Para comenzar a usar esta función, debe crear un archivo /etc/systemd/sleep.confcon el siguiente contenido:

[Sleep]
HibernateDelaySec=3600

Esto pasará del sueño a hibernar después de 1 hora de sueño. Puede editar HibernateDelaySecpara cambiar el retraso para hibernar.

Primero, pruebe si suspender-luego-hibernar funciona usando systemd

Abra una terminal presionando Ctrl+ Alt+ Te ingrese:

sudo systemctl suspend-then-hibernate

Si funciona hazlo permanente.

  • Lo siguiente funciona cuando cierro la tapa .

Abra el archivo /etc/systemd/logind.confcon su editor preferido. Usted tendrá que invocar el poder administrativo por sudo, gksudoo pkexecpara editar este archivo.

Encuentra las dos líneas:

#HandleSuspendKey=suspend
#HandleLidSwitch=suspend

Tenga en cuenta que estas líneas se comentan #delante de ellas. La suspendes la acción predeterminada. Elimine #y cambie suspenda suspend-then-hibernateen estas dos líneas para que se vean así:

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

Guarda el archivo. Cierre sesión y vuelva a iniciar sesión o reinicie el logindservicio con el comando:

systemctl restart systemd-logind.service

¡advertencia! tu sesión de usuario se reiniciará

Fuente: tapa cerrada, luego suspensión, hibernación

Ubuntu 16.04 y superior

La solución de blueyed para la suspensión híbrida real con Linux 3.6+ no funcionó para mí. Sospecho que esto se debe a que Ubuntu 16.04 usa systemdy no usa el archivo /etc/pm/config.d/00-use-suspend-hybrid.

Primero, pruebe si hibernate y hybrid-sleep funcionan usando systemd

Abra una terminal presionando Ctrl+ Alt+ Te ingrese:

sudo systemctl hibernate

Esto debería hacer que su computadora hiberne. Para probar el sueño híbrido, ingrese:

sudo systemctl hybrid-sleep

Si funciona hazlo permanente.

  • Lo siguiente funciona cuando cierro la tapa .

Abra el archivo /etc/systemd/logind.confcon su editor preferido. Usted tendrá que invocar el poder administrativo por sudo, gksudoo pkexecpara editar este archivo.

Encuentra las dos líneas:

#HandleSuspendKey=suspend
#HandleLidSwitch=suspend

Tenga en cuenta que estas líneas se comentan #delante de ellas. La suspendes la acción predeterminada. Elimine #y cambie suspenda hybrid-sleepen estas dos líneas para que se vean así:

HandleSuspendKey=hybrid-sleep
HandleLidSwitch=hybrid-sleep

Guarda el archivo. Cerrar sesión y volver a iniciar sesión.

Nota:

  • Aparte de suspendo hybrid-sleephay una tercera opción, hibernate.
  • Mi computadora portátil no tiene un botón de suspensión física. Entonces no pude probarlo.
  • Al hacer clic en el Suspendmenú del engranaje, la computadora se pone en suspensión normal, no en suspensión híbrida.

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

espero que esto ayude

usuario68186
fuente
2
Esta respuesta necesita más votos a favor. Problemas resueltos para mí en 16.04. Gracias.
kapad
De nada. Ahora que me he mudado del 14.04 al 16.04, estoy encontrando la nueva forma del sistema de hacer las cosas, lentamente con el tiempo.
user68186
1
También funciona con Ubuntu GNOME 16.04.1
HarlemSquirrel
4

En 12.04 noté que cuando se activa la hibernación (usando PM_HIBERNATE_DELAY=XX), la reanudación / descongelación de los scripts de shell no desarma la variable grub recordfail. Por lo tanto, grub no se inicia automáticamente.

El tiempo de espera se establece en -1 y espera la selección del usuario. Supongo que esto requiere editar algunas secuencias de comandos /etc/pm/sleep.d/10_grub-common. Soy un novato, así que desafortunadamente no he podido averiguar el cambio exacto.

bo que
fuente
1
Valdría la pena un informe de error probablemente y / o prueba si funciona en 12.10+.
azulado
Veo el mismo problema en 12.10
MDCore
3

Esta pregunta surge con suficiente frecuencia en Google que creo que vale la pena toparse. El método descrito aquí es (imo) no suspensión híbrida. Es "hibernar después de X minutos en suspensión". La suspensión híbrida verdadera escribe su RAM en el disco y luego pasa a un estado de baja potencia (modo de suspensión). Si bien lleva más tiempo, la reanudación es instantánea mientras la máquina tiene batería restante, de lo contrario se reanuda desde el disco duro. Este comportamiento es lo que la mayoría de la gente conoce como suspensión híbrida, y se usa por defecto en las computadoras portátiles más nuevas de Windows y Mac.

Aquí se explica cómo habilitar la suspensión híbrida real :

  • Sigue la primera parte de la respuesta superior. Esto anula la llamada "suspender" para hacer un "híbrido_suspendido" en pm-utils.
    % cat /etc/pm/config.d/00-use-suspend-hybrid
    # Utilice siempre suspend_hybrid en lugar de suspender
    if ["$ METHOD" = "suspender"]; luego
        MÉTODO = suspender_híbrido
    fi
  • Haga una copia de seguridad de / usr / lib / pm-utils / pm-functions
  • Obtenga el parche desde aquí: https://bugs.freedesktop.org/attachment.cgi?id=68712
    • Este parche habilita la suspensión híbrida si está disponible (es decir, en núcleos 3.6+)
  • Aplíquelo usando 'patch -p0' o combínelo manualmente si eso falla

Este método funciona para mí en mi Sony Vaio SVS.

PD: Reproduciendo el parche aquí en caso de que el archivo se elimine en el 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 "disco"> / sys / power / state
+ RET = $?
+ echo -n "$ HIBERNATE_MODE_SAVE"> / sys / power / disk
+ volver "$ RET"
+}
+ fi
+
+ # para núcleos que admiten la suspensión a ambos (es decir, suspensión híbrida)
+ # desde kernel 3.6
+ if [-z "$ SUSPEND_HYBRID_MODULE"] && \
+ [-f / sys / power / disk] && \
+ grep -q disk / sys / power / state && \
+ grep -q suspend / sys / power / disk; luego
+ SUSPEND_HYBRID_MODULE = "kernel"
+ do_suspend_hybrid ()
+ {
+ HIBERNATE_MODE = "suspender"
+ do_hibernate
    }
 fi

Fuentes:

Rohan Dhruva
fuente
1
Tienes razón sobre la suspensión híbrida. Recientemente he cambiado mi fragmento yo mismo. Puede obtener (bastante) el mismo resultado utilizando METHOD = hibernate y HIBERNATE_MODE = suspend. Estoy configurando HIBERNATE_MODE = plataforma en la parte superior del archivo, en lugar de guardar y restaurar la versión anterior (lo que hace el parche). Actualizaré mi respuesta anterior.
azulado
Eso se ve genial, gracias por la edición, @blueyed
Rohan Dhruva
1

Hay otra solución sin agregar ningún archivo en config.d, simplemente usando wakealarm en / sys / class / rtc / rtc0. Utilice el código obsoleto en las funciones pm (/ usr / lib / pm-utils) después de los comentarios # dado que el núcleo no admite directamente ..., (porque el núcleo actual (después de 3.6 algo) sí admite directamente). Revierta ese código y coloque la parte do_suspend () en lugar de do_suspend_hybrid (), y use el parche para las funciones pm (hasta que lo arreglen).

Código obsoleto (suspender e hibernar cuando se invoca 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

Recomendado. Aún más fácil de usar uswsusp mientras que al mismo tiempo maximiza el beneficio de s2both, es decir, s2both cuando se suspende. Ponga el código revertido en do_suspend () parte del módulo uswsusp (/usr/lib/pm-utils/module.d).

Código revertido (suspend_hybrid cuando se llama a suspender):

        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, podemos ver el progreso de la suspensión / hibernación y el proceso inverso que se muestra en el texto, incluso podemos abortarlo presionando la tecla de retroceso. Sin uswsusp, suspender / hibernar simplemente aparece-desaparece de manera molesta, especialmente cuando se activa wakealarm y ejecuta hibernate (s2disk en uswsusp). Establezca el período de sueño antes de hibernar en el lugar habitual en el archivo pm-functions.

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

Aquí está el mod uswsusp: (recuerde, este módulo se llama desde las funciones pm, por lo que las variables insertadas son las mismas)

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

La respuesta de user68186 para Ubuntu 16.04 no funcionó para mí. Sin embargo, la solución aquí sí.

Primero, asegúrese de que la hibernación funcione. Luego

Busque e instale dconf Editor en el software Ubuntu. Luego ejecútalo y navega a org -> gnome -> settings daemon -> plugins -> power.

Cambie el valor de "lid-close-ac-action" y "lid-close-battery-action".

En mi configuración de energía, estas opciones aparecen en blanco, pero funcionan según lo previsto.

qwr
fuente
0

En Ubuntu 18.04 es mucho más fácil. En systemd está disponible un nuevo modo suspender-luego-hibernar . Para comenzar a utilizar esta función, debe crear un archivo /etc/systemd/sleep.conf con el siguiente contenido:

[Sleep]
HibernateDelaySec=3600

Entonces puedes probarlo por comando:

sudo systemctl suspend-then-hibernate

(puede editar HibernateDelaySec para reducir el retraso para hibernar). Si todo funciona bien, puede cambiar la Acción de cierre de la tapa, para hacerlo debe editar el archivo /etc/systemd/logind.conf

Necesita encontrar la opción HandleLidSwitch = , descomentarla y cambiar a HandleLidSwitch = suspender-luego-hibernar . Luego debe reiniciar el servicio de inicio de sesión (¡wirning! Su sesión de usuario se reiniciará) mediante el siguiente comando:

systemctl restart systemd-logind.service

¡Eso es todo! Ahora puedes usar esta bonita función.

PRIHLOP
fuente