7.9. Wykorzystanie czujników z płyt głównych - lm_sensors

lm_sensors jest pakietem umożliwiającym wykorzystanie czujników obecnych na współczesnych płytach głównych. Dotyczy to czujników temperatury, napięcia jak i ilości obrotów wiatraczka coolera. Dzięki tym informacjom można sprawdzać stan hardware'u w trakcie pracy i odpowiednio reagować na niektóre awarie (np. nieodpowiednie napięcie pochodzące z zasilacza, spalony wiatraczek - jeżeli procesor się jeszcze jakoś trzyma, itd.). Możliwe jest również takie skonfigurowanie pakietu, by pewne działania były podejmowanie automatycznie (nieinteraktywnie).

Poniższy opis zawiera informację dotyczącą głównie najnowszych dostępnych wersji lm_sensors, gdyż właściwie tylko one mają szansę obsłużyć czujniki obecne na nowych płytach głównych. W konfiguracji lm_sensors sporo się zmienia, więc opis ten może być nieadekwatny do starszych wersji.

Jeżeli mamy starszą płytę, możemy spróbować użyć lm_sensors z pakietów RPM. Należy użyć pakietów o nazwach i2c, lm-sensors-drivers i lm-sensors o odpowiadających sobie numerach wersji. W jądrach 2.4.x i2c jest standardowo dostępne i nie trzeba go instalować o ile numer wersji jest zgodny z używaną wersją lm-sensors. Zwykle jednak będziemy potrzebowali skompilować i2c i lm_sensors ze źródeł.

Ze stron http://www.lm-sensors.nu ściągamy źródła do i2c (np. plik i2c-2.7.0.tar.gz) oraz źródła do lm_sensors (np. lm_sensors-2.7.0.tar.gz).

Ponieważ skrypty instalacyjne korzystają z pliku /usr/src/linux/.config w przypadku jądra instalowanego z rpm'ów, należy ten plik utworzyć (oczywiście /usr/src/linux musi być prawidłowym linkiem na katalog z kernelem, np. /usr/src/linux-2.4.18-3):

cd /usr/src/linux
cp configs/kernel-*-i386.config .config
Musi być zainstalowany pakiet kernel-source-`uname -r`.i386.rpm

Instalacja polega na rozpakowaniu źródeł, ich przekompilowaniu i przekopiowaniu w odpowiednie miejsce:

tar -xzf i2c-2.7.0.tar.gz -C <katalog docelowy>
cd <katalog docelowy>i2c-2.7.0/
make all
make install
Ponieważ źródła i2c i lm_sensors nie używają autoconf'a, a w Red Hat v7.2 i 7.3 nieco zmieniła się organizacja plików, więc przed kompilacją należy zmienić plik Makefile w obu katalogach ze źródłami zamieniając linię:
MODDIR := /lib/modules/`grep UTS_RELEASE $(LINUX_HEADERS)/linux/version.h|cut -f 2 \
-d'"'`/misc
na linię:
MODDIR := /lib/modules/2.4.18-3/kernel/drivers/i2c
lub odpowiednią dla zainstalowanej wersji jądra. Można także zmienić prefix na /usr, aby programy instalowały się w katalogach /usr/bin itp. zamiast /usr/local/bin. Masę ostrzeżeń w trakcie kompilacji można zignorować. Jeżeli wszystko poszło dobrze, to w podanym katalogu z modułami pojawiły się nowe lub podmienione moduły z przedrostkiem i2c- (np. i2c-core, i2c-dev, i2c-isa, i in.).

Kompilujemy i instalujemy lm_sensors (razem ze sterownikami) ze źródeł (podobnie należy ustawić ścieżkę do modułów w pliku Makefile):

tar -xzf lm_sensors-2.7.0.tar.gz -C <katalog docelowy>
cd <katalog docelowy>lm_sensors-2.7.0/
make all
make install

Może się zdarzyć, że mimo braku komunikatów o błędach moduły nie zostaną poprawnie zainstalowane. Warto więc sprawdzić, czy w katalogu z modułami i2c (a więc np. /lib/modules/2.4.18-3/kernel/drivers/i2c) znajdują się uaktualnione wersje modułów. Jeśli nie, należy ręcznie przekopiować wszystkie pliki z rozszerzeniem .o z podkatalogów kernel, kernel/busses i kernek/chips katalogów ze źródłami i2c i lm-sensors.

Można teraz uaktualnić zależności modułów i utworzyć nowy obraz modułów jądra (w RH 7.3) przez wydanie jako root komend:

depmod -a
cd /boot
mv initrd-`uname -r`.img initrd-`uname -r`.img.bak
mkinitrd initrd-`uname -r`.img `uname -r`
Po tym należy przeładować system.

Po starcie systemu uruchamiamy jako root program sensors-detect, który powinien nam się zainstalować podczas instalacji lm_sensors. Na wszystkie pytanie odpowiadamy naciskając ENTER (domyślna odpowiedź). Jeżeli w trakcie działania skrypt wykryje jakieś czujniki w systemie (Success!) to dobrze, w przeciwnym razie to znaczy, że albo mamy nieobsługiwanego chipa, albo w ogóle nie mamy chipów-czujników na płycie (bo jest na przykład za stara), albo nie zainstalowaliśmy poprawnie modułów i2c. W tym przypadku skrypt krzyczy, że nie może załadować modułów i2c-*. Wtedy musimy zacząć czytać README do i2c, powinno pomóc. Przykładowo - pomocnym działaniem może być ręczne załadowanie modułu i2c-core:

insmod i2c-core
Po tej operacji należy jeszcze raz spróbować uruchomić sensors-detect. Skrypt sensors-detect na samym końcu wyświetli nam informacje wpisów, które powinniśmy dodać do /etc/modules.conf oraz które moduły powinniśmy załadować w skryptach startowych w /etc/rc.d.

Uwaga! Przed uruchomieniem programu, albo w przypadku, gdy czujniki nie są wykrywane sensors-detect, warto się dowiedzieć jakie chipy są zainstalowane na danej płycie - dobrym punktem startu jest serwis: http://mbm.livewiredev.com/mobolist.html

Wpis do /etc/modules.conf dodajemy, natomiast ładowanie odpowiednich modułów możemy zostawić skryptowi lm_sensors.init - należy go skopiować do /etc/rc.d/init.d/lm_sensors i dodać do usług uruchamianych podczas startu systemu. Po tych operacjach znów przeładowujemy system.

Teraz uruchamiamy program sensors. Powinien wyświetlić na ekranie jakieś wartości. Jeżeli nie wyświetli zupełnie nic a skrypt sensors-detect wykrył uprzednio jakieś chipy, to oznacza, że prawdopodobnie niepoprawnie zainstalował się pakiet lm_sensors. W tym przypadku należy go przekompilować (poprzedni punkt) i spróbować powtórnie. Jeśli wszystko poszło dobrze, program wypisze nam informacje o wykrytych czujnikach i pokazywanych przez nie wartościach. Zdarza się także, że program sensors nie działa (SIGSEGV), ale nie przeszkadza to w działaniu np. demona mondo. W takiej sytuacji trudno jest jednak zweryfikować, że czujniki w ogóle działają.

Wraz z pakietem dostarczana jest także biblioteka libsensors, która umożliwia sprawdzanie stanu czujników z poziomu jęz. C.

Następnie należy przejrzeć i ewentualnie poddać edycji plik konfiguracyjny /etc/sensors.conf (nie jest to konieczne jeżeli będziemy korzystali z mondo - zobacz dalej). Zawiera one dane dotyczące czujników, które chcemy obserwować i dozwolonych wartości dla obserwowanych parametrów. Dla każdego czujnika jest oddzielna sekcja (rodzaj czujnika jest wypisywany przez program sensors). Po znalezieniu odpowiedniej sekcji możemy pozmieniać parametry. Zwykle będziemy chcieli ignorować wartości napięć zasilających. Można to osiągnąć przez dodanie wpisów:

	ignore in0
	ignore in1
	ignore in2
	...
Podobnie możemy zignorować niepodłączone lub niedziałające prawidłowo czujniki obrotów i temperatury:
	ignore fan1
	ignore fan3
	ignore temp3
	...
Aby zmiany w konfiguracji zostały uwzględnione, należy wywołać program sensors z parametrem:
sensors -s

Jeżeli chcemy zmieniać dozwolone wartości parametrów, to także dobrze jest zrestartować całe lm_sensors przez wydanie komend:

service lm_sensors stop
service lm_sensors start
sensors -s
Plik zmieniamy dopóki program sensors uruchamiany bez parametrów nie wyświetli nam prawidłowych informacji o interesujących nas parametrach. Więcej informacji można znaleźć na stronach manuala dla sensors i sensors.conf.

Standardowa instalacja pakietu lm_sensors pozwala właściwie tylko na interaktywne odpytywanie o wartości parametrów oraz na zbieranie danych na dysku przez demona sensord, kompilacja którego wymaga jednak dociągnięcia dodatkowych bibliotek. Lepszym rozwiązaniem jest więc skorzystanie z demona mondo.

