Guida alla Gestione Energetica Dennis Nienhüser Francesco Grieco La gestione energetica è l'unica soluzione per estendere la durata della batteria sui sistemi mobile come i notebook. Questa guida ne illustra la sua configurazione. 1.24 10 Giugno 2005 Introduzione
A cosa serve la Gestione Energetica?

Capacità e durata delle batterie dei notebook sono migliorate molto nel corso degli ultimi anni. Tuttavia i moderni processori consumano molta più energia dei vecchi e ad ogni nuova generazione di notebook si aggiungono nuove periferiche "affamate" di energia. Ecco il perchè dell'importanza della gestione energetica. Applicando buone politiche di risparmio energetico non sarà sempre necessario acquistare un'altra batteria.

Breve panoramica

Questa guida tratta della gestione energetica per i notebook. Alcune sezioni potrebbero essere valide anche per i server, altre non lo sono sicuramente e potrebbero causare problemi. Si consiglia fortemente di non applicare niente di quello contenuto in questa guida a macchine server a meno che non si sappia veramente quello che si sta facendo.

Poichè questa guida diventa sempre più lunga, segue una breve panoramica di ciò che sarà trattato.

La sezione Prerequisiti tratta di alcuni requisiti di base necessari per tutte le sezioni a seguire della guida. Include settaggi del BIOS e particolari configurazioni nel kernel. I seguenti tre capitoli pongono l'attenzione sui componenti che tipicamente consumano maggiore energia - il processore, il display e l'hard disk. Ognuno di essi pùo essere configurato separatamente. Power Management della CPU mostra come modificare la frequenza del processore al fine di risparmiare energia senza un eccessivo calo delle performance. Alcuni stratagemmi in Power Management dell'Hard Disk permettono di allegerire il carico di lavoro del disco (avendo come effetto anche una riduzione del livello di rumore). Indicazioni anche per le card Wireless LAN e per le periferiche USB in Power Management delle altre periferiche mentre un altro intero capitolo è dedicato agli (ancora sperimentali) Stati di Sleep. Infine un ultimo capitolo dedicato ai Problemi più comuni in cui è possibile incorrere.

Bilancio energetico per ogni componente

Quasi tutti i componenti possono funzionare in differenti stati - off, sleep, idle, active - consumando a seconda dei casi diverse quantità di energia. La maggior parte dell'energia viene consumata dal display LCD, dalla CPU e dagli hard disk. Spesso alcuni di essi sono in grado di attivare politiche di gestione energetica attraverso il BIOS, ma una configurazione intelligente del proprio sistema operativo adattabile a diverse situazioni può ottenere molto di più.

Prerequisiti
Prima di tutto

Prima di entrare nei dettagli della gestione energetica per le singole periferiche, vi sono alcuni requisiti. Dopo aver controllato i settaggi del BIOS, è necessario attivare alcune opzioni del kernel - in breve ACPI, sleep states e CPU frequency scaling. Poichè il risparmio energetico comporta una perdita delle prestazioni o un aumento della latenza, deve essere attivato, naturalmente, solamente in assenza di una connessione a rete elettrica. Da qui la necessità di un nuovo runlevel battery.

Il BIOS

Per prima cosa è necessario controllare i settaggi relativi al Power Management nel BIOS. Di solito la soluzione migliore è combinare i settaggi del BIOS alle politiche del sistema operativo, ma per il momento è meglio disabilitare le funzioni del BIOS. In questo modo niente interferisce con le nuove politiche imposte dal sistema operativo. Dopo aver configurato tutto per bene, sarà necessario riabilitare tutte le funzioni del BIOS.

Configurazione del Kernel

Il supporto dell'ACPI (Advanced Configuration and Power Interface) nel kernel è ancora in fase di sviluppo. Pertanto è consigliabile usare sempre il kernel più recente.

Nella configurazione del kernel si devono attivare le seguenti opzioni:

Power Management Options --->
  [*] Power Management Support
  [ ] Software Suspend
  [ ] Suspend-to-Disk Support

  ACPI( Advanced Configuration and Power Interface ) Support --->
    [*] ACPI Support
    [ ]   Sleep States
    [*]   AC Adapter
    [*]   Battery
    <M>   Button
    <M>   Fan
    <M>   Processor
    <M>     Thermal Zone
    < >   ASUS/Medion Laptop Extras
    < >   Toshiba Laptop Extras
    [ ]   Debug Statements
    
  CPU Frequency Scaling --->
    [*] CPU Frequency scaling
          Default CPUFreq governor (userspace)
    <*>   'performance' governor
    <*>   'powersave' governor
    <*>   'ondemand' cpufreq policy governor
    <*>   CPU frequency table helpers
    <M> ACPI Processor P-States driver
    <*> driver CPUFreq a seconda del processore

