SDB:Sospensione su disco

Icon-obsolete.png Questo articolo o questo paragrafo fanno riferimento alla versione '11.3', che attualmente è obsoleta!
Per favore fai riferimento alla pagina di discussione di questo articolo per maggiori informazioni.
Questo articolo si occupa di s2disk, il sistema in spazio utente per la sospensione su disco (s2disk sta per suspend to disk).
Provato su openSUSE Articoli consigliati Articoli correlati
Icon-checked.png

Icon-manual.png Icon-help.png

Conoscenze di base

Esistono due metodi per eseguire la sospensione su disco:

  • il "vecchio" metodo in spazio kernel, sostanzialmente un riversamento del contenuto del disco in /sys/power/state, col comando echo "disk".
  • il "nuovo" metodo in spazio utente, affidato ai comandi s2disk e resume, i quali fanno parte del pacchetto "suspend".

Questo articolo si concentra sul metodo in spazio utente.


Informazioni tecniche

Il programma s2disk, al fine mettere la macchina in sospensione, esegue le seguenti operazioni:

  • informa il kernel di creare un'istantanea, o snapshot, dello stato attuale del sistema
  • legge i dati dell'istantanea dal kernel e li scrive su disco
  • spegne la macchina

Il programma di ripristino dalla sospensione, resume, sostanzialmente esegue le stesse operazioni, ma in ordine inverso:

  • dopo che è stato avviato il sistema di base, prima (!) di montare ogni partizione, resume viene avviato da initrd
  • legge i dati dell'istantanea (lo snapshot) dal disco e li scrive sul kernel
  • informa il kernel di ripristinare l'istantanea
  • il kernel ritorna al punto in cui era prima della sospensione

Alcuni passaggi nella sequenza delle operazioni qui sopra risultano, invero, semplificati ("creare uno snapshot" non è così lineare e richiede un po' di giochi di prestigio, e "leggere da / scrivere su disco" può in realtà richiedere trasformazioni come la compressione e la cifratura.


Uso di s2disk

Con i rilasci di openSUSE si consiglia di non invocare mai s2disk direttamente, tranne che per finalità di debug, a meno che naturalmente si sappia esattamente ciò che si sta facendo. Infatti è sufficiente fare clic, come utente normale, su "Sospendi" o "Iberna" in kpowersave o in gnome-power-manager. Oppure, è possibile usare l'utilità da riga di comando powersave. Le operazioni di basso livello riguardanti la sospensione sono gestite da Pm-utils inoltre, qualora si abbia la necessità di fare il debug di qualche parte del processo, si potrà richiamare pm-hibernate, da una shell come root, per invocare s2disk. Il primo programma controllerà che siano soddisfatte alcune condizioni necessarie, creerà il file di configurazione /var/lib/s2disk.conf, invocherà infine s2disk con questo file di configurazione. Se pm-hibernate non dovesse sospendere la macchina, dando l'impressione che non esegua alcuna azione, potrebbe essere utile controllare il file /var/log/pm-suspend.log e vedere se ci sono messaggi che indicano possibili problemi durante la preparazione della sospensione (per esempio: partizione di swap non rilevata) o messaggi di errore generati da s2disk.


Configurazione

L'utilità pm-hibernate, parte della suite Pm-utils, crea il file /var/lib/s2disk.conf a partire da alcuni elementi che rileva automaticamente (come il dispositivo da risvegliare dall'ibernazione e la dimensione dell'immagine) e poi aggiunge i parametri che sono impostati in /etc/suspend.conf, così da poter sempre ignorare l'auto-rilevamento, se necessario. Attenzione: modificare il contenuto di suspend.conf può rendere il tuo sistema non più in grado di avviarsi, quindi stai attento!. Il file suspend.conf è dotato di commenti, quindi una lettura di quelle annotazioni può anche bastare per conoscere già ciò che serve sapere per usarlo.

Splash screen

Lo splash screen durante la sospensione e il ripristino del sistema è piacevole da vedere, ma così, se si vuole fare il debug di un tentativo di ibernazione non andato a buon fine, è impossibile osservare cosa sta succedendo al sistema. Aggiungi allora

splash = n

al file /etc/suspend.conf per disabilitare lo splash screen durante la sospensione. Durante il ripristino, il comportamento dello splash screen segue le impostazioni di sistema globali, per cui puoi impostare "splash=verbose" nel file di configurazione di config, oppure premere il tasto Escape durante le prime fasi di avvio del sistema per disabilitare lo splash screen mentre si avvia resume.

Compressione dell'immagine

Poiché con la maggior parte delle CPU abbastanza recenti la compressione dell'immagine è sempre vantaggiosa, risultando almeno in tempi di caricamento più ridotti, la compressione è attivata per impostazione predefinita. Se si volesse disabilitare la compressione per fare delle prove o perché si sospetta che ci siano dei problemi, aggiungere allora

compress = n

al file /etc/suspend.conf.

Cifratura dell'immagine

Questa funzionalità consente di cifrare i dati scritta sulla partizione di swap, in modo tale che nessuno possa ripristinare la macchina senza aver prima inserito la passphrase. Per impostare la cifrature è necessario prima creare la chiave pubblica:

root@stoetzler:~# suspend-keygen
libgcrypt version: 1.4.0
Key bits (between 1024 and 4096 inclusive) [1024]:
Generating 1024-bit RSA keys.  Please wait.
Testing the private key.  Please wait.
Passphrase please (must be non-empty):
Confirm passphrase:
File name [suspend.key]:
root@stoetzler:~# cp suspend.key /etc/suspend.key

Stai attento a non dimenticare la passphrase ;), aggiungi poi la riga seguente al file /etc/suspend.conf:

