Raspberry Pi – sterowanie LED i odczyt temperatury CPU i dysku

Parę dni temu zamówiłem opisywanego wcześniej Banana Pi, którego mam nadzieję użyć jako następcę Raspberry Pi w NAS. Nie wiem co stanie się z obecnym rpi, więc dla pamięci zapiszę parę przydatnych rzeczy, których używam.

Oczywiście do Raspberry Pi można podłączyć LEDy, termometry i ogólnie cuda na kiju (czy tam raczej na GPIO), ale warto też wiedzieć, że jest wbudowany czujnik, z którego można czytać temperaturę CPU. Podobnie jak LED, którym można sterować. Wszystko z wiersza poleceń Linuksa, bezpośrednio z powłoki, bez dodatkowych skryptów czy też bibliotek.

Temperatura CPU

Nie pamiętam już źródła, ale temperaturę CPU w Raspberry Pi odczytać można z /sys/class/thermal/thermal_zone0/temp Jednostka w której jest podawana to tysięczne stopnia Celsjusza, więc pewnie warto będzie zamienić na coś bardziej ludzkiego, np. na stopnie Celsjusza z dokładnością do jednej dziesiątej stopnia (zaokrąglanie):

awk '{printf("%.1f\n",$1/1e3)}' /sys/class/thermal/thermal_zone0/temp

Temperatura dysku

Skoro już sprawdzamy temperaturę, to warto też czytać ją z dysku, o ile taki mamy podłączony do Raspberry Pi. Główna zaleta jest taka, że mniej podatna na chwilowe zmiany i bardziej związana z temperaturą otoczenia. Praktycznie każdy dysk ma czujnik temperatury i można czytać z niego dane przy pomocy S.M.A.R.T. Pobranie samej wartości w stopniach Celsjusza z /dev/sda:

/usr/sbin/smartctl -A /dev/sda | grep -i temp | awk '{print $10}'

Ponieważ zdarzyło mi się raz, że nazwa dysku podczas pracy zmieniała się z /dev/sda na /dev/sdb (nie mam pojęcia czemu) i miałem dziurę w logach, to w skrypcie do logowania obu tych danych stosuję na to obejście (przy okazji pozwoli na czytanie z większej ilości dysków). Cały skrypt (który uruchamiam z crona co godzinę):

#!/bin/bashlogger -t temperature "RPi `awk '{printf("%.1f\n",$1/1e3)}' /sys/class/thermal/thermal_zone0/temp`"for i in `ls /dev/sd?`; dologger -t temperature "Disk `/usr/sbin/smartctl -A $i | grep -i temp | awk '{print $10}'`"done

Sterowanie LED

Większość opisów sterowania LED przy pomocy Raspberry Pi dotyczy tych podłączanych przez GPIO, ale samo rpirównież umożliwia użytkownikowi sterowanie jednym z wbudowanych LEDów. Od razu ostudzę zapał – jest to jedna zielona dioda z kilku LEDów w różnych kolorach świecących się i migających podczas pracy, więc użyteczność OOTB jest mierna. Można się oczywiście bawić w zasłonięcie pozostałych LEDów czy wyprowadzenie na obudowę „światłowodem” tej jednej, albo wyprowadzenie jej w określone miejsce na obudowie, co niewątpliwie zwiększy czytelność, ale to już trochę inna bajka. Polecenia przepisane z wpisu Raspberry Pi – Control the on board LED lights (polecam wpis; blogi znikają, wolę mieć backup).

Wyłączenie triggera (domyślnie pokazuje aktywność mmc0):

echo none > /sys/class/leds/led0/trigger

Zapalenie LED:

echo 1 >/sys/class/leds/led0/brightness

Zgaszenie LED:

echo 0 > /sys/class/leds/led0/brightness

Nie wykorzystuję tego w praktyce z uwagi na wspomnianą małą widoczność. Można w prosty sposób oprogramować i sygnalizować… cokolwiek, w dodatku na minimum 3 stanach (zgaszony/migający/zapalony). Przy odrobinie chęci można dodać obsługę częstotliwości migania. Jeśli chodzi o potencjalne zastosowania, to pierwsze co mi przyszło do głowy, to sygnalizacja temperatury z poprzednich akapitów. Wersja z kilkoma częstotliwościami świetnie nadaje się do informowania o aktualnym zużyciu pasma.

Software RAID i wypadnięcie dysku – HOWTO

Coś złego zaczęło dziać się z jednym z dysków w jednym z desktopów. Wygląda, jakby startował, a następnie robił restart. Głośne cyknięcie, rozkręcanie się dysku, a w tym czasie system stoi. Albo umiera zasilacz, albo dysk. Albo coś gdzieś nie styka.

Ponieważ w moje ręce wpadł inny dysk, postanowiłem podłączyć go do sprawnego komputera, zdiagnozować, wyzerować i zamienić z dyskiem w padającym desktopie.

