Hibernación usando systemctl
y haciendo que funcione en casos difíciles
Para mí, pm-hibernate
siempre falla. Después de algunos ajustes, pude hibernar usando la interfaz de systemd (sistema init en 16.04 y superior). También logré hacerlo funcionar en 17.04 con un archivo de intercambio. Este estudio de caso puede ser útil para otras personas con problemas.
Primer intento:
sudo systemctl hibernate
Si eso falla, comience la solución de problemas: en el estado de hibernación (HTD o ACPI S4), el estado de la máquina se escribe en el disco para que no se necesite energía para preservarlo. El estado se escribe en una partición de intercambio o en un archivo de intercambio. Nota: si usa BTRFS NO intente usar un archivo de intercambio ya que esto puede causar daños en el sistema de archivos
Es posible que su partición de intercambio o archivo de intercambio tenga que ser del mismo tamaño que la RAM para permitir la hibernación, pero existe una buena posibilidad de que pueda hibernar si es al menos 2/5 del tamaño de la RAM, según la página wiki de Arch , intente otros pasos primero antes de aumentar el tamaño de intercambio.
Si su problema es que obtiene un inicio limpio en lugar del currículum esperado, como mínimo probablemente necesite establecer un parámetro de inicio para encontrar la imagen del disco
Encuentra tu partición de intercambio:
grep swap /etc/fstab
para mí esto devuelve (salida parcial)
# swap was on /dev/mmcblk0p3 during installation
donde /dev/mmcblk0p3
es la partición para especificar
Agregue un parámetro de arranque:
sudoedit /etc/default/grub
A la línea de inicio GRUB_CMDLINE_LINUX_DEFAULT
agregue resume=/dev/YourSwapPartition
a la sección entre comillas (reemplace con la partición que identificó anteriormente). Usando mi ejemplo:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash resume=/dev/mmcblk0p3"
Cada vez que cambie este archivo, debe ejecutarlo sudo update-grub
o los cambios no tendrán efecto.
Ahora necesitas reiniciar. Entonces puede intentar hibernar, emitiendo el comando:
sudo systemctl hibernate
Para reanudar, presione el botón de encendido y el sistema se iniciará.
Si aún tiene problemas, comience a depurar.
Incluyo mi caso a continuación como ejemplo, pero se puede encontrar información detallada sobre la depuración de los estados S en este blog y también en este .
Establezca algunos parámetros de arranque más para capturar más información. Retire quiet
y splash
y añadir initcall_debug
y no_console_suspend
lo que hará que el sistema init llama a imprimir a la consola para que pueda ver lo que está mal. Establezco esto:
GRUB_CMDLINE_LINUX_DEFAULT="resume=/dev/mmcblk0p3 no_console_suspend initcall_debug"
Lo que me ayudó a ver qué iba mal en el currículum vitae de la hibernación.
En mi caso, después del currículum perdí WiFi, y el kernel claramente estaba molesto ya que la mayoría de los comandos (por ejemplo, leer cualquier cosa /sys
, recargar módulos o cualquier systemctl
comando) no funcionarían; el proceso parece comenzar y simplemente colgarse (todo esto sería volvió a la normalidad después del reinicio, por supuesto). Al observar que el sistema se apagaba muy lentamente y leer todos los mensajes de depuración, noté que había muchos problemas con "brcm", así que supuse que mi culpa era del módulo de controlador inalámbrico Broadcom. Efectivamente, ajusté mi procedimiento de hibernación para descargar el módulo primero:
sudo modprobe -r brcmfmac
sudo systemctl hibernate
en el currículum reinserto el módulo
sudo modprobe brcmfmac
Y todo funcionó a la perfección. También tengo que poner en la lista negra el btsdio
módulo que parece ser incompatible conbrcmfmac
Actualización: Hibernación utilizando un archivo de intercambio en 17.04.
Una vez más, con la ayuda de la página wiki de Arch y algunos ajustes adicionales, logré que la hibernación funcione en 17.04 con un archivo de intercambio. Esto requería un parámetro de arranque adicional, resume_offset=n
donde n es el primer número bajo physical_offset
en la salida de sudo filefrag -v /swapfile
:
$ sudo filefrag -v /swapfile
Filesystem type is: ef53
File size of /swapfile is 1425873920 (348114 blocks of 4096 bytes)
ext: logical_offset: physical_offset: length: expected: flags:
0: 0.. 32767: 34816.. 67583: 32768:
1: 32768.. 63487: 67584.. 98303: 30720:
....
Por lo tanto, el parámetro de arranque adicional en mi caso es resume_offset=34816
. Aún necesita establecer un parámetro de arranque para que la partición se reanude. Esta será la partición raíz (o cualquier partición en la que se encuentre su archivo de intercambio) Mis parámetros son ahora:
GRUB_CMDLINE_LINUX_DEFAULT="no_console_suspend initcall_debug resume=/dev/mmcblk1p2 resume_offset=34816"
¿Dónde /dev/mmcblk1p2
está mi partición raíz (es más probable que sea la suya /dev/sda2
)?
Durante la reanudación, vi que la imagen se cargaba correctamente, pero en mi caso (solo un ejemplo: YMMVAPD), luego algunos controladores más ( i2c_designware
) arrojaron algunos errores y obtuve un congelamiento completo del sistema en la reanudación. La hibernación también funciona si descargo esos módulos brcmfmac
, pero el sistema se vuelve rápidamente inutilizable sin esos módulos. Por lo tanto, hice una especie de secuencia de comandos para descargar los módulos con errores e inmediatamente reinsertarlos en el currículum:
# remove buggy modules
modprobe -r brcmfmac i2c_designware_platform i2c_designware_core &&
# hibernate
echo disk > /sys/power/state
# reinsert
modprobe i2c_designware_core i2c_designware_platform brcmfmac
Cuando quiero hibernar, corro sudo bash script
. Esto funciona muy bien.
TL; DR
Utilice systemd, establezca un parámetro de arranque para reanudar desde el intercambio, identifique los controladores con errores y descárguelos antes de iniciar la hibernación. Si el sistema no puede funcionar por mucho tiempo sin esos módulos o si necesita descargar varios, puede ser más fácil usar un script simple para iniciar la hibernación.