ADMIN

2024

03

2024-02-28T12:00:00

Speichermanagement

PRAXIS

052

Open-Source-Tipp

IoT

Linux

Fedora IoT per Image ausrollen

Gut getroffen

von Thorsten Scherf

Veröffentlicht in Ausgabe 03/2024 - PRAXIS

Mit Fedora IoT steht eine Linux-Distribution speziell für den Einsatz auf Edge- und IoT-Geräten zur Verfügung. Der Open-Source-Tipp in diesem Monat zeigt, wie Sie ganz leicht eigene Images auf Basis der OSTree-Architektur erzeugen und diese dann auf Ihren Systemen ausrollen.

Im letzten Monat haben wir Ihnen an dieser Stelle die Fedora-IoT-Distribution [1] vorgestellt und Besonderheiten der OSTree-Architektur aufgezeigt [2,3]. In diesem Monat möchten wir die neuen Erkenntnisse in die Praxis umsetzen, um maßgeschneiderte Images für Ihre Systemlandschaft zu erzeugen.
Image-Builder im TOML-Format
Für Linux-Systeme existiert seit geraumer Zeit bereits das osbuild-Projekt [4], das einen Webservice zum Erzeugen von Linux-Images zur Verfügung stellt. Das Projekt ist auch unter dem Namen "Image Builder" bekannt, da es eben genau das macht. Wie ein Image aussehen soll und welche Anpassungen Sie vornehmen möchten, bestimmen Sie über einen sogenannten Blueprint. Neben der Installation bestimmter Softwarepakete, auch aus eigenen Repositories heraus, können Sie eine Vielzahl an weiteren Änderungen vornehmen. Eine vollständige Übersicht darüber, welche Optionen Ihnen in einem Blueprint zur Verfügung stehen, finden Sie in der Referenzdokumentation unter [5].
Blueprints sind grundsätzlich im TOML-Format [6] verfasst. Hier eine einfache Beispieldatei "install-tmux.toml", bei der das Paket "tmux" mit in das Fedora-39-basierte OSTree-Image aufzunehmen ist:
Im letzten Monat haben wir Ihnen an dieser Stelle die Fedora-IoT-Distribution [1] vorgestellt und Besonderheiten der OSTree-Architektur aufgezeigt [2,3]. In diesem Monat möchten wir die neuen Erkenntnisse in die Praxis umsetzen, um maßgeschneiderte Images für Ihre Systemlandschaft zu erzeugen.
Image-Builder im TOML-Format
Für Linux-Systeme existiert seit geraumer Zeit bereits das osbuild-Projekt [4], das einen Webservice zum Erzeugen von Linux-Images zur Verfügung stellt. Das Projekt ist auch unter dem Namen "Image Builder" bekannt, da es eben genau das macht. Wie ein Image aussehen soll und welche Anpassungen Sie vornehmen möchten, bestimmen Sie über einen sogenannten Blueprint. Neben der Installation bestimmter Softwarepakete, auch aus eigenen Repositories heraus, können Sie eine Vielzahl an weiteren Änderungen vornehmen. Eine vollständige Übersicht darüber, welche Optionen Ihnen in einem Blueprint zur Verfügung stehen, finden Sie in der Referenzdokumentation unter [5].
Blueprints sind grundsätzlich im TOML-Format [6] verfasst. Hier eine einfache Beispieldatei "install-tmux.toml", bei der das Paket "tmux" mit in das Fedora-39-basierte OSTree-Image aufzunehmen ist:
name = "tmux-commit"
description = "Installing tmux"
version = "0.0.1"
distro = "fedora-39"
[[packages]]
name = "tmux"
version = "*"
Stellen Sie nun sicher, dass alle notwendigen Pakete für den osbuild-composer-Webservice vorliegen und die Podman-Container-Engine vorhanden ist. Mit den folgenden Kommandos installieren Sie alle notwendigen Pakete auf einem Fedora-System und stellen im Anschluss sicher, dass der Build Service auch aktiv ist:
dnf install osbuild osbuild-ostree osbuild-composer-cli osbuild-composer podman
systemctl enable --now osbuild-composer.socket
Danach senden Sie die soeben erzeugte TOML-Datei an den Build-Service:
composer-cli blueprints push install-tmux.toml
Über das Kommando composer-cli blueprints show <name> verifizieren Sie, ob alles korrekt beim Build-Service angekommen ist. Ist dies der Fall, starten Sie im nächsten Schritt den Build-Vorgang für Ihren OSTree-Dateisystembaum. Dies wird in dem Fall auch als "OSTree Commit" bezeichnet, den Sie durch die Installation des TMUX-Pakets erzeugen. Denken Sie daran, dass OSTree-Dateisysteme aus Hardlinks auf das eigentliche Base-Image bestehen und Änderungen darauf aufbauend als zusätzlicher Commit existieren.
OSTree-Container-Image erzeugen
Achten Sie darauf, dass Sie im Kommando composer-cli den korrekten Namen aus dem Blueprint (tmux-commit) und den Image-Typen (iot-container) verwenden:
composer-cli compose start-ostree --ref "fedora/39/x86_64/iot" tmux-commit iot-container
Der Build-Vorgang startet und mithilfe von composer-cli compose status überprüfen Sie den aktuellen Status des Builds. Nach einigen Minuten sollte dann ein TAR-Archiv mit dem OSTree-Commit vorliegen, das Sie mit dem folgenden Befehl in das lokale Verzeichnis exportieren:
composer-cli compose image <ID>
OSTree-Commit installieren
Da Sie einen OSTree-Commit nicht direkt booten können, müssen Sie im nächsten Schritt einen Trick anwenden. Der Anaconda-Installer erlaubt über die Kickstart-Anweisung "ostreesetup" für die Installation eines Systems, auf einen OSTree-Commit zurückzugreifen. Um die Installationsroutine zu vereinfachen, kann der Image-Builder-Service diesen Schritt automatisieren, indem dieser ein bootfähiges Images mit einer vorgefertigten Kickstart-Datei erzeugt, das dann zur automatischen Installation des gewünschten Systems zum Einsatz kommen kann (Listing 1).
Listing 1: Automatische Installation
### Mit der Kickstartdatei "osbuild.ks" führt Anaconda eine automatische Installation des OSTree-Commits durch.
# mount -o loop 9011a45c-187c-4008-8614-5f11b4318b29-installer.iso /mnt
# grep osbuild.ks /mnt/isolinux/isolinux.cfg
append initrd=initrd.img inst.stage2=hd:
LABEL=Fedora-39-BaseOS-x86_64
inst.ks=hd:LABEL=Fedora-39-BaseOS-x86_64:/osbuild.ks
# cat /mnt/osbuild.ks
ostreesetup --osname=fedora
--url=file:///run/install/repo/ostree/repo
--ref=fedora/39/x86_64/iot --nogpg
# cat
/mnt/ostree/repo/refs/heads/fedora/39/x86_64/iot
a5d5a30deb39843c2e3db1d28a8535f6cd071f6a4067154979e9b518e76e5f3f
Hierfür erstellen Sie ein neues Image auf Basis des soeben erzeugten OSTree Commits. Das TAR-Archiv, das Sie im letzten Schritt erzeugt haben, müssen Sie hierfür als Container-Image in die lokale Podman-Registry laden, mit einem Tag versehen und dann einen neuen Container auf Basis dieses Images starten (Listing 2).
Listing 2: TAR-Archiv laden und Container starten
### Das soeben erzeugte tar-Archiv laden Sie in die lokale Registry und starten im Anschluss einen neuen Container.
# cat 2b017834-e299-419c-99ae-edf15d9ac61f-container.tar | podman load
Getting image source signatures
Copying blob 260eb59aac7b done |
Copying config 3d40335eb2 done |
Writing manifest to image destination
Loaded image: sha256:3d40335eb2c52e90212a7d274b93c1256d8c3bfc8c76a091cd60e999dae3890a
# podman tag 3d40335eb2c52e90212a7d274b93c1256d8c3bfc8c76a091cd60e999dae3890a localhost/iot-tmux-image
# podman run --rm -d -p 8080:8080 --name ostree-repo localhost/iot-tmux-image
Hat dies geklappt, lauscht nun auf Port 8080 ein NGINX-Webserver, der den soeben erzeugten OSTree-Commit bereitstellt (Listing 3). Um nun ein bootfähiges Image zu generieren, legen Sie eine leere TOML-Datei (Listing 4) an, senden diese erneut an den osbuild-composer Webservice und starten den Buildvorgang.
Listing 3: Neuer Container läuft
### Podman hat nun einen neuen Container auf Basis des soeben erzeugten OSTree Commits erzeugt.
 # podman ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
