Swsup: Suspend to Disk
Il suspend to disk incluso nel ramo 2.6 del kernel, da alcune prove fatte su diversi portatili, sembra funzionare egregiamente. A causa della diversità dell’hardware e dei BIOS, le seguenti regole potrebbero essere leggermente diverse da portatile a portatile. Di seguito elencherò la procedura di suspend to disk su un portatile HP ZT3000, usando una Debian Sid e kernel vanilla 2.6.11-10. In linea di massima però non dovrebbero esserci grandi differenze con altri portatili e/o altre distro.
In cosa consiste
Il suspend to disk, come dice il nome stesso, fa una copia della memoria sul disco, nella partizione di swap, che quindi deve essere grande almeno come il quantitativo di RAM. La fase in cui la memoria viene copiata sul disco dura il linea di massima sui 20 – 30 secondi (dipende dal quantitativo di RAM e dalla velocità del computer), dopo aver fatto il dump della RAM, il sistema si spegne. Al successivo riavvio verrà caricata in memoria l’immagine scritta nella partizione di swap, ed il sistema si troverà allo stesso punto di quando è stato invocato il suspend to disk.
Il processo di resume da suspend to disk è notevolmente più veloce del normale boot di sistema, e (per la gioia degli impazienti) può essere usato come sostituto di questo.
AVVERTENZA
Con il suspend to disk ci sono seri rischi di perdere i propri dati se non viene usato come dovrebbe. Alcune regole essenziali da osservare tra il suspend ed il reboot successivo:
- non toccare il filesystem
- non cambiare l’hardware
- non cambiare i parametri passati al kernel sulla linea di comando
- non cambiare kernel
- …
Se qualcosa va storto molto probabilmente bisognerà ricreare il filesystem nella partizione di swap.
Per maggiori dettagli far riferimento alla documentazione del kernel: Documentation/power/states.txt e Documentation/power/swsusp.txt
Prima di iniziare
La prima cosa da fare è indicare da dove riprendere l’immagine dopo aver fatto un suspend to disk. Con grub è sufficiente aggiungere la seguente voce:
- Fino al kernel 2.6.9-rc3:
pmdisk=/dev/hda5
- Dal kernel 2.6.9-rc3 in poi:
resume=/dev/hda5
In certi casi è necessario seguire le seguenti regole (questo dipende molto dal tipo di portatile):
- Il kernel non deve essere compilato con
agpgart
(con alcuni portatili funziona comunque) - Il modulo
ipw2200
(scheda wireless del centrino) non deve essere caricato - Il kernel non deve contenere la patch per
swsup2
- Alcuni moduli come
usb
devono essere rimossi prima di andare in suspend - Alcuni servizi come
mysql
devono essere stoppati prima di andare in suspend
Entrare in suspend
Per entrare in suspend uso il seguente script (personalizzatelo per adattarlo alle vostre esigenze):
#!/bin/sh
# Rimuovo il modulo della scheda wireless
/sbin/modprobe -r ipw2200
# Rimuovo il modulo usb
/sbin/modprobe -r uhci_hcd
# Faccio un sync preventivo, non si sa mai :-)
sync
# Tolgo USB storage prima del suspend, al riavvio hotplug lo ricarica
/sbin/rmmod usb_storage
# Suspend
echo -n shutdown > /sys/power/disk
echo -n disk > /sys/power/state
# Dopo il suspend riprendiamo da qua
# Resetto il clock di sistema a quello hw
/sbin/hwclock --hctosys
# Questo pezzo serve solo con certe versioni buggate di X.org (bug 1220)
# necessitano di fare partire una sessione X
# Se non avete questo problema lasciatelo commentato, vi risparmia del tempo al caricamento
#/usr/bin/X11/xinit /bin/false -- :1 &
# Ricarico USB
/sbin/modprobe uhci_hcd
# Ricarico l'interfaccia di rete wireless
/sbin/modprobe ipw2200
exit 0
La parte commentata relativa a X.org sembra essere necessaria a causa di un bug che richiede di fare partire una dummy X-session. Nel mio caso usando XFree 4.3 non ho avuto modo di verificare se sia ancora necessaria o meno.
Suspend to RAM
Premessa
Il suspend to RAM funziona dal kernel 2.6.11. In questo caso però a differenza del suspend to disk, il funzionamento dipende molto dal BIOS della macchina, quindi in certi casi potrebbe non funzionare. Nel mio caso un HP ZT3000, nel Compaq X1000 e NX7010 funziona egregiamente, negli altri casi dipende da portatile a portatile.
In cosa consiste
Il suspend to RAM quando viene invocato, spegne tutto l’hardware del computer, mantenendo accesa soltanto la RAM. Ritornando al funzionamento normale (nel mio caso con il tasto di accensione), il sistema viene riportato esattamente al punto in cui si trovava prima del suspend. Il tutto avviene quasi istantaneamente (3-5 secondi), a differenza del suspend to disk che richiede più tempo.
Prima di iniziare
Essendo molto legato al tipo di hardware, elencherò di seguito cosa è necessario al suo corretto funzionamento nel caso del mio portatile. Nel mio caso uso il kernel 2.6.11-10 vanilla su una Debian Sid, non so se altre versioni del kernel (2.6.11-mm etc…) funzionino.
- Il kernel deve essere compilato senza il supporto
agpgart
. - Il kernel deve essere compilato senza il supporto al
radeon framebuffer
. - Il kernel non deve contenere la patch
swsup2
. - Il modulo
ipw2200
deve essere rimosso prima di entrare in suspend. - I moduli di
usb
efirewire
devono essere rimossi prima di entrare in suspend.
Inoltre l’ ACPI ha ancora alcuni problemi a riprendere correttamente il video BUG 3670 dopo il suspend, e quindi è necessario usare un piccolo programma videopost che eseguito durante la fase di wake sistema tutto. E’ sufficiente scaricare e compilare il programma (videopost.tar.gz):
cd /usr/src
tar xvfz videopost.tar.gz
cd emu
make
Entrare in suspend
Per entrare in suspend to RAM, uso il seguente script (personalizzatelo per adattarlo alle vostre esigenze):
#!/bin/sh
#***************************************
# SCRIPT X IL SUSPEND TO RAM
#***************************************
# Fermo l'interfaccia di rete wireless
/sbin/ifdown eth1
# Tolgo i moduli che danno problemi
/sbin/modprobe -r ipw2200 #wireless
/sbin/modprobe -r uhci_hcd ehci_hcd #usb
/sbin/modprobe -r ohci1394 ieee1394 #firewire
# Sync del disco, non si sa mai :-)
sync
# Passo ad un virtual terminal testuale per evitare problemi con X
chvt 1
# Suspend to RAM
echo -n mem > /sys/power/state
#**************************************
# Dopo il suspend riprendiamo da qui...
#**************************************
# Resetto l'hardware video, perchè ACPI non ci riesce
# http://bugzilla.kernel.org/show_bug.cgi?id=3670
/usr/src/emu/video_post
# Ritorno a X (terminale 7)
/usr/bin/chvt 7
# Riprendo USB e firewire
/sbin/modprobe uhci_hcd
/sbin/modprobe usbhid
/sbin/modprobe ohci1394
/sbin/modprobe ieee1394
/sbin/modprobe ipw2200
# Rifaccio partire le interfacce di rete
/sbin/ifup eth1
exit 0
In questo script si intende che il programma per riprendere il video (videopost), si trovi compilato dentro /usr/src/emu
.
Ho fatto alcuni tentativi con i driver binari per le schede video Radeon, ma non sono andati a buon fine. Il sistema si riprende dopo il suspendo to RAM, ma il refresh del video è estremamente lento.
Se volete approfondire fate riferimento alla documentazione del kernel: Documentation/power/states.txt e Documentation/power/tricks.txt.
Atropo