E' possibile anche attivare, a propria discrezione, Software Suspend, Suspend-to-Disk e Sleep States. I possessori di notebook ASUS, Medion o Toshiba devono attivare i relativi moduli specifici.

Il kernel deve essere in grado di attivare il CPU frequency scaling (cambio di frequenza della CPU) sul processore. Poichè ogni CPU presenta una interfaccia differente dalle altre, è necessario scegliere il driver giusto per il proprio processore. Si presti attenzione - ad esempio attivando Intel Pentium 4 clock modulation su un Pentium M, si otterà molto probabilmente un sistema poco stabile. La documentazione del kernel può chiarire qualsiasi dubbio in proposito.

Dopo la compilazione del kernel bisogna assicurarsi del corretto caricamento dei moduli all'avvio e riavviare il notebook con il nuovo kernel con ACPI abilitato. Per installare il demone acpi, da riga di comando emerge sys-power/acpid. Il suddetto demone gestisce eventi quali il passaggio da corrente a batteria o la chiusura del lid. E' necessario assicurarsi che i moduli siano caricatici se non compilati direttamente all'interno del proprio kernel. Ora si avvii il demone acpid con /etc/init.d/acpid start e si esegua rc-update add acpid default per caricarlo all'avvio. Il suo utilizzo verrà spiegato in seguito.

# emerge sys-power/acpid
# /etc/init.d/acpid start
# rc-update add acpid default
Creazione del runlevel "battery"

La configurazione di default attiverà il risparmio energetico solo quando necessario - in pratica quando il notebook funziona con la propria batteria. Per effettuare il passaggio fra stato di corrente e di batteria, sarà necessario creare un runlevel battery in grado di gestire l'avvio e il blocco degli script di risparmio energetico.

Se l'idea di avere un ulteriore runlevel non convince, è possibile saltare questa sezione. Naturalmente ciò renderà tutto un pò più complicato. La sezione seguente considera l'esistenza di un runlevel battery.
# cd /etc/runlevels
# cp -a default battery

Finito. Il nuovo runlevel battery contiene tutto come default, ma non c'è ancora nessun cambio automatico tra i due livelli.

Risposta agli eventi ACPI

Di solito gli eventi ACPI sono la chiusura del lid, il cambio della sorgente energetica e il bottone di sleep. Il cambio di sorgente energetica è un evento importante e deve necessariamente generare un cambio di runlevel. La creazione dei file seguenti permetterà un cambio fra i runlevel default e battery a seconda del tipo di sorgente energetica utilizzata.

#!/bin/bash

# INIZIO configurazione
RUNLEVEL_AC="default"
RUNLEVEL_BATTERY="battery"
# FINE configurazione


if [ ! -d "/etc/runlevels/${RUNLEVEL_AC}" ]
then
	logger "${0}: Runlevel ${RUNLEVEL_AC} does not exist. Aborting."
	exit 1
fi

if [ ! -d "/etc/runlevels/${RUNLEVEL_BATTERY}" ]
then
	logger "${0}: Runlevel ${RUNLEVEL_BATTERY} does not exist. Aborting."
	exit 1
fi

if on_ac_power
then
    if [[ "$(cat /var/lib/init.d/softlevel)" != "${RUNLEVEL_AC}" ]]
  then
	    logger "Switching to ${RUNLEVEL_AC} runlevel"
	    /sbin/rc ${RUNLEVEL_AC}
        fi
elif [[ "$(cat /var/lib/init.d/softlevel)" != "${RUNLEVEL_BATTERY}" ]]
then
	logger "Switching to ${RUNLEVEL_BATTERY} runlevel"
	/sbin/rc ${RUNLEVEL_BATTERY}
fi
# Si sostituisca "ac_adapter" indicato di seguito con l'evento generato dal proprio notebook
# Per conoscere il nome dell'evento si legga /var/log/acpid
event=ac_adapter.*
action=/etc/acpi/actions/pmg_switch_runlevel.sh %e
# Si sostituisca "battery" indicato di seguito con l'evento generato dal proprio notebook
# Per conoscere il nome dell'evento si legga /var/log/acpid
event=battery.*
action=/etc/acpi/actions/pmg_switch_runlevel.sh %e

Ora è necessario il pacchetto sys-power/powermgmt-base che contiene l'utility on_ac_power. Il file pmg_switch_runlevel.sh deve essere eseguibile.

# emerge powermgmt-base
# chmod +x /etc/acpi/actions/pmg_switch_runlevel.sh
# /etc/init.d/acpid restart

Provando ora ad attaccare e staccare l'alimentazione a corrente, nei log di sistema dovrebbero apparire a seconda dei casi i messaggi "Switching to AC mode" o "Switching to battery mode". Se lo script non è in grado di rilevare correttamente la sorgente di energia utilizzata, è possibile consultare la sezione Problemi.

