obudowa Argon One dla Raspberry Pi

Jak używać obudowy Argon One dla Raspberry Pi na systemach z rodziny Enterprise Linux?

Obudowa Argon One należy do jednej z najpopularniejszych obudów na Raspberry Pi. Zapewnia ochronę, znakomicie rozprasza ciepło, umożliwia łatwiejsze zarządzanie urządzeniem oraz posiada aktywny system chłodzenia. Jednak wykorzystanie pełnych możliwości tej obudowy wymaga dobrej znajomości systemu, umiejętności tuningu i trochę wytrwałości. Pokażemy, jak to zrobić.

Obudowa Argon One należy do jednej z najpopularniejszych obudów na Raspberry Pi. Zapewnia ochronę, znakomicie rozprasza ciepło, umożliwia łatwiejsze zarządzanie urządzeniem (np. poprzez dostępność pełnowymiarowych złączy HDMI) oraz posiada aktywny system chłodzenia. Jednak wykorzystanie pełnych możliwości tej obudowy wymaga dobrej znajomości systemu, umiejętności tuningu i trochę wytrwałości. Dziś pokażemy, jak to zrobić.

Na potrzeby tego artykułu skorzystaliśmy z obrazu systemu EuroLinux 9 dla Raspberry Pi w wersji minimalnej. Instalacja oraz opisane kroki powinny zadziałać także na innych systemach z rodziny Enterprise Linux.

Instalacja oprogramowania userland dla Raspberry Pi

Repozytorium userland dla Raspberry Pi zawiera dodatkowe biblioteki oraz narzędzia służące do interakcji z „malinką”. Na przykład, komenda vcgencmd wraz z podkomendną measure_temp pozwala na odczyt temperatury z poziomu konsoli. Raspberry Pi userland jest wymagany do poprawnego działania oprogramowania obudowy.

EuroLinux dostarcza userland dla Raspberry Pi w postaci kompilowanej paczki RPM. Obrazy systemu stworzone po 10.01.2023 mają ją domyślnie zainstalowaną. Starsze wersje wymagają zainstalowania tego pakietu przy pomocy komendy:

sudo yum install -y raspberrypi-userland

W przypadku braku pakietu na innych systemach operacyjnych z rodziny Enterprise Linux w wersji 9 zalecamy dodanie repozytorium EuroLinux dla Raspberry Pi:

[rpi-eurolinux-9]
name=Raspberry PI for EuroLinux 9
baseurl=https://fbi.cdn.euro-linux.com/dist/eurolinux/server/9/aarch64/RPI/all/
enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-eurolinux9
includepkgs='raspberrypi-user*'

Powyższa konfiguracja ma wyłączone sprawdzanie podpisu GPG (ewentualnie można ręcznie zaimportować klucz) oraz z posiada opcję includepkgs, która wskazuje na te pakiety z repozytorium, które mają być uwzględniane. Jest to o tyle ważne, że EuroLinux może posiadać np. nowszą wersję jądra względem innych projektów. Powyższy plik repozytorium należy zapisać w katalogu /etc/yum.repos.d np. jako el-rpi.repo.

Po instalacji zalecamy sprawdzić, czy komenda vcgencmd działa (np. przy pomocy wcześniej opisanego próbkowania temperatury – podkomendna measure_temp):

[root@raspberry ~]# vcgencmd measure_temp
temp=36.0'C

Warto wspomnieć, że nieuprzywilejowany (inny niż root) użytkownik, by móc korzystać z vcgencmd, musi być członkiem grupy systemowej video. Dodanie użytkownika do grupy możne się odbyć z wykorzystaniem komendy usermod:

sudo usermod -a -G video USER

gdzie USER należy zamienić na nazwę docelowego użytkownika.

Jeżeli chcemy wykorzystać uprawnienia grupy bez przeładowywania sesji użytkownika, można z kolei użyć polecenia newgrp:

newgrp video

Instalacja argononed

Instalacja oprogramowania obudowy odbywa się poprzez skrypt dostępny pod adresem: https://download.argon40.com/argon1.sh. Skrypt ten jest jednak dostosowany do dystrybucji z rodziny Debiana. Dlatego należy go wyedytować przed uruchomieniem:

curl https://download.argon40.com/argon1.sh > argon1.sh
cp argon1.sh{,.back}
vim argon1.sh

Edycje tę reprezentuje następująca różnica (ang. diff), którą można wykorzystać z programem patch:

--- argon1.sh.back	2021-09-04 14:31:36.309279427 +0200
+++ argon1.sh	2021-09-04 14:32:01.273010329 +0200
@@ -18,30 +18,6 @@
 	fi
 }

