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.
Questa guida tratta della gestione energetica per i
Poichè questa guida diventa sempre più lunga, segue una breve panoramica di ciò che sarà trattato.
La sezione
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ù.
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
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.
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
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 # /etc/init.d/acpid start # rc-update add acpid default
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
# cd /etc/runlevels # cp -a default battery
Finito. Il nuovo runlevel
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
#!/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
# 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
# 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.
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
Questo può non sembrare un cambiamento dinamico della frequenza e in effetti non lo
è. La dinamicità può essere realizzata con diversi approcci.
Ad esempio,
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.
E' ora di provare il corretto funzionamento del cambio di frequenza della CPU.
# 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
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:
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 è
# emerge cpufreqd
La configurazione di
[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
minfreq=600000 maxfreq=1400000
Infine bisogna avviare il demone.
# rc-update add cpufreqd default battery # rc
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
# 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
Come si può vedere dalla
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
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
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
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
# 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
L'obiettivo è portare l'hard disk nello stato di sleep il prima possibile
quando non viene utilizzato. Verranno analizzate due possibilità. La prima
è
################################################ # 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
#!/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
# chmod +x /etc/init.d/pm.hda # /sbin/depscan.sh # rc-update add pm.hda battery
Gli ultimi kernel (2.6.6 e maggiori, gli ultimi della serie 2.4 e altri con alcune patch)
includono il così detto
# emerge laptop-mode-tools
I
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
none /tmp tmpfs size=32m 0 0
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
# chmod +x /etc/init.d/pm.wlan0 # /sbin/depscan.sh # rc-update add pm.wlan0 battery
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).
L'ACPI definisce differenti stati di sleep. I più importanti sono
Possono essere chiamati quando il sistema non è in uso, ma non si vuole effettuare lo shutdown a causa del lungo tempo di boot.
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.
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
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
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)
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
# emerge hibernate-script # $EDITOR /etc/hibernate/hibernate.conf(Ultima occasione per effettuare un backup dei propri dati) # hibernate
$ 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.