546cd64d088b localhost/iot-tmux-image:latest nginx -c /etc/ngi 6 seconds ago Up 6 seconds 0.0.0.0:8080->8080/tcp ostree-repo
Listing 4: Datei "installer.toml"
### TOML-Datei zum Erzeugen des bootfähigen OSTree-Images.
name = "installer"
description = "Empty blueprint"
version = "0.0.1"
# composer-cli blueprints push installer.toml
# composer-cli compose start-ostree --ref "fedora/39/x86_64/iot" --url http://10.88.0.2:8080/repo/installer fedora-iot-installer
Wichtig an dieser Stelle ist, dass Sie nun den Image-Typ "iot-installer" anstatt "iot-container" verwenden und für die Option "ref" die gleiche Referenz verwenden wie beim Erzeugen des TAR-Archivs. Nur dann findet der Anaconda Installer das passende Repository, das den OSTree Commit enthält. Die IP-Adresse des Containers finden Sie übrigens heraus, indem Sie das folgende Kommando aufrufen und dann einfach nach der "IP" suchen:
podman inspect <Container-ID>
Hat dies alles funktioniert, sehen Sie in der Ausgabe von composer-cli compose status nun einen zweiten Job, der nach einiger Zeit ebenfalls den Status "FI-NISHED" aufweisen sollte.
Bootfähiges ISO-Image als Build-Artefakt
Wie auch bereits zuvor, können Sie das neu erzeugte ISO-Image in Ihr lokales Verzeichnis laden:
composer-cli compose image 9011a45c-187c-4008-8614-5f11b4318b299011a45c-187c-4008-8614-5f11b4318b29-installer.iso
Das Image enthält sämtliche Änderungen, die Sie in der Blueprint-TOML-Datei "installer.toml" aufgeführt haben. Mithilfe des Images können Sie dann schließlich die gewünschten IoT- oder Edge-Systeme mit einer OSTree-basierten Fedora-Distribution installieren.
Fazit
Fedora IoT ist eine praktische Linux-Distribution für Edge- und IoT-Geräte. Mit dem Image-Builder-Service ist es sehr einfach möglich, maßgeschneiderte Images für Linux-Systeme zu erzeugen. Das gilt auch für Systeme, auf denen immutable OSTree-Images zum Einsatz kommen. Die fertigen Abbilder können Sie dann beispielsweise auf einen USB-Stick oder eine SD-Karte schreiben, um davon die gewünschten Systeme automatisch zu installieren.
(dr)
Link-Codes