A causa della natura del meccanismo degli eventi, il notebook, al boot, passa al runlevel default che sia o meno collegato alla rete elettrica. E' necessario aggiungere, per questo, una nuova entry al boot loader con l'opzione softlevel=battery; soluzione scomoda. Una soluzione migliore è quella di creare un evento ACPI finto alla fine del processo di boot e lasciare che lo script /etc/acpi/default.sh decida quale runlevel utilizzare. Si apra con il proprio editor il file /etc/conf.d/local.start e si aggiungano le linee:

# Finto evento acpi per cambiare runlevel se scollegati da rete elettrica
/etc/acpi/actions/pmg_switch_runlevel.sh "battery/battery"

Conclusa questa parte preparativa, è ora possibile attivare le politiche di gestione energetica per ogni singolo componente.

Power Management della CPU
Terminologia tecnica

Il CPU frequency scaling introduce alcuni termini tecnici che potrebbero essere non conosciuti. Segue, per questo motivo, una breve introduzione.

Prima di tutto, il kernel deve essere in grado di cambiare la frequenza di funzionamento della CPU. Il CPUfreq processor driver contiene i comandi per effettuare questa operazione su ogni tipo di CPU. Per questo motivo è importante indicare il driver giusto da utilizzare nel proprio kernel (operazione già effettuata precedentemente). Inoltre, il kernel deve anche scegliere la frequenza corretta di funzionamento da utilizzare nelle diverse situazioni. Questa viene fissata in base ad una policy (politica di gestione) che consiste in una CPUfreq policy e in un governor (regolatore). Una CPUfreq policy non è altro che un insieme di due numeri che definiscono un campo all'interno del quale la frequenza può oscillare - un valore minimo e uno massimo. Il governor, invece, decide quale delle frequenze disponibili fra la minima e la massima utilizzare. Ad esempio, il powersave governor utilizza sempre la frequenza più bassa disponibile, il performance governor, invece, la più alta. L'userspace governor non sceglie nessuna frequenza in particolare ma utilizza quella indicata dall'utente (o da un programma in userspace); il valore della frequenza viene letto da /sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed.

Questo può non sembrare un cambiamento dinamico della frequenza e in effetti non lo è. La dinamicità può essere realizzata con diversi approcci. Ad esempio, ondemand governor prende le sue decisioni in base al carico di lavoro della CPU. La stessa cosa viene fatta da utility come cpudyn, cpufreqd, powernowd e molte altre. Gli eventi ACPI possono essere utilizzati per attivare o disattivare i cambi dinamici della frequenza a seconda della sorgente energetica utilizzata.

Settaggio manuale della frequenza

Diminuendo la velocità e il voltaggio della CPU si hanno due vantaggi: viene consumata meno energia e il notebook non si riscalda eccessivamente. Il grande svantaggio, naturalmente, è una perdita di performance. La diminuzione della velocità del processore resta in ogni caso un buon compromesso fra calo di performance e risparmio energetico.

Non tutti i notebook supportano il frequency scaling. In caso di dubbi, una lista dei processori supportati si trova nella sezione Problemi.

E' ora di provare il corretto funzionamento del cambio di frequenza della CPU. sys-power/cpufrequtils è un programmino molto utile per effettuare un semplice debug.

# emerge cpufrequtils
# cpufreq-info

Ecco un esempio di quello che si ottiene:

cpufrequtils 0.2: cpufreq-info (C) Dominik Brodowski 2004
Report errors and bugs to linux@brodo.de, please.
analyzing CPU 0:
 driver: centrino
 CPUs which need to switch frequency at the same time: 0
 hardware limits: 600 MHz - 1.40 GHz
 available frequency steps: 600 MHz, 800 MHz, 1000 MHz, 1.20 GHz, 1.40 GHz
 available cpufreq governors: ondemand, powersave, userspace, performance
 current policy: frequency should be within 924 MHz and 1.40 GHz.
  The governor "performance" may decide which speed to use
  within this range.
 current CPU frequency is 1.40 GHz (asserted by call to hardware).

Si utilizzi cpufreq-set per assicurarsi che il cambio di frequenza funzioni. Il comando cpufreq-set -g ondemand, ad esempio, attiva l'ondemand governor; lo si esegua e si verifichi il cambiamento con cpufreq-info. Se non funziona come dovrebbe, la sezione Problemi alla fine di questa guida potrebbe essere d'aiuto.

Adattamento automatico della frequenza

Tutto questo è molto semplice, ma scomodo da effettuare tutti i giorni. Meglio lasciare che sia il proprio sistema a settare automaticamente la frequenza appropriata. La tabella seguente presenta una panoramica delle utility necessarie a questo compito. E' suddivisa in tre categorie: kernel per soluzioni che hanno bisogno solo del supporto del kernel, demone per programmi che lavorano in background e GUI per programmi che forniscono una interfaccia grafica per una configurazione più semplice.

