- Veröffentlichungsdatum
Bootable containers als Betriebssystem von embedded Systemen am Beispiel Raspberry Pi 3
- Autoren
- 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?
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.
Bekannte Containertools Für die Entwicklung, Test und Auslieferung können die vorhandenen und weit verbreiteten Tools verwendet werden.
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