Logo von Thomas Waldecker Software Engineering
Veröffentlichungsdatum

Bootable containers als Betriebssystem von embedded Systemen am Beispiel Raspberry Pi 3

Autoren
  • avatar
    Name
    Thomas Waldecker

Wie cool wäre es, wenn es neben dem Standardweg dem manuell angepassten Raspberry Pi OS und dem komplett Custom yocto oder buildroot noch einen weiteren Weg gäbe für die Entwicklung von embedded Linux Systemen? Einen Weg, bei dem man die funktionierenden und vertrauten Container Tools verwenden kann? Wo man die Software einfach auch auf beliebigen Hosts testen kann?

Hier kommen bootable Containers (bootc) ins Spiel.

Was sind bootable Containers?

Ein bootable Container Image enthält wie ein normales Containerimage den Userspace und zusätzlich noch einen bootbaren Linux-Kernel und systemd.

Was sind die Vorteile?

  1. Einfache und sichere Updates Ein Update wird einfach aus einer Image Registry heruntergeladen und beim nächsten Reboot gestartet. Wenn es fehlschlägt kann auf den vorherigen Stand zurückgerollt werden.

  2. Bekannte Containertools Für die Entwicklung, Test und Auslieferung können die vorhandenen und weit verbreiteten Tools verwendet werden.

  3. Sicherheit Das System ist immutable. Notwendige Änderungen können in /etc oder /var gemacht werden. Änderungen können einfach rückgängig gemacht werden.

Vorgehensweise

Da es keine offizielle Dokumentation gab, wie man das einfach auf einem Raspberry Pi ausprobieren kann habe ich die Dokumentation von Fedora IoT erweitert:

https://docs.fedoraproject.org/en-US/iot/fedora-iot-bootc-raspberry-pi-example/

Die Dokumentation wurde angepasst, indem GitLab zu quay (ein RedHat Produkt) geändert wurde. Ich werde hier deshalb kurz meine Version wiedergeben. Hier noch mein ursprünglicher Commit

Fedora IoT auf eine SD-Karte installieren

Für die initiale Installation von Fedora IoT verwendet man den arm-image-installer:

sudo arm-image-installer --image=Fedora-IoT-raw-42-20250724.1.aarch64.raw.xz --media=/dev/sda --target=rpi3 --resizefs --addkey=id_rsa.pub

Dieser Befehl erwartet, dass der SSH-Key und das Fedora IoT Image im lokalen Verzeichnis liegen. Nach der Ausführung des Befehls können Sie die SD-Karte in Ihrem Raspberry Pi einsetzen, den Raspberry Pi booten und über SSH verbinden.

Ein eigenes Fedora Bootc Image bauen und zu GitLab pushen

Hier erstellen wir ein eigenes testimage. Es kopiert nur eine Datei in das Verzeichnis /etc im Image.

FROM quay.io/fedora/fedora-bootc:latest

COPY files/secret /etc

Um das Image mit podman zu bauen und pushen werden folgende Befehle ausgeführt:

podman build --platform linux/arm64 -t gitlab.internal.net:5005/software/bootc/test-image:latest .
podman login gitlab.internal.net:5005
podman push gitlab.internal.net:5005/software/bootc/test-image:latest

Das Image auf dem Raspberry Pi wechseln

Auf dem Raspberry Pi läuft im Moment ja noch das Standard Image. Dieses wird jetzt gewechselt zu unserem eigenen erstellten Image.

Um GitLab zu erreichen muss ein GitLab Access Token mit Rolle Developer und Permission read_registry erstellt werden.

Dieses Token muss mit einem beliebigen Usernamen in base64 encoded werden:

echo -n "no_user:glpat-thisisthegitlabprojectaccesstoken" | base64

Diesen base64 encodeden String verwendet man in der auth.json Datei für die Authentifizierung:

cat << EOF > /etc/ostree/auth.json 
{ 
  "auths": { 
    "gitlab.internal.net:5005": { 
      "auth": "bm9fdXNlcjpnbHBhdC10aGlzaXN0aGVnaXRsYWJwcm9qZWN0YWNjZXNzdG9rZW4=" 
    } 
  } 
} 
EOF

Jetzt kann am Raspberry Pi das Image gewechselt werden:

bootc switch gitlab.internal.net:5005/software/bootc/test-image:latest

Nach einem reboot sollte dann das File im Raspberry Pi liegen:

cat /etc/secret

Sie haben eine Projektidee oder benötigen Beratung?

Egal, ob es um die Entwicklung einer neuen Anwendung, die Modernisierung bestehender Systeme oder den Einsatz von KI geht - ich helfe Ihnen gerne weiter.
Termin vereinbaren