'ondemand' governorKernelCarico della CPUN.A.N.A. Configurazione attraverso i file presenti in /sys/devices/system/cpu/cpu0/cpufreq/ondemand/. Richiede ancora tool in userspace (programmi, script) in caso di utilizzo del cambio di governor. cpudynDemoneCarico della CPUPerformance, powersaveDynamic Supporta anche lo standby dei dischi - si noti, però, che il laptop mode in molti casi funziona decisamente meglio. cpufreqdDemoneStato della batteria, Carico della CPU, Programmi in esecuzioneTutti disponibiliNessuno Configurazioni sofisticata (ma anche complesse). powernowd DemoneCarico della CPUNessunoPassive, sine, aggressive Supporta SMP. speedfreqDemoneCarico della CPUNessunoDynamic, powersave, performance, fixed speed Piccola ma efficace con una utile interfaccia client/server. Richiede un kernel della serie 2.6. Il suo sviluppo sembra non continuare e a breve dovrebbe essere rimossa dal Portage. gtk-cpuspeedyGUINessunoNessunoNessuno Applicazione per Gnome, utility grafica per configurare manualmente la frequenza della CPU. Non offre nessun tipo di automazione. klaptopdaemonGUIStato della batteriaTutti disponibiliNessuno Solamente per KDE, 'ondemand' governor necessario per il cambio dinamico della frequenza.
Nome Categoria Causa cambio Governor del kernel Governor supportati Note

L'adattamento della frequenza della CPU al carico di lavoro corrente del notebook può sembrare semplice da attuare ad una prima occhiata, ma in realtà non lo è. Un algoritmo errato può causare cambi continui fra due frequenze o spreco di energia quando la frequenza viene portata inutilmente a valori troppo alti.

Quale scegliere? Se si è indecisi, un'ottima scelta è cpufreqd:

# emerge cpufreqd

La configurazione di cpufreqd avviene attraverso il file /etc/cpufreqd.conf. Quella di default fornita con cpufreqd sembra leggermente confusionaria. Si raccomanda di sostituirla con quella fornita dallo sviluppatore Gentoo, Henrik Brix Andersen (si guardi di seguito).

[General]
pidfile=/var/run/cpufreqd.pid
poll_interval=2
pm_type=acpi
verbosity=5
	
[Profile]
name=ondemand
minfreq=0%
maxfreq=100%
policy=ondemand

[Profile]
name=powersave
minfreq=0%
maxfreq=100%
policy=powersave

[Profile]
name=performance
minfreq=0%
maxfreq=100%
policy=performance

[Rule]
name=battery
ac=off
profile=ondemand

[Rule]
name=battery_low
ac=off
battery_interval=0-10
profile=powersave

[Rule]
name=ac
ac=on
profile=performance

Se si sta utilizzando un kernel 2.6 con interfaccia sysfs (e per la maggior parte dei casi è così), non è possibile utilizzare valori in percentuale come riportato appena sopra. Le percentuali devono essere sostituite con i valori minimi e massimi di frequenza come riportato da cpufreq-info --hwlimits. Ad esempio, per un Pentium M 1.4 GHz si ottengono i valori:

minfreq=600000
maxfreq=1400000

Infine bisogna avviare il demone.

# rc-update add cpufreqd default battery
# rc
Non si esegua più di uno dei programmi sopra citati contemporaneamente. Potrebbero, infatti, esserci problemi come un cambio continuo fra due frequenze.
Verifica di funzionamento a seguito delle modifiche apportate

L'ultima cosa da controllare è che le nuove politiche di risparmio energetico facciano bene il loro lavoro. Un modo semplice per verificare ciò è il monitoraggio della velocità della CPU mentre è al lavoro sul notebook:

# watch grep \"cpu MHz\" /proc/cpuinfo

Se /proc/cpuinfo non dovesse venire aggiornato (sezione Problemi), si provi a monitorare la frequenza della CPU con:

# watch x86info -mhz

A seconda dei settaggi, la velocità della CPU dovrebbe aumentare in caso di richieste d'uso, diminuire in mancanza di attività o, semplicemente, rimanere costante. Quando si utilizza cpufreqd e la voce verbosity è impostata ad un valore di 5 o più in cpufreqd.conf, nei syslog si otterrano maggiori informarzioni su quello che accade.

Power Management del display LCD
Il maggior consumatore di energia

Come si può vedere dalla figura 1.1, il display LCD consuma la maggior parte dell'energia (questo potrebbe non valere nel caso di CPU non mobile). Per questo non solo è importante spegnere il display quando non utilizzato, ma anche ridurre il backlight (retroilluminazione) se possibile. Molti notebook offrono la possibilità di regolare il backlight.

