Habilitar el modo hibernación con suspend2 en Debian

Imagen de RazaMetaL

Las siguientes instrucciones permiten habilitar el modo de hibernación para una laptop, en mi caso mi HP Compaq NX9010 funciona perfectamente y lo mejo es que al cerrar la tapa la laptop entra en hibernación y se apaga, es decir que no consume batería :)

Mi laptop tiene Debian SID, kernel de la rama 2.6, y aptitude. Descargaremos suspend2 y configuraremos hibernate para que al cerrar la tapa de la laptop se nos grabe una imágen de los programas que estan corriendo en la partición swap, es importante que esta partición sea algo grande para guardar la copia, una partición swap de 1GB es mas que suficiente.

Empezamos instalando un nuevo kernel, en este caso 2.6.17 y descargamos los paquetes de suspend2:

cd /usr/src
aptitude install linux-source-2.6.17-1-686
wget http://www.suspend2.net/downloads/all/suspend2-2.2.7-for-2.6.17.tar.bz2
tar jvxf linux-source-2.6.17-1-686.tar.bz2
tar jvxf suspend2-2.2.7-for-2.6.17.tar.bz2
cd linux-source-2.6.17

Aplicamos el parche de suspen2 a la fuente del kernel 2.6.17:

../suspend2-2.2.7-for-2.6.17/apply

Compilamos:

make menuconfig

Se debe tener especial atención en no compilar el filesystem que estemos utilizando como módulo. En mi caso utilizo reiserfs y lo he seleccionado con un <*> en vez de , igual con LZF en la Crypto

Escogemos estas opciones para compilar el kernel:

Loadable module support --->
[*] Enable loadable module support
[*] Module unloading
[*] Forced module unloading
[*] Module versioning support
[ ] Source checksum for all modules
[*] Automatic kernel module loading

Power management options (ACPI, APM) --->
--- Power Management support
[*] Legacy Power Management API
[ ] Power Management Debug Support
[ ] Software Suspend
[*] Suspend2 --->
ACPI (Advanced Configuration and Power Interface) Support --->
APM (Advanced Power Management) BIOS Support --->
CPU Frequency scaling --->

--- Suspend2
--- Image Storage (you need at least one writer)
[*] File Writer
[*] Swap Writer
--- General Options
() Default resume device name
[*] Allow Keep Image Mode

Device Drivers --->
Block devices --->
<*> RAM disk support
(16) Default number of RAM disks
(8192) Default RAM disk size (kbytes)

Graphics support --->
Console display driver support --->
[*] VGA text console
[ ] Enable Scrollback Buffer in System RAM
--- Video mode selection support
MDA text console (dual-headed) (EXPERIMENTAL)
<*> Framebuffer Console support
[*] Framebuffer Console Rotation
[ ] Select compiled-in fonts

Cryptographic options --->
<*> LZF compression algorithm

Compilamos, este proceso va a demorar algo de tiempo, en mi caso ha tomado 45 minutos mas o menos:

make clean
make bzImage && make modules && make modules_install

Creamos una imagen initrd ya que de lo contrario tendremos un amable Kernel panic al reiniciar :)

Voy a explicar dos procedimientos, uno es para quienes esten utilizando un kernel anterior a la versión 2.6.16 la imagen se la hace con mkinird, para quiene utilizen como en este ejemplo un kernel superior o igual a la version 2.6.16 deberán entonces utilizar mkinitramfs que es el sustituto de mkinitrd.

Para seguir con el ejemplo, vamos entonces a utilizar mkinitramfs-tools:

aptitude install initramfs-tools

Creamos un par de scripts para habilitar el modo de hibernación al inicio del sistema en la imagen initrd:

cd /etc/initramfs-tools/hooks/

Creamos un archivo llamado suspend2 que contenga:

#!/bin/sh
PREREQ=""

prereqs()
{
echo "$PREREQ"
}

case $1 in
# get pre-requisites
prereqs)
prereqs
exit 0
;;
esac

. /usr/share/initramfs-tools/hook-functions

if [ -x /usr/local/sbin/suspend2ui_text ];
then
mkdir --parents ${DESTDIR}/usr/local/sbin 2>/dev/null || true
copy_exec /usr/local/sbin/suspend2ui_text usr/local/sbin

elif [ -x /usr/sbin/suspend2ui_text ];
then
mkdir --parents ${DESTDIR}/usr/sbin 2>/dev/null || true
copy_exec /usr/sbin/suspend2ui_text usr/sbin

