Suchen

Open Source Debian oder Yocto – welches Linux-Buildsystem ist besser?

| Autor / Redakteur: Jan Altenberg * / Franz Graser

Linux-Buildsysteme erstellen eine Kombination aus dem Linux-Kernel und der für eine bestimmte Anwendung relevanten Programme. Doch welches Buildsystem ist das richtige?

Firmen zum Thema

Tux, das Linux-Maskottchen: Die Notwendigkeit für ein Buildsystem erklärt sich aus der Linux-Historie. Mit Buildsystemen wird quasi genau die Anwendungsumgebung auf Linux-Basis erstellt, die der Anwender für seine Zwecke benötigt.
Tux, das Linux-Maskottchen: Die Notwendigkeit für ein Buildsystem erklärt sich aus der Linux-Historie. Mit Buildsystemen wird quasi genau die Anwendungsumgebung auf Linux-Basis erstellt, die der Anwender für seine Zwecke benötigt.
(Bild: Larry Ewing, Simon Budig)

Der Hintergrund von Buildsystemen erschließt sich am besten durch einen Blick auf die Historie von freien UNIX-Systemen und von Linux. Der erste wichtige Schritt in Richtung Linux-basierter Geräte, wie wir sie heute kennen, war die Gründung der Free Software Foundation und dem GNU-Projekt mit der Zielsetzung der Implementierung eines freien UNIX-Systems. Hierzu gehören zum einen der Betriebssystemkern und zum anderen alle Werkzeuge und Programme, mit denen dieser sinnvoll genutzt werden kann.

In letzterem Punkt, der Erstellung von UNIX-Programmen (wie der Shell, des Compilers und der grafischen Oberfläche) war das GNU-Projekt sehr erfolgreich. Nur die Entwicklung des Betriebssystemkerns ging sehr schleppend voran. An diesem Punkt schließt nun die Erfolgsgeschichte von Linux an. Anfang der 1990er Jahre entstand das Betriebssystem Linux, als freier UNIX-Klon. Diese Entwicklung ging sehr rasch voran, womit für das GNU-Projekt nun ein geeigneter Betriebssystemkern zur Verfügung stand.

Warum ist ein Buildsystem notwendig?

Genau diese Kombination aus Linux-OS und den freien Werkzeugen des GNU-Projektes bietet die Basis für die Linuxsysteme, die wir heute kennen. Genau genommen ist Linux also nur ein Betriebssystemkern, der für den Anwender mit den unterschiedlichsten Programmen kombiniert werden kann. Diese Kombination wird allgemein als Distribution bezeichnet. Ein Buildsystem hat also die Aufgabe, genau diese Kombination zu erstellen.

Die Anforderungen klingen zunächst sehr einfach: Ein Buildsystem dient in erster Linie dazu, eine auf einen bestimmten Anwendungszweck abgestimmte Kombination aus dem Linux Kernel und diversen Applikationen zu erstellen. Doch bei genauerer Betrachtung sind die Randbedingungen, die ein Buildsystem erfüllen muss, deutlich komplexer. Im industriellen Umfeld genügt nicht nur die einfache Erstellung einer Software, auch die Reproduzierbarkeit muss gewährleistet sein.

Gerade die Reproduzierbarkeit stellt aufgrund der oft sehr langen Produktlebenszyklen eine besondere Herausforderung dar: Solche Systeme müssen auch über einen Zeitraum von mehr als zehn Jahren reproduzierbar zu erstellen sein.

Neben den technischen Randbedingungen kommt ein weiterer Aspekt ins Spiel: Die Lizenzverwaltung. Sowohl Linux als auch die Werkzeuge des GNU-Projektes sind unter Open-Source-Lizenzen gestellt, die mit verschiedenen Pflichten verbunden sind. Eine nicht zu vernachlässigende Aufgabe eines Buildsystemes ist es, eine Auflistung der in den erzeugten Distributionen verwendeten Lizenzen zu erstellen und den Anwender bei der Erfüllung der Lizenzpflichten (etwa bei der Bereitstellung der Quelltexte verwendeter Open-Source Komponenten) zu unterstützen.

