Cross-Development mit Ubuntu Core
Anbieter zum Thema
Die Softwareentwicklung für eingebettete Systeme hat ihre ureigenen Besonderheiten. Unter Ubuntu Linux ergänzt Snapcraft die Toolchain um Continuous-Techniken und automatisierte Builds.

Der Software-Entwicklungsprozess für Embedded Systems ist in vielerlei Hinsicht grundverschieden zu dem für andere Anwendungen. Embedded Systems laufen auf ressourcenbeschränkter Hardware, im Gegensatz zu universellen Client- oder Server-Anwendungen, die auf leistungsfähigerer Hardware aufsetzen.
Aus diesem Grund wird Software für eingebettete Systeme nicht direkt auf der elektronischen Platine entwickelt, auf der sie laufen soll – dem so genannten Target. Sie wird vielmehr auf einem Computer – dem Host – entwickelt, der eine höhere Rechenkapazität aufweist, als das Target-Board.
Der herkömmliche Cross-Development Workflow
Die meisten Host-Computer basieren auf x86-Prozessoren, während die Zielplatinen häufig mit einem ARM-Chip betrieben werden. Daher wird Software für eingebettete Systeme traditionell durchgängig plattformübergreifend entwickelt, vom Host-Computer bis zum Target-Board. Um ein eingebettetes System für ein Target zu erstellen ist eine Toolchain erforderlich, die auf dem Host-Computer installiert wird.
Diese Toolchain umfasst mindestens einen Texteditor zusammen mit einem Compiler, Bibliotheken, einem Programmbinder und einem Debugger. Der Code wird auf dem Host-Computer geschrieben und kompiliert. Die resultierenden Binärdateien werden dann manuell auf der Zielplatine übertragen, normalerweise über eine Speicherkarte oder eine serielle Verbindung.
Sobald die eingebettete Anwendung gebootet ist, kann sie vom Host aus debuggt werden. Embedded Systems sind Einzweck-Rechner, die in der Regel für die Ausführung einer einzigen Aufgabe gebaut werden. Programme und Betriebssysteme werden als monolithischer Block auf elektronische Platinen in der Fabrik geladen.
Meist ist es nicht möglich, Binärdateien zu modifizieren, um den eingebetteten Systemen nach der Auslieferung neue Anwendungen oder Patches hinzuzufügen. Embedded Systems arbeiten meist offline, über einen langen Zeitraum und ohne jegliche Wartung.
Cross-Development mit Ubuntu Core geht anders
Ubuntu Core bringt eine zentrale Innovation für Embedded Systems: es teilt mit Hilfe von snaps (im Folgenden: Snaps) die bis dahin monolithische Embedded Software in einzelne Module. Snaps verwaltet diese Module auf dieselbe Weise wie herkömmliche Linux-Paketverwaltungssysteme. Daher lassen sie sich mit einem einzigen Befehl ohne lokale Kompilierung einfach durchsuchen, installieren und entfernen.
Wichtiger noch: sie können automatisch aktualisiert werden. Darüber hinaus sind Snaps vollständig isoliert und nutzen Container-Technologien wie Linux-Namensräume und Kontrollgruppen (cgroups).
Snaps werden auf einem Host-Computer erstellt und über die Cloud auf die Zielplatinen gebracht. Cross-Development ist daher der vorherrschende Ansatz bei der Entwicklung eingebetteter Systeme mit Hilfe von Snaps. Ein genauerer Blick auf die Toolchain zeigt, wie das funktioniert.
Snapcraft in der Toolchain
Snapcraft ist die Kommandozeilenschnittstelle für Entwickler zum Erstellen von Snaps. Über die Erstellung von Snaps hinaus ermöglicht es ein Lifecycle-Management, einschließlich Testen, Debuggen, Freigeben und Aktualisieren von Snaps. Snapcraft muss daher in Toolchains integriert werden, um eingebettete Systeme auf der Basis von Ubuntu Core zu entwickeln.
Um Software in einen Snap zu packen, muss mit Snapcraft eine so genannte snap.yml-Datei erstellt werden. Sie enthält die zum Bau eines Snaps benötigten Anweisungen. Auf Grundlage dieser Datei werden Binärdateien erstellt, Abhängigkeiten gesammelt und Schnittstellen zwischen Snaps erstellt.
Der Build-Prozess kann lokal erfolgen, Snapcraft unterstützt jedoch auch Remote-Builds, die in CI/CD-Workflows integriert sind. Zielarchitekturen können so spezifiziert werden, dass Entwickler ein einziger Befehl genügt, um Cross-Builds für verschiedene Architekturen zu generieren.
Betriebssystem-Schichten unabhängig aufbauen
Ein besonderes Merkmal von Ubuntu Core ist die Modularität der Betriebssystemschichten, was auch dem Snaps-Konzept zu verdanken ist. So wird es möglich, grundlegende Elemente wie den Kernel über verschiedene eingebettete Systeme hinweg wiederzuverwenden. Board-spezifische Konfigurationsdateien können auch in einen Snap – er wird als „gadget snap“ bezeichnet – gepackt werden. Der Anwendungs-Stack der die Appliance bestimmt, wird ebenfalls in einen Snap gepackt.
Wer Embedded Systems auf der Grundlage von Ubuntu Core erstellt, kann diese frei miteinander verbinden. Für Entwickler bringt das den großen Vorteil mit sich, dass sie ihre Arbeit in einzelne Schritte zerlegen und flexibler organisieren können. Durch das Einfügen eingebetteter Anwendungen in Snaps ist es möglich, diese mit wenigen Befehlen auszutauschen. Diese Funktion von Ubuntu Core entkoppelt die Software effektiv von der zugrunde liegenden Hardware des eingebetteten Systems.
Snaps über den Snap-Speicher zum Ziel bringen
Ubuntu Core schafft den mühseligen Prozess des manuellen Flashens einer Speicherkarte mit Binärdateien des gesamten Betriebssystems zur Aktualisierung eingebetteter Systeme ab. Einmal erstellte Snaps können in eine zentrale Snap-Registry, den Snap Store, verschoben werden. Von dort aus kann jedes Snap von jedem Gerät entdeckt, geladen und lokal installiert werden.
Entwickler können auf diese Weise von anderen Entwicklern erstellte Komponenten suchen und wiederverwenden. Dies gestaltet den eingebetteten Entwicklungsprozess weitaus effizienter als zuvor. Zudem senkt dies Entwicklungskosten und Time-to-Market für Embedded Systems und beschleunigt so gleichzeitig Innovationen und macht sie leichter zugänglich.
Aktualisierungen und Patches
Betriebssystem-Komponenten können in Ubuntu Core unabhängig voneinander verändert werden. Jedes Mal, wenn ein Snap neu erstellt und im Snap-Store veröffentlicht wird, besteht die Wahl, Geräte mit einem Befehl oder automatisch zu aktualisieren. Aufwändige manuelle Updates mit Skripten, bei denen das Risiko besteht, dass das Gerät bei einem A/B-Neustart ausgeblendet wird, sind nicht mehr erforderlich.
Ähnlich wie bei Linux-Paketverwaltungssystemen werden nur die binären Deltas an die Geräte gesendet. Das minimiert die benötigte Bandbreite. Ubuntu Core speichert permanent Sicherungskopien der vorhandenen Snaps, so dass das System bei einem Ausfall auf die letzte lauffähige Version zurückgesetzt wird. Mit dieser Funktion bleiben unternehmenskritische Embedded Systems auch während der Aktualisierung verfügbar. Sicherheitsupdates und Patches werden auf die gleiche Art und Weise kontinuierlich, zuverlässig und kosteneffizient ausgeführt.
Fazit
Ubuntu Core ist ein großer technologischer Sprung, denn es macht nicht weniger, als neu zu definieren, wie Embedded Systems im Zeitalter intelligenter vernetzter Geräte entwickelt werden. Cloud-native Embedded Systems erfordern neue Entwicklungswerkzeuge und Arbeitsabläufe. Die Cross-Entwicklung eingebetteter Systeme mit Ubuntu Core ebnet den Weg zu Innovationen für intelligentere und anwendungszentrierte eingebettete Systeme.
:quality(80)/p7i.vogel.de/wcms/77/3a/773abf8855ddb1afef4f585477556f9a/89123214.jpeg)
Was kann der neue Linux-Kernel in Ubuntu 20.04 LTS?
:quality(80)/p7i.vogel.de/wcms/ee/3e/ee3e6bd1548c02ee07ac5edd7725d5af/77955554.jpeg)
Remote Debugging von Embedded-Linux-Systemen mit GDB
* Adi ist Produktmanager für Robotik und Automobil bei Canonical. Als Autor bereichert er regelmäßig unser Ubuntu- und Open-Source-Special von Canonical mit neuen Beiträgen.
Dieser Beitrag erschien zuerst auf unserem Partnerportal Dev-Insider.de.
(ID:46683504)