La prima cosa da controllare sono i settaggi di standby/suspend/off del display. Questi sono tutti valori che dipendono dal windowmanager. L'oscuramento del terminale può essere effettuato con setterm -blank <numero-di-minutiM>, setterm -powersave on e setterm -powerdown <numero-di-minutiM>. Per Xorg, si può editare /etc/X11/xorg.conf come di seguito riportato:

Section "ServerLayout"
  Identifier  [...]
  [...]
  Option  "BlankTime"  "5"  # Oscura lo schermo dopo cinque minuti (Fake)
  Option  "StandbyTime"  "10"  # Spegne lo schermo dopo 10 minuti (DPMS)
  Option  "SuspendTime"  "20"  # Suspend dopo 20 minuti
  Option  "OffTime"  "30"  # Spegne dopo mezz'ora
  [...]
EndSection

[...]

Section "Monitor"
  Identifier  [...]
  Option  "DPMS"  "true"
  [...]
EndSection

Vale lo stesso per XFree86 e /etc/X11/XF86Config.

Probabilmente la gestione del backlight (retroilluminazione) è il punto più importante. Se si è in grado di accedere al controllo tramite un tool, bisogna scrivere un piccolo script in grado di settare il backlight nella modalità batteria e inserirlo nel runlevel battery. Lo script seguente dovrebbe funzionare sulla maggior parte dei notebook IBM Thinkpad. Necessita del pacchetto app-laptop/ibm-acpi oppure dell'opzione appropriata selezionata nel kernel.

Il supporto per la regolazione della luminosità è sperimentale nel pacchetto ibm-acpi. L'accesso diretto all'hardware di questa utility potrebbe provocare blocchi inaspettati del sistema. Si legga a tale proposito il sito ufficiale del pacchetto ibm-acpi.

Per essere in grado di regolare il livello di lumonisità, il modulo ibm_acpi deve essere caricato con il paramentro sperimentale.

(Prima di proseguire si legga l'avviso sopra riportato circa l'instabilità di questa opzione)
# emerge ibm-acpi
# echo "options ibm_acpi experimental=1" >> /etc/modules.d/ibm_acpi
# /sbin/modules-update
# echo ibm_acpi >> /etc/modules.autoload.d/kernel-2.6
# modprobe ibm_acpi

Queste operazioni non dovrebbero produrre messaggi di errore e, dopo il caricamento del modulo, dovrebbe essere creato il file /proc/acpi/ibm/brightness. Uno script di avvio avrà il compito di scegliere il miglior livello di luminosità in base alla sorgente energetica disponibile.

# Si legga /proc/acpi/ibm/brightness per i valori disponibili
# Per altre informazioni /usr/share/doc/ibm-acpi-*/README.gz

# Livello di lumonisità in modalità corrente. Di default 7.
BRIGHTNESS_AC=7

# Livello di luminosità in modalità batteria. Di default 4..
BRIGHTNESS_BATTERY=4
#!/sbin/runscript

set_brightness() {
	if on_ac_power
	then
            LEVEL=${BRIGHTNESS_AC:-7}
	else
            LEVEL=${BRIGHTNESS_BATTERY:-4}
	fi

	if [ -f /proc/acpi/ibm/brightness ]
	then
	    ebegin "Setting LCD brightness"
	    echo "level ${LEVEL}" > /proc/acpi/ibm/brightness
	    eend $?
	else
	    ewarn "Setting LCD brightness is not supported."
	    ewarn "Check that ibm_acpi is loaded into the kernel"
	fi
}
	
start() {
	set_brightness
}

stop () {
	set_brightness
}

Una volta finito, bisogna assicurarsi che la luminosità sia regolata automaticamente aggiungendo lo script al runlevel battery.

# chmod +x /etc/init.d/lcd-brightness
# rc-update add lcd-brightness battery
# rc
Power Management dell'Hard Disk
Sleep quando in idle

L'obiettivo è portare l'hard disk nello stato di sleep il prima possibile quando non viene utilizzato. Verranno analizzate due possibilità. La prima è cpudyn. Bisogna decommentare le linee nella sezione "Disk Options" in /etc/conf.d/cpudyn. Per portare l'hard disk in sleep dopo 60 secondi di inattività si deve agire nel modo seguente:

################################################
# DISK OPTIONS
# (opzioni disabilitate di default)
################################################

#
# Tempo dopo il quale porre il disco in modalità standby
# in mancanza di operazioni IO (in secondi)
#

TIMEOUT=60

#
# Dischi sui quali effettuare lo spindown (separati da virgole)
#

DISKS=/dev/hda