Welche Arten von Buildsystemen gibt es?

Neben den konkreten Umsetzungen eines Buildsystems sind zunächst zwei Unterschiedliche Ansätze zu betrachten: Sourcecodebasierte und Binärcode- (basierte) Systeme. Sourcebasierte Systeme erstellen eine Distribution komplett aus den Quellen (es werden immer alle Quellen neu übersetzt), während Binärsysteme eine Distribution aus vorkompilierten Paketen generieren. Vertreter aus beiden Lagern gibt es wie Sand am Meer. Es gibt allerdings zwei Systeme, die sich im industriellen Umfeld mehr und mehr durchsetzen: Yocto als Vertreter sourcebasierter Buildsysteme und die Ansätze, die auf der Linux-Distribution Debian aufsetzen.

Das Schichtkonzept von Yocto: Bedingt durch die einzelnen Layer ist das Tool gut für die Variantenpflege geeignet.
Das Schichtkonzept von Yocto: Bedingt durch die einzelnen Layer ist das Tool gut für die Variantenpflege geeignet.
(Bild: Linutronix)

Bei Yocto handelt es sich um ein Projekt, das mehrere Tools umfasst, mit der Zielsetzung einen Werkzeugkasten zur Erstellung einer Linux Distribution bereitzustellen. Dieser beinhaltet bereits eine Beispieldistribution mit dem Namen „Poky“. Yocto und seine Referenzimplementierung Poky haben sich bei einem Großteil der Hardwarehersteller mittlerweile als Standard durchgesetzt, um den Anwendern der Hardware eine einheitlich Umgebung zum Erstellen angepasster Linux-Distributionen für Ihre Systeme zu bieten. Wobei hier weniger die Distribution im Vordergrund steht, sondern eher ein schnelles Ausprobieren der Hardware unter Linux mit der Kundenapplikation. Dass hierbei eine Distribution abfällt, wird gerne als Nebeneffekt mitgenommen.

Yocto hat in sehr hohem Maße zur Standardisierung beigetragen, denn noch vor nicht allzu langer Zeit haben die meisten Hersteller eigene Buildsysteme gepflegt. Allerdings müssen an dieser Stelle einige Fehlinterpretationen im Bezug auf Yocto klargestellt werden: Yocto ist ein Baukasten zum Erstellen einer eigenen Linux-Distribution, nicht mehr und nicht weniger. Sehr häufig wird Yocto als Entwicklungssystem und als Lösung zur Pflege von Hardwarevarianten betrachtet.

Selbstverständlich bietet Yocto die Möglichkeit, auch eine Toolchain und eine Entwicklungsumgebung für den Applikationsentwickler zu erstellen, aber hier hat Yocto ganz klar zwei Rollen definiert: Den Applikationsentwickler und den Integrator. Der Applikationsentwickler kann die mit Yocto erstellten Werkzeuge nutzen, um seine Anwendung zu erstellen und zu debuggen. Das Ergebnis dieser Arbeit wird vom Integrator dann mit Yocto in ein auf die Zielhardware abgestimmtes Linux eingebunden, was nun genau die Aufgaben eines Buildsystems widerspiegelt.

Auch für die Variantenpflege stellt Yocto einige clevere Mechanismen bereit, wie zum Beispiel ein Layer-Konzept. Allerdings bietet Yocto an dieser Stelle nur die notwendige Methodik an; die Aufteilung, wie nun genau mit Varianten umgegangen werden soll, liegt in der Hand des Anwenders.

Welche Debian-basierten Buildsysteme gibt es?

Debian ist in erster Linie eine bereits existierende, auf Binärpaketen basierende Distribution (aber nicht nur das – Debian erlaubt es selbstverständlich auch, aus dem Quellcode alle benötigten Pakete selber zu bauen). Herzstück der Distribution ist das Paketmanagement, das sich um die Installation von Binärpaketen, die Verwaltung von Paketquellen und die Berücksichtigung von Abhängigkeiten zwischen Paketen kümmert.

