Oszczędzanie energii - Toshiba Portege R500
Po publikacji artykułu o konfiguracji notebooka Toshiba Portege R500 pod systemem Debian GNU/Linux wiele osób odezwało się do mnie z pytaniem "Jak to jest możliwe, że Twój laptop działa tak długo i pobiera tak mało prądu?! To niemożliwe!". Niedowierzali tym słowom:
Na podstawowej baterii z włączonymi wszystkimi urządzeniami (Bluetooth, WiFi, podłączone dwa telefony pod USB) na maksymalnym podświetleniu notebook działa 4 godziny bez przerwy, przy założeniu oszczędzania energii pobór mocy spada do... 6W co umożliwia nieprzerwaną pracę biurową przez (uwaga!) 9 godzin! Oczywiście, to tylko teoretyczne założenie, w praktyce nie osiągnąłem jeszcze na podstawowej baterii czasu dłuższego niż 7 godzin.
Pierwszy screen obrazuje sytuację, gdy wszystkie możliwości sprzętu są aktywne, działa karta Wi-Fi, Bluetooth, jasność matrycy jest ustawiona na maksymalny poziom etc. KPowerSave informuje, że czas działania laptopa oscyluje w granicach 5 godzin (bateria jest maksymalnie naładowana).
Drugi zrzut ekranu wykonałem, gdy wyłączyłem WiFi, moduł Bluetooth oraz przyciemniłem matrycę do poziomu 2/7 (gdzie 7/7 to maksymalna wartość, 1/7 to minimalna a 0/7 to wyłączone podświetlenie matrycy). Dodatkowo wyłączyłem obsługę PCMCIA oraz kart SD (generują bardzo dużo przerwań). KPowerSave poinformował, że notebook powinien pracować około 6 godzin i 44 minut, jednak PowerTop uruchomiony w tle pokazuje długoterminowe działanie w granicach 7 i pół godziny. To maksymalny wynik jaki udało mi się uzyskać nie uciekając się do prób zaawansowanego oszczędzania energii. Niestety, mój kernel wywołuje dużo przerwań między swoimi dwoma rdzeniami, co jest bolączką jądra 2.6.24. Nie mam zamiaru go na razie zmieniać, zbyt leniwy jestem ;-). Sądzę, że mógłbym po odpowiednim dobraniu jądra zyskać około pół godziny.
Oczywiście, można posunąć się dalej! W tym celu napisałem prosty skrypt Basha, który wywołany na Toshibie Portege R500 włączy wszystkie możliwe funkcje oszczędzania energii i pozwoli pracować na podstawowej baterii do 9 godzin. Skrypt wyłącza następujące urządzenia:
- Porty USB
- Czytnik kard SD oraz slot PCMCIA
- Kartę bezprzewodową (karta ethernet działa)
- Kartę dźwiękową
- CDROM
- Zmniejsza podświetlenie matrycy do najniższego poziomu (1/7)
- Wyłącza obsługę NFS (generuje sporo przerwań)
Zapytacie "po co?!". Jasne, to sztuka dla sztuki :-). Po prostu lubię się bawić ;-). I jeszcze bardziej - lubię pisać w Bashu :-). Ponadto - używam tego skryptu jadąc pociągiem, gdy piszę np. nowy artykuł, dokańczam swoje programy lub po prostu oglądam film (wtedy włączam tylko kartę dźwiękową).
Skrypt znajdziecie TUTAJ
Przetestowany został na dystrybucyjnym jądrze Debiana w wersji 2.6.24, nie zamieszczam go w całości, gdyż ma 221 linijek.
Po kilku modyfikacjach można go z powodzeniem używać na dowolnym laptopie - zmianić należy funkcję odpowiedzialną za włączanie//wyłączenia karty wifi, Bluetooth oraz karty dźwiękowej.
Enjoy!
Instalacja pakietu Debiana bez zależności
UWAGA! Poniższego rozwiązania używasz na własną odpowiedzialność. SOA#1
System zależności zaimplementowany w apt-get ma swoje wady i zalety. Niewątpliwą zaletą jest "zrób-i-zapomnij". Jedna komenda instaluje pakiet, jego zależności i wszystko co potrzebne do działania programu. Jednak największa zaleta czasem staje się największą wadą...
Dawno temu zauroczony systemem pakietów w Slackware napisałem sobie mały skrypt do instalacji pakietu Debiana bez jego zależności.
#!/bin/bash
sciezka=$(apt-cache show $1 | grep Filename | awk '{print $2}')
sciagnij=$(wget -c http://ftp.debian.org/$sciezka)
plik=$(apt-cache show $1 | grep Filename | awk '{print $2}' | sed "s/\// /g" | awk '{print $5}')
dpkg -x $plik /
Tak proste że aż głupie :-). Jeden minus - trzeba znać nazwę paczki i podać ją jako parametr. Sam plik zapisujemy np. jako /sbin/apt-inst i cieszymy się jak dzieci że każdy program który zainstalujemy w ten sposób będzie zachowywał się mniej więcej "in_Slackware_style":
$ krusader krusader: error while loading shared libraries: libkjsembed.so.1: cannot open shared object file: No such file or directory
No ale co za problem ;-).
# apt-inst libkjsembed1
I krusader działa :-).
Raz jeszcze piszę - używasz na własną odpowiedzialność. Sam skrypt przydaje się przy budowaniu minimalistycznego systemu, trzeba jednak posiadać dość sporą wiedzę na temat systemu Linux. Za pomocą tego "czegoś" udało mi się swego czasu zmieścić działającego Debiana + KDE (dość minimalistyczne) w około 350MiB. Wiem że możliwe jest postawienie bardzo minimalistycznego systemu (np. dla routera sprzętowego) na mniej niż 64MiB. Komuś się uda? :-)
ps. wbrew pozorom lubię slacka a wpis nie ma charakteru prowokacji :)
ps2. uprzedzam pytanie: "Jak odinstalować taki program?" - ręcznie. Sprawdzasz gdzie się zainstalował i ręcznie usuwasz pliki.
Mała sieć domowa w oparciu o system Linux
Dzisiaj zajmiemy się tworzeniem małej, dość dobrze zabezpieczonej sieci domowej. Udostępnianie internetu zrealizujemy poprzez komputer-host z zainstalowanym systemem Linux (dowolnym, może być Ubuntu, Debian, Mandriva i inne). Pamiętajcie jednak, że Wasze środowisko może różnić się od środowiska zaprezentowanego w artykule – analizujcie treść a nie tylko przeklejajcie komendy do konsoli! Lecimy!
Załóżmy środowisko:

Dla ułatwienia ustalmy hostname dla komputerów:
- komp1) orion nasz router
- komp2) scorpio podłączony przez interfejs eth1
- komp3) omega podłączony przez interfejs eth2
- komp4) syrius podłączony przez interfejs eth3
Oczywiście w sieci może być więcej komputerów – wystarczy do routera wsadzić większą ilość kart sieciowych. W przykładzie wykorzystałem 3 komputery z zainstalowanym systemem Debian GNU/Linux, nic jednak nie stoi na przeszkodzie aby był to jakikolwiek inny system operacyjny.
Dokładny opis naszej przykładowej sieci domowej:
Komputer1 (orion) ma 4 karty sieciowe na złączu PCI:
[22:00:05] night@orion:~$ lspci | grep -i ether 02:05.0 Ethernet controller: 3Com Corporation 3c940 10/100/1000Base-T [Marvell] (rev 12) 02:0b.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL-8139/8139C/8139C+ (rev 10) 02:0c.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL-8029(AS) 02:0d.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL-8139/8139C/8139C+ (rev 10)
W kolejności są to interfejsy od eth0 do eth3, przy czym interfejs eth0 (gigabitowa karta 3com) jest wpięta do sieci internet dostając adres z klasy prywatnej 192.168.0.10.
<22:02:26> root@orion:/home/night# ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:0E:2E:90:A7:37
inet addr:192.168.0.10 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::20e:2eff:fe90:a737/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:2274170 errors:0 dropped:0 overruns:0 frame:0
TX packets:2224882 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:2140325129 (1.9 GiB) TX bytes:1161463487 (1.0 GiB)
Interrupt:21 Base address:0xd400
Konfiguracja kart sieciowych
Zaczynamy od konfiguracji pozostałych kart sieciowych. W tym celu wyedytujemy plik /etc/network/interfaces w poniższy sposób:
(...) auto eth0 iface eth0 inet dhcp auto eth1 iface eth1 inet static address 10.0.0.1 netmask 255.255.255.0 auto eth2 iface eth2 inet static address 10.0.1.1 netmask 255.255.255.0 auto eth3 iface eth3 inet static address 10.0.2.1 netmask 255.255.255.0 (...)
I restart sieci:
# /etc/init.d/networking restart
To tyle w kwestii kart sieciowych. Teraz DHCP!
Konfiguracja serwera DHCP
Na początek szybka instalacja:
# apt-get install dhcp3-server
... i konfiguracja:
# rm /etc/dhcp3/dhcpd.conf; nano -w /etc/dhcp3/dhcpd.conf
W pliczku (który będzie pusty) wpisujemy dla każdej podsieci:
subnet 10.0.0.0 netmask 255.255.255.0 {
range 10.0.0.3 10.0.0.254;
default-lease-time 6100;
option domain-name „nasza.domena”;
option domain-name-servers pierwszy.dns, drugi.dns;
option routers 10.0.0.1;
option subnet-mask 255.255.255.0;
option broadcast-address 10.0.0.255;
host scorpio { # komputer nr 1
hardware ethernet adres.mac;
fixed-address 10.0.0.2;
}
}
Oczywiście zmieniamy domenę, dns’y na własne a adres.mac wypełniamy adresem MAC komputera nr 1 (scorpio). Pozwoli nam to przypisywać jeden i zawsze ten sam adres IP dla tej maszyny. Dla reszty podsieci deklarujemy podobnie:
subnet 10.0.1.0 netmask 255.255.255.0 {
range 10.0.1.3 10.0.1.254;
default-lease-time 6100;
option domain-name „nasza.domena”;
option domain-name-servers dns,pierwszy, dns.drugi;
option routers 10.0.1.1;
option subnet-mask 255.255.255.0;
option broadcast-address 10.0.1.255;
host scorpio {
hardware ethernet adres.mac;
fixed-address 10.0.1.2;
}
}
Analogicznie dla podsieci trzeciej zmiejając odpowiednio ustawienia IP w konfiguracji. Drobna zmiana w skrypcie startowym:
# nano -w /etc/default/dhcp3-server
gdzie definiujemy interfejsy na których działać ma serwer DHCP
INTERFACES="eth1 eth2 eth3"
... i restart demona
/etc/init.d/dhcp3-server restart
W tym momencie możemy sprawdzić, czy nasze stacje robocze otrzymały adres sieciowy (należy odświeżyć ustawienia IP na każdym z nich). Jeśli wszystko zrobiliśmy dobrze powinniśmy móc pingować każdy z naszych komputerów. Pozostało nam udostępnienie dla nich internetu.
Udostępnianie sieci
W tym celu stworzymy dodatkowy skrypt startowy:
# nano -w /etc/init.d/firewall
Do którego to wpiszemy następujące regułki iptables:
#linijka potrzebna do włączenia udostępniania internetu echo 1 > /proc/sys/net/ipv4/ip_forward #wyczyszczenie starych reguł z pamięci iptables iptables -F iptables -X iptables -t nat -X iptables -t nat -F # ustawienie domyślnej polityki (o tym później) iptables -P INPUT ACCEPT iptables -P FORWARD ACCEPT iptables -P OUTPUT ACCEPT iptables -A INPUT -i lo -j ACCEPT iptables -A FORWARD -o lo -j ACCEPT # Najważniejsze - udostępnienie sieci dla wybranych podsieci iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -j MASQUERADE iptables -t nat -A POSTROUTING -s 10.0.1.0/24 -j MASQUERADE iptables -t nat -A POSTROUTING -s 10.0.2.0/24 -j MASQUERADE
Plik zapisujemy, nadajemy mu prawa wykonywalności:
# chmod +x /etc/init.d/firewall
dopisujemy do standardowych runleveli:
# update-rc.d firewall defaults 90
i odpalamy:
# /etc/init.d/firewall
W tym momencie mamy działający internet na wszystkich 3 komputerach. Voila! Trzy ostatnie linijki w skrypcie powinny stworzyć nam odpowiednią tablicę routingu:
# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 10.0.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1 10.0.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth2 10.0.2.0 0.0.0.0 255.255.255.0 U 0 0 0 eth3 192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 0.0.0.0 192.168.0.1 0.0.0.0 UG 0 0 0 eth0
Dzięki tym wpisom komputery w sieci domowej będą „widzieć się wzajemnie”. Możemy to sprawdzić pingując hosta scorpio z hosta omega, lub na odwrót. No i najważniejsze – możemy korzystać z internetu na wszystkich końcówkach podpiętych do sieci domowej :-).
Powiedzmy jednak, że to nas nie satysfakcjonuje. Chcemy mieć możliwość logowania się poprzez ssh do każdego z komputerów w sieci domowej. Musimy zatem zająć się forwardowaniem portów.
Przekierowanie portów
Aby przekierować wybrany port z hosta A na nasz router musimy na końcu naszego skryptu firewall dopisać:
iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 800 -j DNAT --to 10.0.0.2:22
Co to robi? Forwarduje każde zapytanie przychodzące na port 800 karty sieciowej eth0 na adres 10.0.0.2, port 22 w sieci lokalnej. Zatem, jeśli odpytamy nasz router z sieci zewnętrznej w ten sposób:
$ ssh <user>@<host> -p 800
Dostaniemy de facto połączenie z komputerem z adresem 10.0.0.2 w sieci lokalnej. W naszym przykładzie będzie to scorpio. Dodajmy resztę hostów:
iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 800 -j DNAT --to 10.0.0.2:22 iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 801 -j DNAT --to 10.0.1.2:22 iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 802 -j DNAT --to 10.0.1.2:22
I w ten sposób mamy możliwość zalogowania się na każdy z naszych komputerów w sieci domowej z zewnątrz.
Jutro opiszę sposób zabezpieczenia naszego routera przed najpopularniejszymi atakami z zewnątrz w przypadku gdy posiadamy publiczny adres IP. Enjoy!
W artykule mogły pojawić się błędy i nieścisłości. Będzie on zaktualizowany w przypadku wykryciu takowych.
Interfejs do wysyłania smsów via sms-pl
Napisałem sobie prosty skrypt do wysyłania smsów poprzez program sms-pl (dostępny w repozytoriach). Jego konfiguracja opiera się na wprowadzeniu dwóch linijek do pliku /etc/smsrc w których zawrzemy nasz login i hasło do płatnej bramki sms (sposób edycji znajdziemy w dokumentacji programu), możliwe także jest skorzystanie z bezpłatnych bramek sms! Po odpowiednim skonfigurowaniu sms-pl możemy już korzystać z poniższego skryptu: (w przypadku korzystania z innej bramki niż miastoplusa należy wyedytować jedną linijkę w skrypcie)
#!/bin/bash
numer=$(kdialog --inputbox "Wyślij sms pod numer:")
tresc=$(kdialog --textinputbox "Wprowadź treść:")
kdialog --passivepopup "Wysyłam wiadomość..." 4
sms -g miastoplusa -n "$numer" -m "$tresc"
if [ $? == 1 ]; then
kdialog --sorry "Sms nie wysłany, spróbuj ponownie"
else
kdialog --passivepopup "Wiadomość wysłana!" 3
fi
exit 0
Zamieniąc odpowiednio kdialog na xdialog lub dialog skrypt będzie działać też w innych środowiskach graficznych niż KDE (możliwe że konieczna będzie drobna zmiana skryptu).
Wiem że to banalne, wiem że są odpowiednie programy do robienia tego samego. Wolę jednak korzystać z własnych rozwiązań.
PowerTOP - zarządzanie energią
Każdy posiadacz laptopa chciałby, aby jego maszyna pracowała jak najdłużej i jak najefektywniej. Nie ma nic bardziej denerwującego, niż komunikat "Stan krytyczny: 5 minut" w czasie pracy nad ważnym dokumentem//wpisem na joggera w przypływie weny :-). Programiści Intela wyszli naprzeciw użytkownikom i stworzyli mały i bardzo pomocny program - PowerTOP.
PowerTOP (strona domowa) to aplikacja, która ma za zadanie badać słabe punkty Twojego systemu (pod względem poboru energii). Wygląd i sposób działania aplikacji można porównać do popularnego 'top' (patrz screen). Sposób działania programu opiera się na pobieraniu z przestrzeni użytkownika oraz jądra stosownych informacji na temat m.in. ACPI, konfiguracji jądra, modułów i przekazywaniu wyniku testów na ekranie w formie mini-porad. PowerTOP informuje nas o czasie działania procesora w każdym ze stanów (throttling//scalling), ilości wzbudzeń procesora ze stanu uśpionego w ciągu sekundy, poborze mocy w watach, sumarycznej i procentowej ilość wzbudzeń procesora przez dane moduły//funkcje oraz, co najciekawsze, wyświetla mini-porady dotyczące optymalizacji systemu.
Aby nasz laptop działał sprawniej i dłużej, musimy uważać na:
- 'C-state' był jak najwyższy. Idealna sytuacja to taka, w której procesor pracuje w stanie C3 bądź C4 w około 90-95%. (mowa o laptopie korzystającym z zasilania bateryjnego).
- Wzbudzenia ze stanu uśpienia mają być jak najrzadsze. Wg. Intela możliwym jest osiągnięcie 3 wzbudzeń na sekundę... W praktyce nigdy nie zszedłem poniżej 60.
- Procesy//moduły które powodują przerwania i wybudzają nasz CPU - jeśli np. nie korzystamy z sieci wifi możemy wyrzucić moduł przez 'rmmod'. Pełna lista procesów i modułów pozwoli nam podjąć dalsze działania.
Polecam także kierowanie się sugestiami zawartymi na dole PowerTOP.
Wymierne korzyści? Po dostosowaniu mojego sprzętu według zaleceń PowerTOP zyskałem 10 minut więcej na baterii podstawowej (przed modyfikacją - 2:21, po modyfikacji - 2:31) oraz 17 minut na baterii dodatkowej (przed modyfikacją - 6:10 po modyfikacji - 6:27) (stany podane z odczytu kpowersave w 10 minut po włączeniu komputera i ustabilizowaniu się pracy dysku). Tak więc mogę korzystać z mojego sprzętu już nie 8 godzin i 31 minut ale 8 godzin i 58 minut bez przerwy. Może w przypadku tak długich czasów 27 minut nie gra roli, lecz dla użytkowników laptopów marki ACER czy też tańszych modeli ASUS//HP takie zwiększenie czasu pracy to duża różnica. Dla ciekawskich - tak wygląda to u mnie (stan dla jednej baterii):
Cn Avg residency P-states (frequencies)
C0 (CPU aktywny) ( 2,6%)
C1 0,0ms ( 0,0%) 1100 MHz ( 0,0%)
C2 13,1ms ( 5,4%) 1000 MHz ( 0,0%)
C3 15,0ms (92,0%) 900 MHz ( 0,0%)
600 MHz (100,0%)
Wakeups-from-idle per second : 65,5 interval: 15,0s
Użycie zasilania (szacunek ACPI): 7,2W (2,3 godzin)
Najczęstsze powody wybudzenia:
30,9% ( 10,8) artsd : schedule_timeout (process_timeout)
9,5% ( 3,3) fnfxd : do_nanosleep (hrtimer_wakeup)
7,8% ( 2,7) psi : schedule_timeout (process_timeout)
Instalacja? Polecam pobrać i skompilować program ze strony producenta, bądź też leniuchy mogą użyć apt'a i pozyskać starą wersję PowerTOP:
# apt-get install powertop
Enjoy!
