Guida alla Gestione Energetica
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 |
 |
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
RUNLEVEL_AC="default"
RUNLEVEL_BATTERY="battery"
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 |
event=ac_adapter.*
action=/etc/acpi/actions/pmg_switch_runlevel.sh %e
|
Esempio 9: /etc/acpi/events/pmg_battery |
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 |
/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"
Option "StandbyTime" "10"
Option "SuspendTime" "20"
Option "OffTime" "30"
[...]
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 |
# 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 |
BRIGHTNESS_AC=7
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 |
TIMEOUT=60
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 --->
[*] Software Suspend
(/dev/SWAP) Default resume partition
Software Suspend 2
--- Image Storage (you need at least one writer)
[*] File Writer
[*] Swap Writer
--- General Options
[*] LZF image compression
(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
# 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
# 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.
|