sobota, 23 kwietnia 2022

Konfiguracja Armbian bullseye na OrangePI Zero

  Poniżej kilka  mniej lub bardziej przydatnych informacji odnośnie konfiguracji Armbian 22 (bullseye) na OrangePI Zero. Instalacja sama w sobie nie jest specjalnie trudna, po prostu kopiujemy obraz na karte mikro sd i włączamy urządzenie. Schody zaczynają się nieco później.

Po pierwsze okazuje się, że sterownik karty sieciowej (XR819) nie potrafi poprawnie odczytać swojego adresu MAC z drzewa DT (ang. Device Tree) dla jądra w wersji powyżej 5.13.0. Armbian obecnie używa jądra w wersji 5.15.25.

Skutek jest taki, że za każdym restartem karta wlan dostaje nowy, losowo generowany adres MAC. Na szczęście pomaga cofniecie jądra do wersji "legacy", czyli 5.4.88:

# apt-get install linux-image-legacy-sunxi linux-dtb-legacy-sunxi
 
  Kolejny problem to szybko kończące się miejsce w /var/log. W tym wypadku stwierdziłem, że najszybciej będzie zrobić obejście w postaci zadania cron, które w razie czego wyczyści logi:
# cat > /etc/cron.d/vacuum << _EOF_
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
SHELL=/bin/bash

*/1 * * * * root if ( df --output='pcent' /var/log/ | grep '100\%' >/dev/null ) ; then journalctl --vacuum-files=1 >/dev/null ; fi
 
  Płytka lubi się też od czasu do czasu zawieszać. Wystarczy gorszy zasilacz (polecam nie zasilać przez port microUSB a bezpośrednio poprzez piny 4 i 6 na "Expansion Port" zasilaczem 5V/3A) lub wahnięcie napięcia i już mamy problem.
 
  Rozwiązania generalnie są dwa. Można na przykład zrobić na którymś pinie tzw. watchdoga, czyli dodać kolejne urządzenie które będzie sprawdzało czy wybrany pin na OrangePI pulsuje i w razie problemu odciąć na chwile zasilanie. Nie trzeba tutaj nic programować, ponieważ jądro Linuksa posiada odpowiedni sterownik, który wystarczy aktywować poprzez plik konfiguracyjny DT.
 
  Dla mnie to jednak trochę zbyt wiele zachodu. Zamiast tego wykorzystuje fakt, że OrangePI posiada na płytce dwie diody LED, czerwoną i zieloną. Stworzyłem plik z konfiguracją DT, który widać poniżej, powodujący, że zielona dioda będzie rytmicznie pulsować:
# cat > gpio-leds.dts << _EOF_
/dts-v1/;
/plugin/;

/ {
compatible = "allwinner,sun8i-h3";

fragment@0 {
target-path = "/";
__overlay__ {
leds {
compatible = "gpio-leds";

pwr_led {
label = "orangepi:green:pwr";
gpios = <&r_pio 0 10 0>; // PA10, GPIO_ACTIVE_HIGH
linux,default-trigger = "heartbeat";
};

status_led {
label = "orangepi:red:status";
gpios = <&pio 0 17 0>; // PA17, GPIO_ACTIVE_HIGH
default-state = "off";
};

};
};
};

};
_EOF_ # armbian-add-overlay
gpio-leds.dts
# reboot
Gdy system się zawiesi, dioda już nie będzie pulsować ;) Dodatkowo można w miarę potrzeby aktywować diodę czerwoną, dając do zrozumienia że układ napotkał jakąś sytuację awaryjną i konieczna jest interwencja człowieka:
# echo 1 > /sys/class/leds/orangepi\:red\:status/brightness
Oczywiście to nie jest rozwiązanie zautomatyzowane jak w przypadku watchdoga, jednak dzięki niemu w momencie gdy wystąpi jakiś problem, można podejść i jednym rzutem oka określić z czym mniej więcej mamy do czynienia.