elif [ -x /usr/local/sbin/suspend2ui_fbsplash ];
then
mkdir --parents ${DESTDIR}/usr/local/sbin 2>/dev/null || true
copy_exec /usr/local/sbin/suspend2ui_fbsplash usr/local/sbin

elif [ -x /usr/sbin/suspend2ui_fbsplash ];
then
mkdir --parents ${DESTDIR}/usr/sbin 2>/dev/null || true
copy_exec /usr/sbin/suspend2ui_fbsplash usr/sbin
fi

Creamos el otro script tambien llamado suspend2 pero en esta otra ruta:

cd /etc/initramfs-tools/scripts/local-premount/

El script deberá contener lo siguiente:

#!/bin/sh

PREREQ=""

prereqs()
{
echo "$PREREQ"
}

case $1 in
# get pre-requisites
prereqs)
prereqs
exit 0
;;
esac

if [ -d /proc/suspend2 ]; then
echo > /proc/suspend2/do_resume
elif [ -d /sys/power/suspend2 ]; then
echo > /sys/power/suspend2/do_resume
elif [ -d /proc/software_suspend ]; then
echo > /proc/software_suspend/do_resume
fi

Creamos el archivo swsusp2 en /etc/mkinitrd con atributos de ejecución:

vi /etc/mkinitrd/scripts/swsusp2
#!/bin/sh
cat <>$INITRDDIR/script
if [ -z "\$noresume" ]; then # be careful with the 'dollar' sign
echo >/proc/software_suspend/do_resume
# IMPORTANT: use the line below for version 2.2-rc8 and newer
echo >/proc/suspend2/do_resume
umount -n devfs
umount -n proc
fi
EOF

Creamos la imágen:

mkinitramfs -o /boot/initrd.img-2.6.17 2.6.17

[b]Para quienes esten instalando un kernel anterior a 2.6.16[/b]

chmod a+x /etc/mkinitrd/scripts/swsusp2

Creamos la imágen:

mkinitrd -o /boot/initrd.img-2.6.15-1 2.6.15-1

Nos fijamos de cual es nuestra partición swap, esta información la vamos a requerir para modificar grub:

cat /proc/swaps
Filename Type Size Used Priority
/dev/hda5 partition 1951856 0 -1

Editamos /boot/grub/menu.lst para que la parte en la que se hace referencia a nuestro kernel nos quede así:

title Debian GNU/Linux, kernel 2.6.17 Default
root (hd0,0)
kernel /boot/vmlinuz-2.6.17 root=/dev/hda1 ro nofirewire vga=791 splash=silent resume2=swap:/dev/hda5
initrd /boot/initrd.img-2.6.17
savedefault
boot

Ahora configuramos suspend2, hibernate y acpi :

aptitude install hibernate suspend2-userui

Para que cuando hibernemos se nos muestre una el avance del proceso de hibernación deberemos tener estos parámetros en /etc/hibernate/suspend2.conf:

### suspend2 (for Software Suspend 2)
UseSuspend2 yes
Reboot no
EnableEscape yes
DefaultConsoleLevel 1
Compressor lzf
#Compressor none
Encryptor none
# ImageSizeLimit 200

## useful for initrd usage:
#SuspendDevice swap:/dev/hda5

## Powerdown method - 3 for suspend-to-RAM, 4 for ACPI S4 sleep, 5 for poweroff
# PowerdownMethod 5

## Any other /proc/software_suspend setting can be set like so:
# ProcSetting expected_compression 50

## Or traditionally like this:
# Suspend2AllSettings 0 0 2056 65535 5

## Or even from the results of hibernate --save-settings with this:
# Suspend2AllSettingsFile /etc/hibernate/suspend-settings.conf

## For filewriter:
# FilewriterLocation /suspend_file 1000
# VerifyFilewriterResume2 yes

## Specify a userui like this:
ProcSetting userui_program /usr/sbin/suspend2ui_text
#SwitchToTextMode no

# Scale CPU to full speed to make sure we suspend as fast as possible.
#FullSpeedCPU yes

Include common.conf

En /etc/hibernate/common.conf :

##############################################################################
### Some global settings
##############################################################################

Verbosity 0
LogFile /var/log/hibernate.log
LogVerbosity 1
LogTimestamp yes
# AlwaysForce yes
# AlwaysKill yes
# HibernateVT 15
Distribution debian
# XDisplay :0

### bootsplash
## If you use bootsplash, also enabling SwitchToTextMode is recommended if
## you use X, otherwise you may end up with a garbled X display.
# Bootsplash on
# BootsplashConfig /etc/bootsplash/default/config/bootsplash-1024x768.cfg