encrypt = y

Attenzione: proprio nel periodo in cui si sta scrivendo (giugno 2008), sussiste il problema che non viene caricata nessuna mappatura di tastiera tra le operazioni lanciate da initrd, per cui durante il ripristino avrai a disposizione una tastiera con layout americano dei tasti (US). Assicurati di saper digitare la tua passphrase su una tastiera americana!

Modalità di spegnimento

Dopo che l'immagine è stata scritta su disco, esistono due metodi per spegnere la macchina:

  • passando per l'interfaccia ACPI del BIOS (detta "modalità piattaforma", o "platform mode")
  • spegnimento diretto (come quando si esegue lo shutdown del sistema)

Di solito la modalità raccomandata è di passare per l'interfaccia ACPI del BIOS (su alcune macchine ciò è necessario, in caso contrario varie parti del sistema potrebbero non funzionare correttamente dopo la ripresa dall'ibernazione, per esempio il controllo della temperatura). Esistono macchine che hanno problemi con questo metodo e, per esempio, escono dall'ibernazione immediatamente dopo essere state spente in questo modo, cioè dopo lo shutdown. La modalità può essere selezionata con l'impostazione

shutdown method = shutdown

Sono disponibili tre modalità tra cui scegliere: "platform", "shutdown" e "reboot", quest'ultimo è utile soltanto per scopi di debug: la macchina si riavvia ed esce immediatamente dalla sospensione.

Avvio di un altro OS dopo l'ibernazione (soluzione di ripiego)

Normalmente alla ripresa dall'ibernazione non viene mostrata alcuna schermata da cui selezionare una voce del menù di GRUB e si passa direttamente all'avvio del sistema operativo per ripristinare il sistema ibernato. Probabilmente è questa l'impostazione predefinita per proteggere i dati dell'utente da un possibile errore umano (la memoria del tuo sistema viene slavata nella partizione di swap: se questa partizione venisse riutilizzata prima della ripresa dall'ibernazione, semplicemente andresti incontro alla perdita di tutti i tuoi dati). Un altro punto assai importante da considerare è che il processo di ibernazione non si preoccupa affatto dell'integrità delle partizioni montate! Tutte le partizioni montate resteranno tali! Quindi, se una di quelle partizioni venisse riutilizzata e modificata all'interno di un altro OS, probabilmente i dati in essa contenuti potrebbero essere completamente distrutti...

Comunque, se, come capita ad alcuni utenti, si ha la necessità di caricare Windoze una volta ogni tanto - fare uno shutdown completo di Suse per poi riavviare di nuovo tutte le applicazioni 20 minuti più tardi, può diventare fastidioso...

Ecco allora un workaround, ovvero una soluzione di ripiego per avere di nuovo disponibile il proprio menù di GRUB durante la fase di avvio della macchina.

La procedura di ibernazione, appena prima della sospensione, aggiornerà le impostazioni di GRUB in modo tale che dopo l'avvio il sistema passerà direttamente alla fase di resume, senza lasciare altra alternativa...

La soluzione: è sufficiente disabilitare quest'ultimo passaggio (lasciando GRUB così com'è). (Invece di modificare il '99Zgrub', come descritto nel capoverso seguente, potresti semplicemente eliminare questo file, o meglio prima farne una copia di riserva e poi rimuoverlo).