Das ELBE-Plattformkonzept: ELBE (Embedded Linux Build Environment) deckt alle Anforderungen an ein Buildsystem ab und dient zum reproduzierbaren Erstellen Debian-basierter Systeme für eine bestimmte Hardware.
Das ELBE-Plattformkonzept: ELBE (Embedded Linux Build Environment) deckt alle Anforderungen an ein Buildsystem ab und dient zum reproduzierbaren Erstellen Debian-basierter Systeme für eine bestimmte Hardware.
(Bild: Linutronix)

Im Gegensatz zu vielen anderen Distributionen, die ursprünglich aus dem Desktop-Bereich kommen, stellt Debian auch Binärpakete für eine Vielzahl von CPU-Architekturen zur Verfügung. Neben x86 (32-bit und 64-bit) sind das unter anderem: Power PC, ARM mit und ohne Hardware Floating Point und MIPS, was Debian somit auch für die meisten Embedded-Plattformen interessant macht. Vorteile von Debian sind die enorme Entwicklergemeinde, die Langlebigkeit der Technik (Debian existiert seit mehr als 20 Jahren) und die fast unbegrenzte Auswahl an Softwarepaketen. Weiterhin sind viele Mechanismen aus dem Desktop oder Serverbereich durchaus auch im industriellen Umfeld von großem Nutzen.

So kann das Paketmanagement zum Beispiel zum Einspielen von Updates verwendet werden und mit signierten Paketquellen lässt sich auch prüfen, ob die eingespielte Software tatsächlich vom richtigen Anbieter kommt. Nun ist Debian an sich eine bereits existierende Distribution mit einer großen Paketauswahl, die im industriellen Umfeld genutzt werden kann.

