Heute: Pengutronix
labgrid: Fernsteuerung & Automatisierung von Embedded-Systemen
Embedded-Linux-Geräte bilden das Herzstück vieler Produkte. Diese Geräte sind in der Regel spezialisierte Computer, die in Alltagsgegenstände integriert sind, um ihnen ihre Funktionalität zu verleihen. Von Haushaltsgeräten über medizinische Produkte bis hin zu industriellen Steuerungssystemen – Embedded Linux ermöglicht eine breite Palette von Anwendungen.
Pengutronix hilft seinen Kunden maßgeschneiderte Betriebssysteme für ihre Embedded-Systeme zu entwickeln und zusammenzustellen.
Um diese vielen Geräte während der Entwicklung automatisiert ansteuern zu können, wurde labgrid [1] entwickelt – eine Bibliothek zur Fernsteuerung von Embedded-Systemen, die über verschiedene Standorte (Büros, Home Offices, ..) verteilt sein können. Dabei ist die Idee, eine Abstraktionsebene der Hardwaresteuerung zu schaffen, die automatische Tests und Software-Installation erlaubt. Aber auch bei der täglichen Entwicklung hilft labgrid: einfacher Hardwarezugriff oder schnelle Automatisierung wiederkehrender Abläufe per intuitiver Python-API.
Remote arbeiten mit labgrid
Bei Pengutronix benötigen dezentrale Entwicklungsteams Zugriff auf die wenigen Prototypen-Exemplare der jeweiligen Embedded-Hardware. Im einfachsten Fall reicht vielleicht eine serielle Konsole – aber was wenn die Hardware mal eben aus- und wieder eingeschaltet werden muss? Neues Image auf die SD-Karte? Anderes Bootmedium per Jumper? Display im Home Office ansehen?
Nichts leichter als das: Einfach einen "Place" per labgrid anlegen, Schnittstellen der Hardware angeben (schaltbare Stromversorgung, Konsole, digitale I/Os [2], SD-Karten-Multiplexer [3], Webcam uvm.) und los geht's. Das hilft auch gegen die Hardware-Flut auf dem Schreibtisch: die Geräte können z.B. in einem Schrank oder Rack aufgebaut und deren Schnittstellen an einem Linux-Rechner angeschlossen werden. Eine integrierte Lösung dafür mit allerlei Schnittstellen bietet der "LXA Test Automation Controller" [4].
Automatisierung mit labgrid
Doch labgrid lässt sich nicht nur interaktiv nutzen. Wiederkehrende Aufgaben können leicht automatisiert werden.
Zu Entwicklungszwecken wird oft von SD-Karte gebootet. Embedded-Systeme bekommen ihr Betriebssystem als Image. Das erlaubt reproduzierbare Ergebnisse, deren definiertes Zusammenspiel aus einer großen Anzahl von Softwarekomponenten mit überschaubarem Aufwand gut getestet werden können.
Wiederkehrende Arbeitsschritte könnten also etwa so aussehen:
- Stromversorgung abschalten
- SD-Karten-Image flashen
- Stromversorgung wieder einschalten
- im Bootloader gucken, ob vom richtigen Medium gebootet wurde
- bis in den Linux-Userspace booten, mit Benutzer/Passwort einloggen
- warten bis ein bestimmter systemd-Service gestartet ist
Mit kleinem Image, schneller SD-Karte und flinken Fingern sind diese Schritte vielleicht in einer Minute erledigt. Während der Entwicklung kommt es aber vor, dass diese Schritte viele Male am Tag wiederholt werden müssen. Und dann sind da noch diese Pull Requests aus dem Team, die auch gebaut und deren Images getestet werden müssen. Kurzum, es lohnt sich diese Schritte mit labgrid zu automatisieren.
Regressionen früh erkennen
Diese Automatisierung kann dann auch gleich Grundlage für automatische CI-Tests sein. Denn wenn Bootloader und Shell bereits automatisch erreicht werden können, kann auch das automatisch gebaute Image verwendet und damit noch einige Integrationstests abgefrühstückt werden. Vorstellbar ist das z.B. für die erwähnten Pull Requests des Teams. So werden Regressionen erkannt bevor sie gemergt werden.
Apropos Regressionen: Mit labgrid ist es auch möglich herauszufinden, mit welchem Commit eine Regression eingeführt wurde. Z.B. könnte der Linux-Kernel auf einem Embedded-Gerät nach einem Kernel-Update nicht mehr bis zum Init-Prozess booten. Wenn nicht eindeutig ist, welche Änderung das Problem eingeführt hat, kann der problematische Commit mit 'git bisect run <cmd>' identifiziert werden. Das angegebene Kommando muss in der Lage sein den Kernel aus dem git zu kompilieren und dieses dann mit labgrid automatisiert auf der Hardware auszuführen (ggf. per NFS- oder TFTP-Boot statt SD-Karten-Image). Anhand des Exit-Codes entscheidet git bisect nach einigen Durchläufen, welcher Commit für die Regression verantwortlich ist.
Dieser kleine Einblick zeigt wie labgrid uns den Alltag erleichtert – egal, ob interaktiv, halb- oder vollautomatisiert.
Mehr Material zum Thema findet sich in unserem Blog:
- https://pengutronix.de/de/blog/2021-02-21-showcase-remote-working.html
- https://pengutronix.de/de/blog/2021-02-21-showcase-continuous-testing.html
- https://pengutronix.de/de/blog/2021-09-16-labgrid-tutorials.html