Per fare ciò è sufficiente aprire, come utente 'root', il file

/usr/lib/pm-utils/sleep.d/99Zgrub

quindi spostarsi nella parte finale del file e aggiungere il carattere per commentare davanti a 'prepare-grub' e a 'grub-once-restore'.

In openSUSE, il file si presenterà così

###### main()

if [ "$1" = hibernate ] || [ "$1" = suspend -a "$2" = suspend_hybrid ]; then
                prepare-grub
fi
if [ "$1" = thaw ] || [ "$1" = resume -a "$2" = suspend_hybrid ]; then
                grub-once-restore
fi

Ti basterà dunque commentare le righe 'prepare-grub' e 'grub-once-restore', per esempio:

###### main()

case $1 in
        hibernate)
###                prepare-grub
                ;;
        thaw)
###                grub-once-restore
                ;;
esac

Per ibernare ricordati prima di smontare (con umount, per esempio) tutte le partizioni 'aggiuntive' (es. dati e altre partizioni ausiliarie)...
Avvia poi la sospensione su disco e nota i cambiamenti al riavvio!

Esecuzione del debug

Se si volessero avere alcune statistiche a disposizione dopo la ripresa dalla ibernazione (per esempio per confrontare le velocità di lettura e scrittura delle diverse combinazioni di opzioni), è possibile passare a resume i parametri per far sì che attenda alcuni secondi dopo aver caricato l'immagine, e prima di ripristinare lo snapshot. Per esempio, per avere un tempo di attesa di 10 secondi, è necessario aggiungere al file /etc/suspend.conf la seguente riga:

resume pause = 10

Si dovrebbe inoltre disabilitare lo splash screen, che viene mostrato durante la ripresa dall'ibernazione, (bisogna agire sul file di configurazione di grub), o non sarà possibile leggere i dati numerici. Premere "Enter" (o "Invio") per uscire prima dal periodo di attesa.


Problemi con alcuni filesystem

L'operazione di resume risulta assai lenta se grub risiede in una partizione formattata con reiserfs, vedere la segnalazione Bug #538795 . Sembra che grub debba rileggere il giornale in memoria prima di caricare il kernel e initrd, e ciò richiede un po' di tempo. La soluzione, temporanea, al problema è di creare una partizione di avvio, cioè /boot, separata, formattarla in ext2, e spostare grub al suo interno (naturalmente assieme al resto di /boot/*).

Inoltre è possibile che questo problema abbia delle ripercussioni anche con altri filesystem journalled (con giornale), forse con ext3 o xfs. (Qualcuno, volendo, potrebbe fare delle prove e riportare i risultati).


Problemi con vecchi modelli di notebook ThinkPad

E' stato segnalato che alcuni dei vecchi modelli di notebook ThinkPad notebooks si bloccano durante l'uscita dall'ibernazione. In base al Bug #450256 , questo riguarda almeno alcuni modelli come il modello X31 o il T41, ed è in relazione con una funzionalità chiamata ACPI hardware signature, che è stata aggiunta di recente ai kernel. Dalla discussione sembra che il problema sia causato da un bug nel BIOS. Esistono due modi per superare questo problema:


Da fare

Per ora le impostazioni di pm-utils e il modo in cui è compilato initrd non permettono di ibernare o di riprendere da un file di swap, solo da un partizione adibita a swap. Questa funzionalità è ancora da implementare e poi da corredare di documentazione.


Vedi anche


Collegamenti esterni