-CHECKPLATFORM="Others"
-# Check if Raspbian, otherwise Ubuntu
-grep -q -F 'Raspbian' /etc/os-release &> /dev/null
-if [ $? -eq 0 ]
-then
-	CHECKPLATFORM="Raspbian"
-	pkglist=(raspi-gpio python3-rpi.gpio python3-smbus i2c-tools)
-else
-	# Ubuntu has serial and i2c enabled
-	pkglist=(python3-rpi.gpio python3-smbus i2c-tools)
-fi
-
-for curpkg in ${pkglist[@]}; do
-	sudo apt-get install -y $curpkg
-	RESULT=$(argon_check_pkg "$curpkg")
-	if [ "NG" == "$RESULT" ]
-	then
-		echo "********************************************************************"
-		echo "Please also connect device to the internet and restart installation."
-		echo "********************************************************************"
-		exit
-	fi
-done
-
 # Ubuntu Mate for RPi has raspi-config too
 command -v raspi-config &> /dev/null
 if [ $? -eq 0 ]

Po wprowadzeniu proponowanych zmian należy uruchomić program z uprawnieniami superużytkownika:

sudo bash ./argon1.sh

Zainstaluje on między innymi daemon argononed w ścieżce /usr/bin/argononed.py, oraz usługę systemd argononed.service. Co ważne, po instalacji daemon nie uruchomi się poprawnie i będzie wymagał dodatkowych kroków opisanych poniżej.

Instalacja zależności obsługujących magistralę i interfejs danych

Obudowa wykorzystuje między innymi magistralę danych I²C (z reguły zapisywane jako i2c lub I2C) oraz interfejs SPI (ang. Serial Peripheral Interface). Służą one do obsługi zasilania aktywnego chłodzenia, a także do sterowania za pomocą podczerwieni (obudowa posiada odbiornik podczerwieni, jednak jego konfiguracja wychodzi poza zakres tego artykułu).

By nie wprowadzać dodatkowych modyfikacji do skryptów, proponujemy użycie globalnego środowiska Python (nazywanego także środowiskiem systemowym). Instalacja modułów Python w globalnym środowisku może doprowadzić do niekompatybilności wersji modułów instalowanych względem domyślnych modułów systemowych. Należy więc zachować ostrożność.

Teraz zainstalujemy niezbędne narzędzia Pythona w wersji 3 oraz GCC. Kompilator GCC jest wymagany do skompilowania modułów Python dla Raspberry Pi w dalszych krokach:

sudo yum install -y python3-devel python3-pip gcc

Instalacja pakietów do obsługi magistrali:

sudo yum install -y python3-i2c-tools i2c-tools

Instalacja modułu Pythona Rpi.GPIO:

sudo pip3 install RPi.GPIO

Włączanie szyny danych

Następnie należy zrobić tak, by I2C i SPI były włączone oraz udostępnione przez jądro Linux. W pliku /boot/config.txt dodajemy lub odkomentowujemy następujące linijki:

dtparam=spi=on
dtparam=i2c_arm=on

Parametry te można dodać także poniższym skryptem:

echo -e 'dtparam=spi=on\ndtparam=i2c_arm=on' | sudo tee -a /boot/config.txt

Po tych zmianach należy wykonać restart systemu, ponieważ jądro Linux musi wczytać swoją nową konfigurację:

reboot

Po restarcie możemy sprawdzić dostępność i działanie szyny danych i2c przy pomocy programu i2cdetect:

[root@raspberry ~]# i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:                         -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- 1a -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

Dostępność interfejsu SPI możemy sprawdzić przy próbie listowania plików urządzenia szyny w katalogu /dev/ (są to pliki znakowe):

[root@raspberry ~]# ll /dev/*spi*
crw-------. 1 root root 153, 0 Sep 23 00:00 /dev/spidev0.0
crw-------. 1 root root 153, 1 Sep 23 00:00 /dev/spidev0.1

Konfiguracja obudowy z argonone-config

Przed konfiguracją zalecamy sprawdzić, czy daemon argononed został poprawnie uruchomiony przy pomocy systemctl status argononed.service:

[root@raspberry ~]# systemctl status argononed.service
● argononed.service - Argon One Fan and Button Service
     Loaded: loaded (/usr/lib/systemd/system/argononed.service; enabled; vendor preset: disabled)
     Active: active (running) (...)

Przykładowa konfiguracja uruchamiająca wentylator na różnych poziomach prędkości przy temperaturach 60 i 65 stopni Celsjusza:

[root@raspberry ~]# argonone-config
--------------------------------------
Argon One Fan Speed Configuration Tool
--------------------------------------
WARNING: This will remove existing configuration.
Press Y to continue:y
Thank you.

Select fan mode:
  1. Always on
  2. Adjust to temperatures (55C, 60C, and 65C)
  3. Customize behavior
  4. Cancel
