Guida alla Gestione Energetica

Contenuti:

1.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 


Figura 1: Peso energetico per ogni componente

Fig. 1: Quale componente consuma quanta  energia?

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ù.

2.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.

In Portage ci sono differenti versioni del kernel. Quelle consigliate sono gentoo-sources e suspend2-sources. La seconda, in particolare, contiene le ultime patch per il supporto Software Suspend 2; si veda la sezione sugli stati di sleep per maggiori dettagli. Nelle opzioni di configurazione del kernel vanno, in ogni caso, attivate le opzioni seguenti:

Esempio 1: Settaggi minimi del kernel per il Power Management (Kernel 2.6)

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

  ACPI( Advanced Configuration and Power Interface ) Support --->
    [*] ACPI Support
    [ ]   Sleep States
    [ ]     /proc/acpi/sleep (deprecated)
    [*]   AC Adapter
    [*]   Battery
    <M>   Button
    <M>   Video
    [ ]   Generic Hotkey
    <M>   Fan
    <M>   Processor
    <M>     Thermal Zone
    < >   ASUS/Medion Laptop Extras
    < >   IBM ThinkPad Laptop Extras
    < >   Toshiba Laptop Extras
    (0)   Disable ACPI for systems before Jan 1st this year
    [ ]   Debug Statements
    [*]   Power Management Timer Support
    < >   ACPI0004,PNP0A05 and PNP0A06 Container Driver (EXPERIMENTAL)
    
  CPU Frequency Scaling --->
    [*] CPU Frequency scaling
    [ ]   Enable CPUfreq debugging
    < >   CPU frequency translation statistics
    [ ]     CPU frequency translation statistics details
          Default CPUFreq governor (userspace)
    <*>   'performance' governor
    <*>   'powersave' governor
    <*>   'ondemand' cpufreq policy governor
    <*>   'conservative' cpufreq governor
    <*>   CPU frequency table helpers
    <M> ACPI Processor P-States driver
    <*> driver CPUFreq a seconda del processore

E' possibile attivare, a propria discrezione, Software Suspend e Sleep States. I possessori di notebook ASUS, Medion, Thinkpad IBM 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.

Esempio 2: Installazione di acpid

# 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.

Nota: 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.

Esempio 3: Creazione 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. Di questo si occuperà un piccolo script.

E' necessario uno script in grado di cambiare il runlevel fra default e battery a seconda della sorgente energetica utilizzata. Lo script utilizzata il comando on_ac_power fornito da sys-power/powermgmt-base - ci si assicuri dell'installazione di tale pacchetto nel proprio sistema.

Esempio 4: Installazione di powermgt-base

# emerge powermgmt-base

Ora, tramite il comando on_ac_power && echo AC available || echo Running on batteries eseguito in shell è possibile determinare la sorgente energetica in uso. Lo script seguente è responsabile del cambio di runlevel. Va salvato come /etc/acpi/actions/pmg_switch_runlevel.sh

Esempio 5: /etc/acpi/actions/pmg_switch_runlevel.sh

#!/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

Con il comando chmod +x /etc/acpi/actions/pmg_switch_runlevel.sh si rende lo script eseguibile. Infine è necessario che lo script venga eseguito ad ogni cambio di sorgente energetica dal demone acpid. Bisogna, però, sapere quali eventi vengono generati al cambio di sorgente energetica. Gli eventi vengono chiamati ac_adapter e battery sulla maggior parte dei notebook, ma si potrebbero avere delle eccezioni.

Esempio 6: Determinazione degli eventi ACPI al cambio di sorgente energetica

# tail -f /var/log/acpid | grep "received event"

Si esegua il comando sopra indicato e si stacchi il cavo di alimentazione dal proprio notebook.

Esempio 7: Esempio di output al cambio di sorgente energetica

[Tue Sep 20 17:39:06 2005] received event "ac_adapter AC 00000080 00000000"
[Tue Sep 20 17:39:06 2005] received event "battery BAT0 00000080 00000001"