La seconda possibilità è quella di usare un piccolo script e hdparm. Si crei /etc/init.d/pm.hda come riportato di seguito:

#!/sbin/runscript

depend() {
  after hdparm
}

start() {
  ebegin "Activating Power Management for Hard Drives"
  hdparm -q -S12 /dev/hda
  eend $?
}

stop () {
  ebegin "Deactivating Power Management for Hard Drives"
  hdparm -q -S253 /dev/hda
  eend $?
}

Con man hdparm è possibile avere informazioni sulle varie opzioni. Una volta pronto, è necessario aggiungere lo script al runlevel battery.

# chmod +x /etc/init.d/pm.hda
# /sbin/depscan.sh
# rc-update add pm.hda battery
Si presti molta attenzione ai settaggi di sleep e di spin down del proprio hard disk. Settaggi troppo spinti (valori molto piccoli) possono danneggiare l'hardware e invalidare la garanzia.
Aumento del tempo di idle - laptop-mode

Gli ultimi kernel (2.6.6 e maggiori, gli ultimi della serie 2.4 e altri con alcune patch) includono il così detto laptop-mode. Quando attivato, le operazioni di scrittura avvengono ogni 10 minuti (invece di 30 secondi). Questo fà si che l'hard disk non lavori in maniera continuativa.

# emerge laptop-mode-tools

I laptop-mode-tools hanno la propria configurazione in /etc/laptop-mode/laptop-mode.conf. E' possibile adattarla alle proprie esigenze; la documentazione è presente nel file di configurazione stesso. Per rendere automatico l'avvio rc-update add laptop_mode battery.

Altri consigli

Oltre a portare il proprio hard disk nello stato di sleep il prima possibile, una buona idea è minimizzare gli accessi al disco. Si osservino i processi che scrivono sul disco frequentemente - syslogd è un buon candidato. Non sarà necessario fermarlo completamente, ma è possibile modificare il suo file di configurazione in modo tale che non tutto venga loggato, riducendo in questo modo gli accessi al disco. Cups scrive sul disco periodicamente, quindi fermarlo e attivarlo manualmente solo quando necessario è una buona idea.

# rc-update del cupsd battery

Un'altra possibilità è la disattivazione dello swap nella modalità batteria. Prima di scrivere qualcosa che attivi e disattivi lo swap, bisogna assicurarsi che ci sia abbastanza RAM e che lo swap non sia usato pesantemente, altrimenti si potrebbero avere problemi.

Se non si vuole utilizzare il laptop-mode, è sempre possibile minimizzare gli accessi al disco montando alcune directory come tmpfs - gli accessi in scrittura non avvengono sul disco, ma nella memoria principale e vengono persi con l'operazione di unmount. Spesso è utile montare /tmp allo stesso modo - il suo contenuto viene in ogni caso perso ad ogni reboot che sia montato o meno sul disco o in RAM. Bisogna solo essere certi di avere RAM a sufficienza e nessun programma (come un client per i download o un programma di compressione) che abbia bisogno di molto spazio in /tmp. Per usare questa soluzione è necessario avere il supporto tmpfs abilitato nel kernel e aggiungere una linea come la seguente in /etc/fstab:

none  /tmp  tmpfs  size=32m  0 0
Si presti attenzione al parametro size e lo si modifichi per il proprio sistema. Se non si è sicuri, non lo si modifichi, in quanto si creerebbero facilmente grossi cali di performance (effetto collo di bottiglia). Se si volesse montare /var/log nello stesso modo, non bisogna dimenticare di unire i file di log al disco prima di effettuare l'unmounting. Sono essenziali. Montare anche /var/tmp allo stesso modo è inutile. Portage usa questa directory per la compilazione...
Power Management delle altre periferiche
Power Management del Wireless

Le card Wireless LAN consumano poca energia. E' possibile inserirle nella modalità risparmio energetico in analogia allo script pm.hda.

#!/sbin/runscript
start() {
  ebegin "Activating Power Management for Wireless LAN"
  iwconfig wlan0 power on power max period 3
  eend $?
}

stop () {
  ebegin "Deactivating Power Management for Wireless LAN"
  iwconfig wlan0 power off
  eend $?
}

L'esecuzione di questo script porta la wlan0 in modalità risparmio energetico ponendola in stato di sleep dopo tre secondi di assenza di traffico. Lo si salvi come /etc/init.d/pm.wlan0 e lo si aggiunga al runlevel battery come gli altri. Per dettagli e maggiori opzioni man iwconfig. Se i propri driver oppure l'access point supportano il cambio del beacon time, questo può essere un altro modo per risparmiare ancora più energia.

# chmod +x /etc/init.d/pm.wlan0
# /sbin/depscan.sh
# rc-update add pm.wlan0 battery
USB Power Management