Mondo można ściągnąć z http://mondo-daemon.sourceforge.net. Dostępna jest wersja RPM, niestety na RH 7.3 nie chce ona działać, wobec tego lepiej jest ściągnąć i skompilować źródła:

tar xzf mondo-0.9.tar.gz
cd mondo-0.9
./configure --prefix=/usr --sysconfdir=/etc
make
make install
Kolejnym krokiem jest utworzenie pliku konfiguracyjnego dla mondo. W tym celu należy uruchomić program mondo-setup, który wygeneruje przykładowy plik konfiguracyjny. Standardowo program ten przez 2 godziny obserwuje zachowanie komputera. Jeżeli nie mamy tyle czasu, należy go zmusić do pracy przez krótszy czas (np. 10 minut) przez wydanie komendy:
mondo-setup -t 10 -s /etc/sensors.conf -o /etc/mondo.conf
Przez czas działania programu można pograć w jakąś zajmującą dużo zasobów gierkę, np. chromium. Po zakończeniu pomiarów należy przejrzeć plik /etc/mondo.conf. Parametr DELAY opisuje czas (w milisekundach), co jaki sprawdzane są czujniki. Następnie następują sekcje opisujące poszczególne obserwowane urządzenia i czujniki. Jeśli są tu jakieś czujniki, których nie rozpoznajemy, należy je po prostu usunąć. Przykładowa sekcja może mieć postać:
"w83627hf-isa-290:Processor FAN" {
	ABOVE 3096.00 "halt -fp"
	BELOW 3000.00 "halt -fp"
}
Opisuje ona górny i dolny limit obrotów wentylatora na procesorze. Przekroczenie którejkolwiek wartości spowoduje wykonanie zdefiniowanej komendy, w tym przypadku natychmiastowe wyłączenie komputera. Dla danego czujnika może być zdefiniowanych kilka linii ABOVE lub BELOW, wykonane będą wszystkie dla których przekroczone zostaną limity.

Należy zwrócić uwagę, że domyślnie ustalone przez program mondo-setup limity są bardzo restrykcyjne i powinny zostać zwiększone - w innym przypadku grozi ciągłe podnoszenie alarmu.

W przypadku innego typu akcji, np. wysyłania maili, niewskazane byłoby wysyłanie ich co zadany czas sprawdzania czujników (domyślnie 4 sekundy). W związku z tym można ustawić (globalnie lub dla konkretnej sekcji) dwie opcje:

GRACE <clicks>
THROTTLE <clicks>
Pierwsza z nich mówi, ile razy alarm dla czujnika powinien być ignorowany. Jeśli ustawimy ją na 5, a DELAY na standardowe 4000, to alarm zostanie podniesiony dopiero po 20 sekundach. Jeżeli w tym czasie obserwowany parametr powróci do akceptowanego stanu, alarm nie zostanie podniesiony. Druga opcja - THROTTLE określa, co ile sprawdzeń będzie wykonywana komenda przypisana do alarmu jeżeli parametr będzie cały czas przekraczał dopuszczalne wartości. Np. ustawienie THROTTLE na 450 spowoduje, że akcja będzie wykonywana co 30 minut. Poniższy fragment pliku opisuje konfigurację, gdy w przypadku przekroczenia temperatury 45 stopni wysyłany jest mail (co godzinę), a po przekroczeniu 55 stopni system jest zamykany:

DELAY 4000

"w83627hf-isa-290:temp1" {
	GRACE 2
	THROTTLE 900
	ABOVE 45.00 "echo 'Temperatura przekroczyla 45 stopni' \
		| mail -s 'Uwaga!' root@admin"
	ABOVE 55.00 "halt -fp"
}

Przekroczenie stanów alarmowych jest także zapisywane w logach systemu. Po przetestowaniu działania można dodać mondo do usług uruchamianych przy starcie systemu (odpowiedni plik /etc/rc.d/init.d/mondo jest tworzony przy instalacji programu). Uwaga: wpisanie zbyt restrykcyjnych wartości w pliku konfiguracyjnym może doprowadzić do sytuacji, gdy komputer będzie się wyłączał zaraz po starcie!

Ponieważ plik konfiguracyjny mondo nie respektuje limitów ustawionych w /etc/sensors.conf, więc jeżeli lm_sensors będą używane tylko dla potrzeb mondo, można darować sobie edycję pliku /etc/sensors.conf.