Wszystko byłoby fajnie, ale w komputerze, w którym chciałem dokonać diagnostyki jest już software RAID. Po podłączeniu dysku do diagnostyki (IDE) system wstał, ale… tylko z jednym dyskiem (zdegradowany RAID). Podłączanego dysku też nie widział. Efekt był taki, że po odpięciu dysku do diagnostyki i uruchomieniu systemu, przywitał mnie rozjechany RAID (md0):

cat /proc/mdstat 
Personalities : [raid1]
md127 : active (auto-read-only) raid1 sda1[0]
      57584256 blocks super 1.2 [2/1] [U_]
     
md0 : active raid1 sdb2[1]
      57584256 blocks super 1.2 [2/1] [_U]

Natomiast w dmesg widoczny był wpis:

md: kicking non-fresh sda1 from array!

Wszystko jak najbardziej OK, tylko jak teraz poskładać to do kupy? TBH liczyłem, że system sam wykryje, że dysk będący częścią RAID wrócił i że ma stare dane. Czyli zrobi synchronizację. No niestety, nic nie dzieje się automagicznie. Chwila z wyszukiwarką i znalazłem rozwiązanie:

mdadm --stop /dev/md127
mdadm --add /dev/md0 /dev/sda1

Po takich komendach RAID rozpoczął synchronizację, której postęp można sprawdzić przez cat /proc/mdstat.

Tyle w kwestii podłączania dziwnych dysków do desktopa z software RAID. Przyczyną dziwnego zachowania okazało się… moje czytanie instrukcji. Nie zapakowałem dysku jak przyszedł (zlimitowany do 32GB), tylko zmieniłem zworką tryb na auto select. Znaczy tak mi się wydawało, gdyż wszystko wskazuje na to, że opis należy czytać odwrotnie. Jakichkolwiek oznaczeń gdzie dół a gdzie góra oczywiście brak.

One apt to rule them all

Zdarza się, że mamy więcej niż jednego czy dwa hosty do zarządzania. Zdarza się, że wykonując aktualizację na desktopie zapomnimy o innych hostach. Albo, po prostu chcemy sobie uprościć aktualizacje i nie musieć się ręcznie logować w kilka(naście, -dziesiąt) miejsc.

Jest przyjemne, konsolowe narzędzie, które ułatwi takie zadanie. Chodzi o apt-dater, czyli narzędzie do automatycznej aktualizacji wielu hostów, działające w ncurses. Działa z pochodnymi Debiana, ale również z systemami wykorzystującymi managery pakietów rug czy yum. Zasada działania jest prosta i nieco podobna do rozwiązań typu clusterssh. Na systemie docelowym dodajemy (dla pochodnych Debiana) użytkownika, który ma dodane w /etc/sudoers:

user ALL=NOPASSWD: /usr/bin/apt-get, /usr/bin/aptitude

Dodatkowo należy umożliwić temu użytkownikowi logowanie po kluczach (pamiętamy o używaniu kluczy z hasłem!) z maszyny, z której będziemy zarządzać. No i oczywiście skonfigurować hosty, którymi apt-dater będzie zarządzać. Domyślna konfiguracja znajduje się w plikach w katalogu:

$XDG_CONFIG_HOME/apt-dater/

Definiujemy tam grupy hostów, użytkowników na poszczególnych systemach, hosty (IP lub FQDN) oraz port. Przykładowa zawartość pliku hosts.conf:

[GRUPA1]
Hosts=localhost;pi@mojeraspberry:222

[GRUPA2]
Hosts=user1@serwer.www;user2@serwer.db:222;user3@serwer.poczty:222

[GRUPA3]
Hosts=user1@kolejny.serwer,user1@kolejny.serwer2

Jednym przyciśnięciem klawisza można wywołać aktualizację listy pakietów lub instalację aktualizacji w całej grupie hostów lub na pojedynczym hoście. Oczywiście jest możliwość podłączenia się do wybranego hosta i dokładnego sprawdzenia sytuacji.

Korzystanie nie jest oczywiste – trzeba się chwilę pobawić i przywyknąć. Nie podoba mi się też wykorzystanie aptitude, którego nie trawię i który AFAIK korzysta z innego algorytmu ustalania zależności, niż apt-get[1]. Wolałbym wajig albo gołego apt-get. Domyślnie wykorzystywany jest apt-get, ale można zmienić go na aptitude w pliku /etc/apt-dater-host.conf. Niemniej rozwiązanie jest ciekawe i mało znane, więc informuję i polecam wypróbowanie. A nuż komuś się spodoba. Ja używam pół na pół – czasem aktualizacje przy pomocy apt-dater, czasem po prostu aktualizuję tradycyjnym wajig daily-upgrade.

PS Dzięki K. za informację o tym programie.

[1] Z tego powodu kiedyś był zalecany przy aktualizacji wersji Debiana. Od jakiegoś czasu zalecany jest apt-get.

UPDATE: Poprawione błędy w nazwach plików, dodana informacja o wyborze programu używanego do aktualizacji.