La parte interessante di questo output è quella che segue received event fra le virgolette. Sarà necessario inserire queste stringhe nello script che segue. In caso il proprio notebook dovesse generare più eventi o sempre lo stesso evento, non c'è da preoccuparsi.

Esempio 8: /etc/acpi/events/pmg_ac_adapter

# Si sostituisca "ac_adapter" indicato di seguito con l'evento generato dal proprio notebook
# Ad esempio ac_adapter.* sarà sostituito da ac_adapter AC 00000080 00000000
event=ac_adapter.*
action=/etc/acpi/actions/pmg_switch_runlevel.sh %e

Esempio 9: /etc/acpi/events/pmg_battery

# Si sostituisca "battery" indicato di seguito con l'evento generato dal proprio notebook
# Ad esempio battery.* sarà sostituito da battery BAT0 00000080 00000001
event=battery.*
action=/etc/acpi/actions/pmg_switch_runlevel.sh %e

Sarà necessario riavviare il demone acpid per rendere attivi i cambiamenti apportati.

Esempio 10: Riavvio del demone acpid

# /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. Questo va bene se si è collegati direttamente a rete elettrica, certamente no quando si avvia da batteria. Una soluzione potrebbe essere l'aggiunta di un parametro del tipo softlevel=battery al proprio boot loader, ma ci si potrebbe dimenticare di selezionarlo. Una soluzione migliore è sicuramente quella di generare un finto evento ACPI alla fine del processo di boot e lasciare che lo script pmg_switch_runlevel.sh decida quale runlevel utilizzare. Si apra con il proprio editor il file /etc/conf.d/local.start e si aggiungano le linee:

Esempio 11: Cambio del runlevel al boot del notebook con la modifica di local.start

# 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.

3.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.

Nota: 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.

Esempio 12: Controllo della frequenza della CPU

# emerge cpufrequtils
# cpufreq-info

Ecco un esempio di quello che si ottiene:

Esempio 13: Output di esempio di cpufreq-info

cpufrequtils 0.3: 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: conservative, 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.

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.

Nome Categoria Causa cambio Governor del kernel Governor supportati Note
'ondemand' governor Kernel Carico della CPU N.A. N.A. Scegle la frequenza massima in caso di carico della CPU e frequenze man mano più basse in caso di CPU libera. 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.
'conservative' governor Kernel Carico della CPU N.A. N.A. A differenza dell'ondemand governor, il conservative non salta alla massima frequenza quando il carico della CPU cresce, ma aumenta poco alla volta la frequenza. 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.
cpudyn Demone Carico della CPU Performance, powersave Dynamic Supporta anche lo standby dei dischi - si noti, però, che il laptop mode in molti casi funziona decisamente meglio.
cpufreqd Demone Stato della batteria, Carico della CPU, Temperatura, Programmi in esecuzione Tutti disponibili Nessuno Configurazioni sofisticata (ma anche complesse).
powernowd Demone Carico della CPU Nessuno Passive, sine, aggressive Supporta SMP.
ncpufreqd Demone Temperatura Nessuno Powersave, performance Passa da modalità performance a powersave a seconda della temperatura del sistema. Molto utile su notebook con noti problemi di surriscaldamento.
speedfreq Demone Carico della CPU Nessuno Dynamic, powersave, performance, fixed speed Semplice da configurare con una interfaccia client/server. Richiede un kernel della serie 2.6. Il suo sviluppo è stato interrotto, non è più funzionante e per questo motivo è stato rimosso da Portage.
gtk-cpuspeedy GUI Nessuno Nessuno Nessuno Applicazione per Gnome, utility grafica per configurare manualmente la frequenza della CPU. Non offre nessun tipo di automazione.
klaptopdaemon GUI Stato della batteria Tutti disponibili Nessuno Solamente per KDE, 'ondemand' governor necessario per il cambio dinamico della frequenza.

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:

Esempio 14: Installazione di 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).

Esempio 15: /etc/cpufreqd.conf

