Respuestas:
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 $?
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).
resume
discusió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_modules
con línea SUSPEND_MODULES="ath5k r8169"
y solo para asegurarse de que también 10-use-suspend-hybrid
En Ubuntu 18.04 tiene una nueva opción temporizada. En systemd
está 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-sleep
modo, 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.conf
con el siguiente contenido:
[Sleep]
HibernateDelaySec=3600
Esto pasará del sueño a hibernar después de 1 hora de sueño. Puede editar HibernateDelaySec
para 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.
Abra el archivo /etc/systemd/logind.conf
con su editor preferido. Usted tendrá que invocar el poder administrativo por sudo
, gksudo
o pkexec
para 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 suspend
es la acción predeterminada. Elimine #
y cambie suspend
a suspend-then-hibernate
en 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 logind
servicio con el comando:
systemctl restart systemd-logind.service
¡advertencia! tu sesión de usuario se reiniciará
Fuente: tapa cerrada, luego suspensión, hibernación
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 systemd
y 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.
Abra el archivo /etc/systemd/logind.conf
con su editor preferido. Usted tendrá que invocar el poder administrativo por sudo
, gksudo
o pkexec
para 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 suspend
es la acción predeterminada. Elimine #
y cambie suspend
a hybrid-sleep
en 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:
suspend
o hybrid-sleep
hay una tercera opción, hibernate
.Suspend
menú del engranaje, la computadora se pone en suspensión normal, no en suspensión híbrida.espero que esto ayude
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.
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 :
% 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
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:
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
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.
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.