Ci sono due problemi riguardo il consumo di energia delle periferiche USB: primo, periferiche come i mouse USB, le fotocamere digitali o le USB stick consumano energia appena inserite. Non si può ovviare in nessun modo a questo problema (a meno che non vengano rimosse se non necessarie). Secondo, quando ci sono periferiche USB collegate, l'USB host controller accede periodicamente al bus non permettendo alla CPU di passare nelle modalità sleep C3/4. Il Sistema Operativo risolve questo problema attraverso l' "USB selective suspend", non ancora implementato nel kernel. L'USB selective suspend permette l'accesso al bus solo quando la periferica è in uso. L'unico modo, al momento, per aggirare questo problema (fino alla sua implementazione nel kernel) è compilare il supporto USB e le sue periferiche come moduli e rimuoverli attraverso uno script quando non utilizzati (ad esempio alla chiusura del lid).

Stati di Sleep: sleep, standby, suspend to disk
Cosa sono

L'ACPI definisce differenti stati di sleep. I più importanti sono

  • S1 ossia Standby
  • S3 ossia Suspend to RAM ossia Sleep
  • S4 ossia Suspend to Disk ossia Hibernate

Possono essere chiamati quando il sistema non è in uso, ma non si vuole effettuare lo shutdown a causa del lungo tempo di boot.

Sleep, Standby & Hibernate

Il supporto ACPI per questi stati di sleep è instabile per alcune buone ragioni. Gli stati di sleep APM sembrano più stabili, ma non è possibile utilizzare contemporaneamente l'APM e l'ACPI.

Nonostante il supporto agli stati di sleep vada continuamente migliorando, resta tuttora in una fase sperimentale. Swsusp2 e Suspend to Ram sembrano funzionare bene ma è necessario prestare attenzione: si potrebbe facilmente andare incontro a perdita dati.

Attualmente ci sono tre implementazioni per S4. Quella originale è swsusp, a seguire swsusp2 che ha l'interfaccia più carina (include il supporto del bootsplash), ma richiede l'applicazione manuale di una patch al kernel. Ed infine Suspend-to-Disk, un fork di swsusp.

Per un'analisi comparativa delle caratteristiche si veda qui. Se non si dovesse ancora sapere quale scegliere, swsusp2 sembra al momento la soluzione più promettente.

La sezione del kernel a riguardo è la seguente:

Power Management Options --->

  (sleep e standby)
  ACPI( Advanced Configuration and Power Interface ) Support --->
    [*] ACPI Support
       [*]   Sleep States

  (hibernate con swsusp)
  [*] Software Suspend (EXPERIMENTAL)
  
  (hibernate con swsusp2)
  Software Suspend 2
    --- Image Storage (you need at least one writer)
    [*]    Swap Writer
    --- Page Transformers
    [*]    LZF image compression
    (/dev/"your-swap-here")    Default resume device name

  (hibernate con Suspend-to-Disk)
  [*] Suspend-to-Disk Suport
  (/dev/"your-swap-here") Default resume partition

Si compili il kernel con le appropriate opzioni abilitate e si controlli, tramite cat /proc/acpi/sleep per il 2.4 e cat /sys/power/state per il 2.6, ciò che si ha di supportato. Per swsusp è necessario passare al kernel il parametro resume=/dev/"propria-partizione-di-swap". Se questo non fosse possibile, si usi noresume per swsusp, pmdisk=off per Suspend-to-Disk e noresume2 per swsusp2.

Per portare il proprio sistema in uno degli stati di sleep:

(per i kernel 2.4)
# echo 1 > /proc/acpi/sleep          (standby)
# echo 3 > /proc/acpi/sleep          (sleep)

(per i kernel 2.6)
# echo -n standby > /sys/power/state (standby)
# echo -n mem > /sys/power/state     (sleep)

(swsusp)
# echo 4 > /proc/acpi/sleep          (hibernate)

(Suspend-to-Disk)
# echo -n disk > /sys/power/state    (hibernate)

(swsusp2)
# /usr/sbin/hibernate                   (hibernate, si legga di seguito)
E' consigliabile effettuare un backup dei propri dati. Eseguendo sync prima dell'esecuzione di uno dei comandi, i dati di cache verranno scritti sul disco. Provare il tutto al di fuori dell'ambiente grafico X e, in seguito, con X in esecuzione senza essere loggati al suo interno.

Se dovesse capitare un kernel panic a causa di uhci o simili, è utile provare a compilare il supporto USB come modulo per poterlo eventualmente "scaricare" prima che il laptop vada nello stato di sleep.

