Yocto erstelltes Image in QEMU testen

Embedded-Linux-Images ohne Hardware starten und prüfen

Bernhard Trinnes
Bernhard Trinnes
Yocto erstelltes Image in QEMU testen

Demonstration von Yocto-Images im QEMU-Emulator

Mit QEMU lässt sich ein Embedded-Linux-System direkt auf dem Host-PC starten, ohne sofort reale Hardware einsetzen zu müssen. Zur Demonstration verwenden wir Poky, das Referenz-Buildsystem des Yocto-Projekts. Es ist kompakt, flexibel erweiterbar und bietet alle Werkzeuge, die für den Einstieg in das Erstellen, Ausführen und Testen von Linux-Images notwendig sind.

Die hier gezeigten Schritte lassen sich nicht nur für Poky anwenden, sondern auch auf eigene Images übertragen – etwa für SoC-Plattformen wie i.MX. Der Ablauf zum Bauen, Booten und Testen bleibt im Wesentlichen gleich, lediglich die Zielmaschine und zusätzliche Layers unterscheiden sich.

Durch diese Eigenschaften eignet sich Poky besonders gut, um erste Erfahrungen mit Emulatoren zu sammeln und automatisierte Tests in den Entwicklungsprozess einzubinden. Dieser Artikel zeigt den gesamten Ablauf: vom Herunterladen der Quellen über den Image-Build bis hin zum Start in QEMU und der Ausführung von Tests.

Voraussetzungen

  • Linux-Hostsystem (z. B. Ubuntu oder Fedora)
  • git, tar und Standard-Build-Tools (gcc, make, python3, etc.)
  • Mindestens 50 GB freier Speicherplatz

Schritt 1: Poky-Repository klonen

git clone git://git.yoctoproject.org/poky
cd poky

Optional: einen stabilen Branch verwenden, z.B. scarthgap:

git checkout scarthgap

Schritt 2: Build-Umgebung initialisieren

source oe-init-build-env

Dadurch wird das Verzeichnis build/ angelegt. In conf/local.conf lassen sich Einstellungen anpassen, etwa die Anzahl paralleler Jobs:

BB_NUMBER_THREADS = "8"
PARALLEL_MAKE = "-j 8"

Schritt 3: Image bauen

Ein minimales Image:

bitbake core-image-minimal

Der Build-Prozess dauert je nach Hardware bis zu mehreren Stunden. Das Ergebnis liegt in:

build/tmp/deploy/images/qemux86-64/

Schritt 4: Image in QEMU starten

Poky bringt ein Startskript mit:

runqemu qemux86-64

Damit wird ein virtuelles System auf Basis von QEMU hochgefahren. Es erscheint eine Login-Shell (Standard-Benutzer: root, kein Passwort).

Schritt 5: Tests ausführen

Das Yocto-Projekt unterstützt die Testinfrastruktur (oeqa). Beispiel: einfache Sanity-Tests.

Für eigene Tests lassen sich Python-Tests in meta/lib/oeqa/runtime/ ergänzen. Ein Beispiel für einen Ping-Test:

from oeqa.runtime.case import OERuntimeTestCase
from oeqa.core.decorator.oetimeout import OETimeout

class PingTest(OERuntimeTestCase):
    @OETimeout(60)
    def test_ping(self):
        status, output = self.target.run("ping -c 3 8.8.8.8")
        self.assertEqual(status, 0, msg="Ping fehlgeschlagen:\n%s" % output)

Schritt 6: Fehleranalyse

Falls Tests fehlschlagen:

  • build/tmp/log/oeqa/ prüfen
  • QEMU mit runqemu interaktiv starten
  • Log-Dateien in build/tmp/work/.../temp/log.do_* analysieren

Fazit

QEMU bietet eine flexible Möglichkeit, Embedded-Linux-Images schnell und unabhängig von echter Hardware zu starten. Entwickler können damit Bootprozesse nachvollziehen, Funktionen prüfen und automatisierte Tests ausführen. Poky dient hier nur als Beispiel zur Image-Erstellung, der Ablauf lässt sich aber ebenso auf eigene oder boardspezifische Builds – etwa für i.MX – übertragen.

Damit wird QEMU zu einem wichtigen Werkzeug in der Embedded-Entwicklung: für frühes Prototyping, kontinuierliche Tests und stabile Release-Prozesse.