La hibernación es una característica de los sistemas operativos que permite que toda la memoria RAM se copie al disco duro de forma que, en el próximo reinicio del sistema, se cargue la memoria RAM del archivo previamente guardado sin necesidad de realizar el inicio del sistema de forma normal.
Con esto se consigue que no sea necesario cerrar ninguna sesión ni ningún programa que esté en ella y, la próxima vez que se arranque el ordenador, todas las aplicaciones estarán en el mismo estado que cuando lo hibernamos.
En Linux disponemos de esta opción desde el menú de apagado de la interfaz gráfica, por lo que basta hacer clic en el botón correspondiente para que nuestro sistema hiberne.
Pero, además de esta opción, en los sistemas Linux también tenemos un comando que realiza esta acción: hibernate.
Con este comando conseguimos hibernar el sistema desde una consola o desde un script de apagado automático de la máquina, para que en el próximo reinicio tengamos todas nuestras aplicaciones abiertas.
Pero la función hibernate no está exenta de sus riesgos. A mi los errores que me daba eran principalmente dos:
El primero es que si había varias hibernaciones seguidas, esto es, según termina de iniciar el sistema después de una hibernación realizar otra (mediante el comando), en el segundo reinicio después de esta hibernación, se producían errores en las aplicaciones debido a fallos de segmentación en alguna de las librerías que usaba (las que vi fueron libc.so y libdbus.so).
Me inclino a pensar que después del reinicio no sabía exactamente donde estaban localizadas las librerías en memoria y por eso fallaba. O, quizás el kernel de Linux tenga una función de posicionamiento aleatorio del código para evitar ataques y todavía no funciona todo lo bien que debería. Pero, como digo, esto son suposiciones. Además, después de un poco de uso normal, en las siguientes hibernaciones todo iba perfectamente.
El segundo de los problemas se producía con GRUB 2, el nuevo gestor de arranque que traen las distribuciones de Linux más modernas (en mi caso Ubuntu 9.10). GRUB 2 tiene un registro llamado recordfail que se fija a uno cuando el sistema arranca y a cero cuando se apaga correctamente. Si se apaga incorrectamente y recordfail queda a uno, en el siguiente reinicio no aparece el timeout del menú de inicio del sistema por lo que hay que seleccionar el sistema operativo a arrancar manualmente.
Con el comando hibernate, una vez que inicia de nuevo el sistema, no fija de nuevo la variable recordfail de GRUB 2 a uno, con lo que en los siguientes reinicios después de hibernar, siempre hay que seleccionar el sistema a arrancar de forma manual.
Para solucionar esto, hay que configurar el comando hibernate. El archivo de configuración, como es norma en sistemas Linux, está en /etc/hibernate/hibernate.conf. En este archivo hay que añadir las siguientes líneas:
LockGnomeScreenSaver true
OnResume 00 /etc/pm/sleep.d/10_grub-common thaw
La primera línea bloquea la sesión de Gnome con su salvapantallas (porque tampoco lo hace por defecto con lo que después del reinicio aparecía la sesión sin contraseña; un gran fallo de seguridad) y la segunda línea indica que se ejecute el archivo /etc/pm/sleep.d/10_grub-common con el parámetro thaw, que es el archivo que fija recordfail a cero en cada inicio correcto del sistema.
Con esta pequeña solución, ya tenemos el comando hibernate listo para incluir en nuestro script de apagado automático sin que tengamos que arrancar todas las aplicaciones en cada reinicio.