[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=conservative
minfreq=0%
maxfreq=100%
policy=conservative

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

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

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

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

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

Ora si può avviare il demone cpufreqd. Lo si aggiunga ai runlevel default e battery come mostrato di seguito.

Esempio 16: Avvio di cpufreqd

# rc-update add cpufreqd default battery
# rc

Attenzione: 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:

Esempio 17: Monitoraggio della velocità della CPU

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

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

Esempio 18: Monitoraggio alternativo della velocità della CPU

# 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.

4.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 X.org, si può editare /etc/X11/xorg.conf come di seguito riportato:

Esempio 19: Settaggi dell'LCD suspend in X.org e in XFree86

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.

Attenzione: 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.

Esempio 20: Caricamento automatico del modulo ibm_acpi

(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.

Esempio 21: /etc/conf.d/lcd-brightness

# 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

Esempio 22: /etc/init.d/lcd-brightness

#!/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.

Esempio 23: Regolazione automatica della luminosità

# chmod +x /etc/init.d/lcd-brightness
# rc-update add lcd-brightness battery
# rc

5.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:

Esempio 24: Uso di cpudyn per lo standby dell'hard disk

################################################
# 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:

Esempio 25: Uso di hdparm per lo standby dell'hard disk

#!/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.

Esempio 26: Configurazione per lo standby automatico del disco

# chmod +x /etc/init.d/pm.hda
# /sbin/depscan.sh
# rc-update add pm.hda battery

Importante: 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.

Esempio 27: Avvio automatico del laptop-mode

# 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.

Esempio 28: Disattivare cups nella modalità batteria

# 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:

Esempio 29: Modifica di /etc/fstab per rendere /tmp volatile

none  /tmp  tmpfs  size=32m  0 0

Attenzione: 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...

6.Power Management per altre periferiche

Schede grafiche 

Se si è in possesso di una scheda grafica ATI con supporto PowerPlay (dynamic clock scaling per le GPU, graphic processing unit), in X.org è possibile abilitare questa caratteristica. Bisogna aprire il file /etc/X11/xorg.conf e aggiungere (oppure attivare) l'opzione DynamicClocks nella sezione Device. Questa opzione attivita su alcuni sistemi può provocare blocchi o crash.

Esempio 30: Attivazione del supporto PowerPlay per le schede grafiche ATI in X.org

Section "Device"
[...]
Option      "DynamicClocks" "on"
EndSection

Power Management del Wireless 

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

Esempio 31: Power Management automatico per le WLAN

#!/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.

Esempio 32: Power Management for WLAN

# 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 nella modalità sleep. Il kernel presenta una opzione sperimentale per attivare la sospensione delle periferiche USB tramite le chiamate al driver oppure tramite uno dei file power/state in /sys.

Esempio 33: Attivazione del supporto USB suspend nel kernel

Device Drivers
 USB support
  [*]   Support for Host-side USB
    [*]   USB suspend/resume (EXPERIMENTAL)

7.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 (S3) 

Il supporto ACPI per questi stati di spleep è considerato sperimentale per delle buone ragioni. Gli stati di sleep APM sembrano essere più stabili, purtroppo non è possibile utilizzare contemporaneamente APM e ACPI.

Esempio 34: Configurazione del kernel per il supporto agli stati di sleep

 Power Management Options --->
  [*]  Power Management support
     ACPI (Advanced Configuration and Power Interface) Support --->
      [*]  ACPI Support
        [*]   Sleep States

Compilato il kernel con le opzioni sopra considerate, è possibile utilizzare l'hibernate-script per attivare la sospensione o una modalità di sleep.

Esempio 35: Installazione dell'hibernate-script

# emerge hibernate-script

Sono ora necessarie alcune configurazioni in /etc/hibernate. Di default, il pacchetto appena installato contiene due file di configurazione: hibernate.conf e ram.conf.

Per configurare lo sleep, bisogna modificare ram.conf in /etc/hibernate. UseSysfsPowerState mem è settato correttamente, ma sarà necessario scorrere il resto del file di configurazione e modificarlo secondo il proprio sistema. I commenti e i nomi delle opzioni saranno di aiuto. In caso di condivisioni samba o nfs in una rete, bisognerà assicurarsi di bloccare gli script init per evitare errori di timeout.

Giunti a questo punto, questa sarà l'ultima occasione per effettuare un backup dei propri dati prima dell'esecuzione del prossimo comando. Probabilmente per tornare indietro dallo stato di sleep, occorrerà premere un tasto speciale come Fn.

Esempio 36: Chiamata di sleep

# hibernate-ram

Se si sta ancora leggendo questa guida, sarà segno di un corretto funzionamento. Sarà possibile anche configurare lo standby (S1) in maniera simile copiando ram.conf in standby.conf e creando un link simbolico a /usr/sbin/hibernate chiamato /usr/sbin/hibernate-standby. S3 e S4 sono gli stati di sleep più importanti poichè permetteno un grande risparmio di energia.

Hibernate (S4) 

Questa sezione tratta dell'ibernazione; un'immagine del sistema in esecuzione viene scritta sul disco prima dello spegnimento. Alla riaccensione (resume), l'immagine viene caricata ed è possibile riprendere il proprio lavoro dal punto esatto in cui lo si è interrotto prima dell'ibernazione.

Attenzione: Nessuna periferica hot-plug va cambiata o scambiata in stato di sospensione. Non si carichi un'immagine con un kernel differente rispetto a quello con cui la si è creata. Ogni client/server samba o nfs va bloccato prima dell'ibernazione.

Attualmente ci sono due implementazioni per S4. Quella originale è swsusp, poi c'è la più nuova suspend2 con un'interfaccia carina (supporto fbsplash incluso). E' possibile trovare un'analisi comparativa alla homepage di suspend2. Suspend-to-Disk (pmdisk), un fork di swsusp, è stato riunito al progetto originale.

Suspend2 non è ancora incluso nel kernel ufficiale, per questo motivo sarà necessario applicare una patch, disponibile all'indirizzo suspend2.net, ai sorgenti del kernel oppure utilizzare sys-kernel/suspend2-sources.

La sezione del kernel necessaria sia a swsusp che a suspen2 è la seguente:

Esempio 37: Configurazione del kernel per i vari stati di sospensione

Power Management Options --->
  (hibernate con swsusp)
  [*] Software Suspend
      (sostituire /dev/SWAP con la propria partizione di swap)
      (/dev/SWAP)      Default resume partition
 
  (hibernate con suspend2)
  Software Suspend 2
    --- Image Storage (you need at least one writer)
    [*]    File Writer
    [*]    Swap Writer
    ---   General Options
    [*]    LZF image compression
    (sostituire /dev/SWAP con la propria partizione di swap)
    (swap:/dev/SWAP)   Default resume device name
    [ ]    Allow Keep Image Mode
	
	

La configurazione di swsusp è piuttosto semplice. Se non si è indicata la giusta locazione della partizione di swap nella configurazione del kernel, è possibile passarla come parametro con la direttiva resume=/dev/SWAP. Se non è possibile effettuare l'avvio a causa di un'immagine rovinata, si può utilizzare il parametro del kernel noresume. Lo script di avvio hibernate-cleanup invaliderà l'immagine rovinata durante il processo di boot.

Esempio 38: Invalidamento dell'immagine swsusp durante il processo di avvio

# rc-update add hibernate-cleanup boot

Per attivare l'ibernazione con swsusp, si utilizza lo script hibernate dopo aver settato UseSysfsPowerState disk in /etc/hibernate/hibernate.conf.

Attenzione: 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. Ci sono opzioni di configurazione a proposito in hibernate.conf.

Esempio 39: Ibernazione con swsusp

# nano -w /etc/hibernate.conf
(Assicurarsi di avere un backup dei propri dati)
# hibernate

La sezione seguente tratta della configurazione di suspend2 con il supporto fbsplash per avere una "progress bar" (barra di avanzamento) grafica durante la sospensione e il ripristino.

La prima parte della configurazione è simile alla configurazione di swsusp. Se non si è indicata la giusta locazione della partizione di swap nella configurazione del kernel, è possibile passarla come parametro con la direttiva resume2=swap:/dev/SWAP. Se non è possibile effettuare l'avvio, si può utilizzare il parametro noresume2. Inoltre, lo script di avvio hibernate-cleanup invaliderà l'immagine di suspend2 rovinata durante il processo di boot.

Esempio 40: Invalidamento dell'immagine suspend2 durante il processo di avvio

# rc-update add hibernate-cleanup boot

Ora è necessario modificare il file /etc/hibernate/hibernate.conf, attivando la sezione suspend2 e commentando tutte le linee nelle sezioni sysfs_power_state e acpi_sleep. Per il momento la parte fbsplash non va attivata nelle opzioni globali.

Esempio 41: Ibernazione con suspend2

# nano -w /etc/hibernate.conf
(Assicurarsi di avere un backup dei propri dati)
# hibernate

Ora è il momento di configurare fbsplash. Per attivare il supporto fbsplash durante l'ibernazione, è necessario il pacchetto sys-apps/suspend2-userui con la USE flag fbsplash attivata.

Esempio 42: Installazione di suspend2-userui

# mkdir -p /etc/portage
# echo sys-apps/suspend2-userui fbsplash >> /etc/portage/package.use
# emerge suspend2-userui

L'ebuild richiede la creazione di un link simbolico al tema da utilizzare. Ad esempio, per utilizzare il tema livecd-2005.1, sarà necessario il comando:

Esempio 43: Utilizzo del tema livecd-2005.1 durante l'ibernazione

# ln -sfn /etc/splash/livecd-2005.1 /etc/splash/suspend2

Se non si vuole uno schermo nero nella prima parte del processo di ripristino, bisognerà aggiungere suspend2ui_fbsplash alla propria immagine initrd. Se si è creata la propria immagine initrd con splash_geninitramfs e la si è salvata come /boot/fbsplash-emergence-1024x768, i passi da seguire sono i seguenti:

Esempio 44: Aggiunta di suspend2ui_fbsplash alla immagine initrd

# mount /boot
# mkdir ~/initrd.d
# cp /boot/fbsplash-emergence-1024x768 ~/initrd.d/
# cd ~/initrd.d
# gunzip -c fbsplash-emergence-1024x768 | cpio -idm --quiet -H newc
# rm fbsplash-emergence-1024x768
# cp /usr/sbin/suspend2ui_fbsplash sbin/
# find . | cpio --quiet --dereference -o -H newc | gzip -9 > /boot/fbsplash-suspend2-emergence-1024x768

In seguito vanno modificati grub.conf oppure lilo.conf a seconda del boot manager utilizzato per fare in modo che il proprio kernel suspend2 utilizzi /boot/fbsplash-suspend2-emergence-1024x768 come immagine initrd. Ora è possibile effettuare un test per verificare il corretto funzionamento.

Esempio 45: Test di ibernazione con fbsplash

# suspend2ui_fbsplash -t

Ora, si apra ancora una volta il file /etc/hibernate/hibernate.conf e si attivino le opzioni fbsplash. Si esegua hibernate, tutto dovrebbe funzionare in maniera corretta.

8.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 attivato l'opzione DynamicClocks in xorg.conf e ora ottengo crash / lo schermo rimane nero / il mio notebook non effettua correttamente lo shutdown (spegnimento).

R: Questo accade purtroppo su alcuni sistemi. L'unica soluzione è la disattivazione dell'opzione DynamicClocks.

D: Voglio utilizzare suspend2, ma la mia partizione di swap viene indicata come troppo piccola. Non posso effettuare un suo ridimensionamento.

R: Se non c'è abbastanza spazio libero sul tuo sistema, è possibile utilizzare il filewriter al posto dello swapwriter. hibernate-script lo supporta bene. Maggiori informazioni nel file /usr/src/linux/Documentation/power/suspend2.txt.

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:

Esempio 46: Stato della batteria

$ 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.



Ultimo aggiorn.:
2005-10-02
Dennis Nienhüser
Autore

Francesco Grieco
Traduzione

Sommario:  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.
- 2002 Gentoo.it - Domande, commenti e/o correzioni? Email gentoo-dev@gentoo.it.