Suspend to Ram/Disk con Linux

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 e firewire 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

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.