Ein Buildsystem, das sich diese Technik zu Nutze macht, ist zum Beispiel ELBE (Embedded Linux Build Environment, http://elbe-rfs.org). ELBE deckt alle Anforderungen an ein Buildsystem ab und dient zum reproduzierbaren erstellen Debian-basierter Systeme für eine bestimmte Hardware (unter Berücksichtigung aller wichtigen Teilaspekte, wie zum Beispiel dem Lizenzmanagement).

Vor- und Nachteile der verschiedenen Ansätze

Beide hier vorgestellten Ansätze haben ihre Vorzüge, aber auch ihre Nachteile. So kann beim Yocto Ansatz zum Beispiel jeder Compile-Parameter beeinflusst werden, während bei Debian basierten Ansätzen zunächst vorkompilierte Pakete verwendet werden (die für 98 Prozent der Anwendungsfälle problemlos nutzbar sind). Im Gegenzug haben sourcebasierte Systeme (also Yocto) auch einige Probleme. Das Cross-Kompilieren der einzelnen Komponenten ist nicht ganz trivial und für die meisten Open-Source-Projekte sind Anpassungen erforderlich, damit sich diese überhaupt cross-kompilieren lassen. Die Wartung und Pflege dieser Anpassungen ist Aufgabe des jeweiligen Buildsystems, was sehr häufig zu einer eher eingeschränkten Paketauswahl führt.

Ein weiterer Nachteil des Cross-Kompilierens sind die relativ großen Abhängigkeiten zum Host-System, was gerade im Hinblick auf die Reproduzierbarkeit große Einschränkungen mit sich bringen kann. Diese Arbeit wird auf Debian-Seite von der großen Entwicklergemeinde erledigt, womit sich Debian-basierte Buildsysteme nicht mehr um diese Themenstellung kümmern müssen. Dem Anwender steht also die komplette Paketauswahl zur Verfügung. In der Debian-Entwicklergemeinde steckt darüber hinaus noch ein weiterer Vorteil: Sie bekommen alle Pakete aus einer Hand.

Yoctos Layerkonzept wird von den jeweiligen Hardwareherstellern üblicherweise zum Einbringen eigener Anpassungen genutzt. Für den Endanwender stellt sich Yocto also immer als eine Kombination aus dem Yocto-Projekt und den Erweiterungen eines oder mehrerer Drittanbieter dar. Die Qualität und auch die Art der Umsetzung solcher Layer kann durchaus sehr unterschiedlich sein. Yocto ist also nicht zwingend gleich Yocto.

Allerdings haben Debian-basierte Systeme eine gewisse Größenanforderung. Sofern das Paketmanagement auf dem Zielsystem genutzt werden soll, sind 32 bis 64 MB Datenspeicher erforderlich, während mit Yocto-basierten Ansätzen auch deutlich kleinere Speichergrößen bedient werden können.

Themen wie das Lizenzmanagement werden von beiden Systemen ähnlich komfortabel gelöst. Yocto unterstützt hier das sogenannte SPDX-Format zur Weitergabe von Lizenzen und auch Debian stellt ein automatisch parsbares Format bereit, das weitestgehend mit dem SPDX-Format kompatibel ist.

Security-Aspekte der einzelnen Buildsysteme

Neben den bereits beschriebenen Vor- und Nachteilen der jeweiligen Buildsysteme ist noch ein anderer Aspekt zu beleuchten: Security. Auch industrielle Geräte sind zunehmend vernetzt und somit einer Vielzahl möglicher Angriffsszenarien ausgesetzt. Folglich ist die Pflege der verwendeten Softwarepakete ein wichtiger Bestandteil eines Sicherheitskonzeptes. Hier kann Debian den Vorteil seiner Community und seiner starken Entwicklergemeinde ausspielen. Während Yocto in halbjährlichen Releases gepflegt wird, kümmert sich auf Debian-Seite ein Sicherheitsteam stetig um die Bereitstellung von Bugfixes für sicherheitskritische Probleme.

Die Frage nach dem richtigen Buildsystem läßt sich nicht pauschal mit einer Empfehlung beantworten. Vielmehr gilt es, in jedem Anwendungsfall die Anforderungen zu Beleuchten und diese auf ein geeignetes Buildsystem abzubilden (zum Beispiel die Speichergröße, Security-Aspekte, die Paketauswahl und dergleichen).

Während Yocto im Bereich von Compiler-Optimierungen und der einfachen Generierung einer Entwicklungsumgebung punkten kann, liegen die Vorteile von Debian und den darauf aufsetzenden Buildsystemen in der enorm großen Paketauswahl, in der Langlebigkeit und der Pflege der bereitgestellten Software. Die Themen Security und Reproduzierbarkeit sind weitere Punkte, die bei Debian positiv hervorzuheben sind.

Unabhängig von der ausgewählten Technologie sollten die Anforderungen an das Buildsystem grundsätzlich nicht mit generellen Anforderungen an den Entwicklungsprozess vermischt werden. Um Themen wie beispielsweise die Variantenpflege zu lösen, muss ein Buildsystem zwar passende Mechanismen bereitstellen. Die Lösung an sich ist aber eine konzeptionelle Arbeit und kann vom Buildsystem nicht abgenommen werden.

Eindeutige Sieger gibt es nicht

Die Frage nach dem richtigen Buildsystem läßt sich nicht pauschal mit einer Empfehlung beantworten. Vielmehr gilt es, in jedem Anwendungsfall die Anforderungen zu Beleuchten und diese auf ein geeignetes Buildsystem abzubilden. Dazu zählen etwa die Speichergröße, Sicherheitsaspekte oder die Paketauswahl.

Während Yocto bei Compiler-Optimierungen und der einfachen Generierung einer Entwicklungsumgebung punkten kann, liegen die Vorteile von Debian und den darauf aufsetzenden Buildsystemen in der großen Paketauswahl, in der Langlebigkeit und der Pflege der erstellten Software. Auch die Themen Security und Reproduzierbarkeit sind bei Debian positiv zu bewerten.

Dieser Beitrag ist ursprünglich auf unserem Schwesterportal Elektronikpraxis.de erschienen.

* Jan Altenberg ist seit 2007 für Linutronix tätig. Seine Aufgaben umfassen die Leitung des Bereichs Schulung und die technische Projektleitung.

(ID:44415472)