NOTE: You can also edit /etc/argononed.conf directly
Enter Number (1-4):2

Please provide fan speeds for the following temperatures:
55C (0-100 only):0
60C (0-100 only):50
65C (0-100 only):100

Oprogramowanie pozwala także na użycie własnych wartości. Jest to szczególnie przydatne w czasie testowania obudowy, ponieważ tak dobrze rozprasza ona ciepło, że temperatura 50 stopni na standardowym taktowaniu może być trudna do osiągnięcia. Do testowania możemy użyć np. par (temperatura;użycie wentylatora) 43;10, 45;20, 50;40 55;80 i 60;100.

[root@raspberry ~]# argonone-config
--------------------------------------
Argon One Fan Speed Configuration Tool
--------------------------------------
WARNING: This will remove existing configuration.
Press Y to continue:Y
Thank you.

Select fan mode:
  1. Always on
  2. Adjust to temperatures (55C, 60C, and 65C)
  3. Customize behavior
  4. Cancel
NOTE: You can also edit /etc/argononed.conf directly
Enter Number (1-4):3

Please provide fan speeds and temperature pairs

Provide minimum temperature (in Celsius) then [ENTER]:43
Provide fan speed for 43C (0-100) then [ENTER]:10
* Fan speed will be set to 10 once temperature reaches 43 C

Provide minimum temperature (in Celsius) then [ENTER]:45
Provide fan speed for 45C (0-100) then [ENTER]:20
* Fan speed will be set to 20 once temperature reaches 45 C

Provide minimum temperature (in Celsius) then [ENTER]:50
Provide fan speed for 50C (0-100) then [ENTER]:40
* Fan speed will be set to 40 once temperature reaches 50 C

Provide minimum temperature (in Celsius) then [ENTER]:55
Provide fan speed for 55C (0-100) then [ENTER]:80
* Fan speed will be set to 80 once temperature reaches 55 C

Provide minimum temperature (in Celsius) then [ENTER]:60
Provide fan speed for 60C (0-100) then [ENTER]:100
* Fan speed will be set to 100 once temperature reaches 60 C

Provide minimum temperature (in Celsius) then [ENTER]:

Thank you!  We saved 5 pairs.
Changes should take effect now.

Testy obciążeniowe (stress test)

W celu sprawdzenia aktywnego chłodzenia obudowy zalecamy wykonać testy obciążeniowe. Na potrzeby tego artykułu służą one głównie do sprawdzenia, czy oprogramowanie obudowy uruchamia aktywne chłodzenie przy zadanych temperaturach i ogranicza/wyłącza je przy niższych.

Do testów obciążeniowych można użyć standardowych narzędzi (np. stress-ng) lub projektu stressberry.

Testy obciążeniowe CPU z użyciem stress-ng

Na samym początku należy zainstalować pakiet stress-ng, który jest dostępny w standardowych repozytoriach systemu EuroLinux 9.

sudo yum install -y stress-ng

Następnie w pierwszej sesji terminala uruchamiamy obserwatora, który co 5 sekund będzie informował nas o aktualnej temperaturze:

watch -n 5 'vcgencmd measure_temp'

W drugim terminalu uruchamiamy test obciążeniowy trwający 2 minuty:

stress-ng --timeout 120 --metrics -c $(nproc)

Przykład:

[root@raspberry ~]# stress-ng --timeout 120 --metrics -c $(nproc)
stress-ng: info:  [2506] setting to a 120 second (2 mins, 0.00 secs) run per stressor
stress-ng: info:  [2506] dispatching hogs: 4 cpu
stress-ng: info:  [2506] stressor       bogo ops real time  usr time  sys time   bogo ops/s     bogo ops/s CPU used per
stress-ng: info:  [2506]                           (secs)    (secs)    (secs)   (real time) (usr+sys time) instance (%)
stress-ng: info:  [2506] cpu               18352    120.11    477.81      0.11       152.79          38.40        99.47
stress-ng: info:  [2506] successful run completed in 120.28s (2 mins, 0.28 secs)

Należy obserwować, czy po przekroczeniu zadanych progów, następuje aktywacja systemu chłodzenia zgodnie z oczekiwaniami.

stressberry

Popularnym rozwiązaniem pozwalającym na przeprowadzenie testów obciążeniowych skrojonych pod Raspberry Pi jest stressberry. Zaletą tego oprogramowania jest automatyczne zbieranie danych oraz możliwość tworzenia ładnych, czytelnych wykresów.

Instalacja stressbery jest prosta, jednak ważnym elementem jest wykorzystanie opcji --user w celu utrzymania systemowego środowiska Python bez zmian:

pip3 install --user stressberry