### clock
SaveClock restore-only

### devices
# IncompatibleDevices /dev/dsp /dev/video*

### diskcache
# DisableWriteCacheOn /dev/hda

### fbsplash (enable SwitchToTextMode if you use this)
#FBSplash on
#FBSplashTheme snowboard-tux

### filesystems
# Unmount /nfsshare /windows /mnt/sambaserver
Unmount /proc/bus/usb

# UnmountFSTypes smbfs nfs
# UnmountGraceTime 1
# Mount /windows

### grub
# ChangeGrubMenu yes
# GrubMenuFile /boot/grub/menu.lst
# AlternateGrubMenuFile /boot/grub/menu-suspended.lst
# BackupGrubMenuFile /var/backups/grub.conf.hibernate
#
## see http://bugs.debian.org/317479
# RemountXFSBoot yes

### hardware_tweaks
# IbmAcpi yes
# Runi915resolution yes
FullSpeedCPU yes

### lilo
# EnsureLILOResumes yes

### lock (generally you only want one of the following options)
# LockConsoleAs root

# LockXScreenSaver yes
# LockGnomeScreenSaver yes
# LockKDE yes
# LockXLock yes
# LockXAutoLock yes

### misclaunch
# OnSuspend 20 echo "Good night!"
# OnResume 20 echo "Good morning!"

### modules
# UnloadModules snd_via82cxxx usb-ohci
# UnloadAllModules yes
UnloadModules ndiswrapper uhci_hcd ehci_hcd usbcore ieee1394
UnloadBlacklistedModules yes
LoadModules auto
#LoadModulesFromFile /etc/modules

### modules-gentoo
# GentooModulesAutoload yes

### network
DownInterfaces eth0 wlan0

UpInterfaces auto

### pause_audio
MuteAudio no
PauseAudio yes

### pcmcia
EjectCards yes

### programs
# IncompatiblePrograms xmms

### services
# RestartServices laptop-mode
# StopServices alsasound
# StartServices aumix

### vbetool
# EnableVbetool yes
# RestoreVbeStateFrom /var/lib/vbetool/vbestate
# VbetoolPost yes
# RestoreVCSAData yes

### xhacks
SwitchToTextMode yes
# UseDummyXServer yes
# DummyXServerConfig xorg-dummy.conf

### xstatus
## This can be set to gnome, kde or x:
# XStatus gnome
# XmessageDisable yes
# XSuspendText Preparing to suspend...
# XResumeText Resuming from suspend...

Hasta aquí la configuración de suspend2 e hibernate :)

Ahora configuramos ACPID para que cuando cerremos la tapa de la laptop esta hiberne y se apague, para encenderla basta con presionar el botón de encendido y arrancará tal como la dejamos antes de bajar la tapa:

vi /etc/default/acpi-support
#ACPI_SLEEP=true
ACPI_HIBERNAT=true
HIBERNATE_SCRIPTS=true
HIBERNATE_SCRIPT_RAM=false
HIBERNATE_RAM_ARGS="-F /etc/hibernate/ram.conf"


vi /etc/acpi/events/lm_lid
event=button[ /]lid
action=/etc/acpi/actions/lm_lid.sh %e


/etc/acpi/actions/lm_lid.sh
#!/bin/bash

test -f /usr/sbin/laptop_mode || exit 0

# lid button pressed/released event handler

#/usr/sbin/laptop_mode auto
/usr/sbin/hibernate

Ahora probemos si lo que hemos hecho valió la pena :)

Como root ejecutamos en una consola:

hibernate

Deberíamos tener una pantalla indicando que el equipo va a hibernar.

Una vez apagada, encendemos y si han seguido el manual al pié de la letra se les mostrará la terminal tal como la dejaron antes de escribir hibernate.

Ahora prueben bajando la tapa mientras estas en una sesión, debería apagarse automáticamente. Al encenderlo debería quedar tal como estaba justo antes de que la tapa sea cerrada.

Comentarios

Suspender Laptop

Imagen de jhonfy

En primer lugar !! mis respetos!! me quito el sombrero!

que vaina tan larga y enredada! mejor dicho!!
no me cabe duda de que debe funcionar y no es que sea facilista pero si a estas alturas de la vida! hay que hacer semejante enredo para que esta infeliz quede suspendida! seria el capitulo mas decepcionante desde mi historia con linux y sobre todo con Ubuntu!

:(