Mentre tutto ciò che si è visto fino ad ora è sufficiente per eseguire swsusp e Suspend-to-Disk (non si è detto funzionare!), swsusp2 richiede maggiori attenzioni. La prima cosa da fare è applicare la patch fornita da http://softwaresuspend.berlios.de/ al kernel. In seguito sarà necessario installare l'hibernate-script. Una volta installato, si passerà alla sua configurazione tramite il file /etc/hibernate/hibernate.conf e a provare a vedere se funziona:

# emerge hibernate-script
# $EDITOR /etc/hibernate/hibernate.conf
(Ultima occasione per effettuare un backup dei propri dati)
# hibernate
Problemi
Se qualcosa dovesse andare male...

D: Sto cercando di cambiare la frequenza della CPU, ma /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor non esiste.

R: Assicurati che il tuo processore supporti il frequency scaling e di aver scelto il driver giusto. Ecco una lista di processori supportati dal cpufreq (kernel 2.6.7): ARM Integrator, ARM-SA1100, ARM-SA1110, AMD Elan - SC400, SC410, AMD mobile K6-2+, AMD mobile K6-3+, AMD mobile Duron, AMD mobile Athlon, AMD Opteron, AMD Athlon 64, Cyrix Media GXm, Intel mobile PIII e Intel mobile PIII-M su alcuni chipset, Intel Pentium 4, Intel Xeon, Intel Pentium M (Centrino), National Semiconductors Geode GX, Transmeta Crusoe, VIA Cyrix 3 / C3, UltraSPARC-III, SuperH SH-3, SH-4, alcuni "PowerBook" e "iBook2" e vari processori su alcuni sistemi compatibili ACPI 2.0 (solo se gli "ACPI Processor Performance States" sono disponibili attraverso l'interfaccia ACPI/BIOS).

D: Il mio notebook supporta il frequency scaling, ma /sys/devices/system/cpu/cpu0/cpufreq/ è vuoto.

R: Cerca messaggi d'errore relativi all'ACPI con dmesg | grep ACPI. Prova ad aggiornare il BIOS, specialmente se vedi errori riguardo il DSDT. Puoi anche provare a corregge il problema manualmente (ma ciò è al di fuori degli scopi di questa guida).

D: Il mio notebook supporta il frequency scaling, ma secondo /proc/cpuinfo la velocità non cambia mai.

R: Probabilmente hai attivato il supporto al symmetric multiprocessing nel kernel (CONFIG_SMP). Disattivalo e dovrebbe funzionare. Alcune vecchie versioni del kernel presentano un bug al riguardo. In questo caso, esegui emerge x86info, aggiorna il tuo kernel come richiesto e controlla il valore della frequenza con x86info -mhz.

D: Posso cambiare la frequenza della CPU, ma la scelta non è così ampia come quella disponibile in un altro OS.

R: Puoi combinare il frequency scaling con l'ACPI throttoling per ottenere frequenza minori. Ricorda comunque che il throttoling non risparmia molta energia e viene usato solo per una gestione termica (mantiene il notebook freddo). Puoi leggere lo stato attuale del throttoling con cat /proc/acpi/processor/CPU/throttling a cambiarlo con echo -n "0:x" > /proc/acpi/processor/CPU/limit, dove la x è una degli stati Tx elencati in /proc/acpi/processor/CPU/throttling.

D: Nella configurazione del kernel powersave, performance e userspace governors vengono mostrati, ma non vedo la voce ondemand. Dove la trovo?

R: Ondemand governor è incluso solamente nelle ultime versioni del kernel. Prova ad aggiornarlo.

D: La durata della batteria sembra essere peggiorata rispetto a prima.

R: Controlla i settaggi del tuo BIOS. Potresti aver dimenticato di riattivare alcuni settaggi.

D: La mia batteria è carica, ma per KDE è del tutto scarica (riporta 0%) e, quindi, viene avviato la sequenza di shutdown.

R: Controlla che il supporto batteria sia attivato nel tuo kernel. Se lo hai compilato come modulo, assicurati di averlo caricato correttamente.

D: Ho un Dell Inspiron 51XX e non riesco ad ottenere eventi ACPI.

R: Sembra essere un bug del kernel. Leggi qui.

D: Ho appena comprato una nuova batteria, ma dura solo per pochi minuti! Cosa faccio di sbagliato?

R: Prima di tutto segui le istruzioni del venditore su come caricare correttamente la batteria.

D: Niente, è inutile. Cosa faccio ora?

R: Alcune batterie vendute come "nuove" sono in realtà vecchie. Prova questo:

$ grep capacity /proc/acpi/battery/BAT0/info
design capacity:     47520 mWh
last full capacity:  41830 mWh

Se il valore di "last full capacity" differisce di molto da quello di design capacity, la tua batteria è probabilmente rotta. Usa la garanzia.

D: Non ho trovato una soluzione al mio problema. Cosa faccio?

R: Prova a contattarmi direttamente, Dennis Nienhüser.