Obecna wersja stressberry nie używa komendy stress-ng a stress. Odpowiednia łatka została zaproponowana w repozytorium projektu przez jednego z naszych inżynierów. Niemniej, w momencie pisania artykułu, przed uruchomieniem programu stressberry należy stworzyć miękkie dowiązanie stress do stress-ng:

sudo ln -s /usr/bin/stress-ng /usr/bin/stress

Ponownie możemy użyć programu watch do obserwacji temperatury:

watch -n 5 'vcgencmd measure_temp'

W drugim terminalu należy uruchomić testy:

# wersja wolna czeka na stabilizacje temperatur
stressberry-run slow-run.out 
# wersja nieczekająca na stabilizację temperatur -> szybsza
stressberry-run --idle 1 --cooldown 5 fast-run.out

Przykładowe uruchomienie dla wersji nieczekającej na stabilizacje temperatury przed i po teście:

[Alex@raspberry ~]$ stressberry-run --idle 1 --cooldown 5 fast-run.out
Awaiting stable baseline temperature...
Current temperature: 39.9°C - Previous temperature: 39.9°C
Preparing to stress [4] CPU Cores for [300] seconds
Idling for 1 seconds...
Current temperature: 39.4°C - Frequency: 1500MHz
/usr/bin/stress-ng
stress-ng: info:  [6176] setting to a 300 second (5 mins, 0.00 secs) run per stressor
stress-ng: info:  [6176] dispatching hogs: 4 cpu
Current temperature: 41.8°C - Frequency: 1500MHz
(...)
Current temperature: 44.8°C - Frequency: 1500MHz
stress-ng: info:  [6176] successful run completed in 300.16s (5 mins, 0.16 secs)
Idling for 1 seconds...

Bonus micro troubleshooting dla argononed

W przypadku problemów z daemonem argononed zalecamy na początku sprawdzić jego status przy pomocy systemctl status argononed.service.

[root@raspberry ~]# systemctl status argononed.service
× argononed.service - Argon One Fan and Button Service
     Loaded: loaded (/usr/lib/systemd/system/argononed.service; enabled; vendor preset: disabled)
     Active: failed (Result: exit-code) since Wed 2023-01-11 08:52:21 UTC; 59s ago
   Duration: 118ms
    Process: 1242 ExecStart=/usr/bin/python3 /usr/bin/argononed.py (code=exited, status=1/FAILURE)
   Main PID: 1242 (code=exited, status=1/FAILURE)
        CPU: 117ms

Proces troubleshooting (wyszukiwania błędów) może odbyć się między innymi poprzez próbę ręcznego startu programu:

/usr/bin/python3 /usr/bin/argononed.py

Przykładowy błąd:

[root@raspberry ~]# /usr/bin/python3 /usr/bin/argononed.py
Traceback (most recent call last):
  File "/usr/bin/argononed.py", line 2, in <module>
    import smbus
ModuleNotFoundError: No module named 'smbus'

Wynika on z niedostępności modułu smbus. By go zainstalować, proponujemy wykorzystać pakiet RPM dostępny w standardowych repozytoriach:

sudo yum install -y python3-i2c-tools # moduły smbus

Innym błędem może być:

[root@raspberry ~]# /usr/bin/python3 /usr/bin/argononed.py
Traceback (most recent call last):
  File "/usr/bin/argononed.py", line 9, in <module>
    bus = smbus.SMBus(1)
FileNotFoundError: [Errno 2] No such file or directory

Ten z kolei wynika z braku dostępu do szyny i2c z powodu braku odpowiedniego wpisu w /boot/config.txt (lub z powodu niezrestartowania systemu). Inną przyczyną może być też brak narzędzi systemowych będących w pakiecie i2c-tools.

Podsumowanie

Instalacja oprogramowania dla Argon One na systemie EuroLinux 9 lub innych systemach z rodziny Enterprise Linux wymaga pewnej wiedzy, umiejętności dostrajania systemu oraz debugowania. Oczywiście to jest to, co pasjonaci i hobbyści lubią najbardziej ;-)

W najbliższym czasie na naszym blogu pojawi się kolejny artykuł z tematyki „malinki”. Tym razem zajmiemy się tematem zwiększenia taktowań (czyli podkręcania) Raspberry Pi wraz z testami. Naszą miniserię dotyczącą tego komputera zakończymy artykułem, w którym porównamy go do innych komputerów z architekturą ARM64.

Autorzy

Artykuły na blogu są pisane przez osoby z zespołu EuroLinux. 80% treści zawdzięczamy naszym developerom, pozostałą część przygotowuje dział sprzedaży lub marketingu. Dokładamy starań, żeby treści były jak najlepsze merytorycznie i językowo, ale nie jesteśmy nieomylni. Jeśli zauważysz coś wartego poprawienia lub wyjaśnienia, będziemy wdzięczni za wiadomość.