ADMIN

2024

09

2024-08-29T12:00:00

Collaboration

PRAXIS

056

Open-Source-Tipp

Containerisierung

Image-Builder

Betriebssystem-Images mit bootc erzeugen

Fließbandarbeit

von Thorsten Scherf

Veröffentlicht in Ausgabe 09/2024 - PRAXIS

Linux-Container erfreuen sich seit geraumer Zeit großer Beliebtheit, um Applikationen zu paketieren, zu verteilen und dann auf einem Zielsystem zu deployen. Mit dem Projekt bootc können Sie einen containerbasierten Workflow nun auch verwenden, um bootfähige Betriebssystem-Images zu erzeugen. Wir schauen uns das Projekt an und zeigen, wie Sie mit Podman und wenigen Handgriffen fertige Images selbst erzeugen.

Container-Images stellen in der Regel nur die Komponenten zur Verfügung, die zum Betrieb einer bestimmten Applikation innerhalb eines Containers notwendig sind. Ein Linux-Kernel, ein Bootloader, Firmware und ähnliche Komponenten sind dabei nicht enthalten.
Viele Unternehmen verfügen bereits über einen entsprechenden Workflow, um Container-Images für Applikationen zu erzeugen und diese zu verwalten. Ein solcher Ablauf basiert üblicherweise auf einer Vielzahl an unterschiedlichen Tools, um ein Image zu erzeugen, auf Schwachstellen zu prüfen und dann innerhalb einer Container-Registry zur Verfügung zu stellen. Insofern wäre es natürlich wünschenswert, den gleichen Workflow auch für bootfähige System-Images einsetzen zu können.
Container für Betriebssysteme erstellen
Und genau hier kommen die beiden Projekte bootc [1] und bootc Image Builder [2] ins Spiel. Diese erlauben es, den gleichen Workflow, den Sie für Applikations-Container verwenden, auch für Betriebssystem-Container einzusetzen. Sie benötigen also lediglich ein Container- oder Docker-File zusammen mit dem bootc-Image-Builder-Service, um daraus dann ein bootfähiges OCI-Image (Open Container Initiative) zu erzeugen, das Sie auf einem Host oder einer virtuellen Maschine starten können.
Container-Images stellen in der Regel nur die Komponenten zur Verfügung, die zum Betrieb einer bestimmten Applikation innerhalb eines Containers notwendig sind. Ein Linux-Kernel, ein Bootloader, Firmware und ähnliche Komponenten sind dabei nicht enthalten.
Viele Unternehmen verfügen bereits über einen entsprechenden Workflow, um Container-Images für Applikationen zu erzeugen und diese zu verwalten. Ein solcher Ablauf basiert üblicherweise auf einer Vielzahl an unterschiedlichen Tools, um ein Image zu erzeugen, auf Schwachstellen zu prüfen und dann innerhalb einer Container-Registry zur Verfügung zu stellen. Insofern wäre es natürlich wünschenswert, den gleichen Workflow auch für bootfähige System-Images einsetzen zu können.
Container für Betriebssysteme erstellen
Und genau hier kommen die beiden Projekte bootc [1] und bootc Image Builder [2] ins Spiel. Diese erlauben es, den gleichen Workflow, den Sie für Applikations-Container verwenden, auch für Betriebssystem-Container einzusetzen. Sie benötigen also lediglich ein Container- oder Docker-File zusammen mit dem bootc-Image-Builder-Service, um daraus dann ein bootfähiges OCI-Image (Open Container Initiative) zu erzeugen, das Sie auf einem Host oder einer virtuellen Maschine starten können.
Ein so erstelltes Image enthält auch den Linux-Kernel, der ganz regulär zum Bootzeitpunkt geladen wird. Das Basis-Betriebssystem liegt dann nicht in einem Container und es steht regulär ein systemd-Prozess mit der PID 1 zur Verfügung. Mittels sogenannter Transactional Updates halten Sie ein solches System auf dem aktuellen Stand. Diese Aktualisierungen stellen auf dem System zusätzliche Layer im Vergleich zum Basis-Image zur Verfügung. Hierfür erzeugen Sie einfach ein aktualisiertes bootc-Basis-Image; ein neues Disk-Image ist hierfür nicht notwendig. Der Update-Vorgang gestaltet sich somit identisch zu anderen OSTree-basierten Systemen.
Um bootfähige Disk-Images mithilfe der Podman-Container-Runtime zu erzeugen, bietet sich das Container-Tool bootc-image-builder an. Dieses kümmert sich darum, auf Basis eines sogenannten Basis-Images ein Disk-Image zu generieren. Alternativ dazu können Sie auch auf das grafische Tool Podman Desktop [3] zurückgreifen. Das Tool vereinfacht den Umgang mit Containern und bietet eine Vielzahl an Erweiterungen an - eben auch für bootc, um hiermit bootfähige Container-Images zu erzeugen. Das Tool wurde bereits ausführlich in der IT-Administrator Ausgabe 12/2022 [4] vorgestellt. In diesem Artikel fokussieren wir uns daher primär auf die bootc-Erweiterung.
Images im Terminal erzeugen
Schauen wir uns aber zuerst den Vorgang an, um innerhalb eines Terminals Disk-Images basierend auf einem Standard bootc-Image zu generieren. Natürlich haben Sie im Vorfeld immer die Möglichkeit, dieses bootc-Image mithilfe eines Containerfiles oder Dockerfiles um weitere Komponenten zu erweitern oder andere Anpassungen vorzunehmen. Das so angepasst Image stellen Sie dann über eine Registry zur Verfügung. Dies ist beispielsweise auch dann notwendig, wenn Updates für das verwendete Image vorliegen.
Als Format für das Disk-Image können Sie entweder RAW, QCOW2, VMDK oder ISO verwenden. Amazon Machine Images (AMI) werden ebenfalls unterstützt, bleiben in diesem Beispiel aber außen vor. In jedem Fall benötigen Sie zuerst immer ein sogenanntes bootc-Basis-Image. Hierbei handelt es sich um ein spezielles Container-Image, das neben dem Kernel und dem systemd-Service noch weitere Komponenten für ein bootfähiges System enthält. Ein solches Basis-Image steht für Fedora-, CentOS- und Red-Hat-Enterprise-Linux-Systeme zur Verfügung. Das folgende Beispiel zeigt, dass die entsprechenden Komponenten in dem Image enthalten sind:
# podman run --rm -it quay.io/centos-bootc/centos-bootc:stream9 rpm -q kernel systemd podman bootc
kernel-5.14.0-467.el9.aarch64
systemd-252-37.el9.aarch64
podman-5.1.0-1.el9.aarch64
bootc-0.1.11-2.el9.aarch64
Da ein solches Image standardmäßig keinen Benutzer enthält, können Sie diesen über eine Konfigurationsdatei im TOML-Format einfach hinzufügen und dem Benutzer direkt einen SSH-Schlüssel sowie einer Gruppe zuweisen:
[[customizations.user]]
name = "tscherf"
password = "Secret23"
key = "ssh-rsa AAA ... tscherf@domain.com"
groups = ["wheel"]
Den eigentlichen Build-Vorgang für ein CentOS-Stream-9-Image starten Sie dann wie folgt:
# podman run \
    --rm \
    -it \
    --privileged \
    --pull=newer \
    --security-opt label=type:unconfined_t \
    -v $(pwd)/config.toml:/config.toml \
    -v $(pwd)/output:/output \
    -v /var/lib/containers/storage:/var/lib/containers/storage \
    quay.io/centos-bootc/bootc-image-builder:latest \
    --type qcow2 \
    --local \
quay.io/centos-bootc/centos-bootc:stream9
In diesem Beispiel nutzen wir also als bootc-Basis-Image "centos-bootc:stream9" und übergeben dieses an den bootc-image-builder-Service. Das fertige Disk-Image soll dann als Format QCOW2 verwenden. Hat alles geklappt, liegt das neue Image nach einiger Zeit im Verzeichnis "output" vor.
Image booten
Um das soeben erzeugte Disk-Image zu Testzwecken einmal zu booten, können Sie auf eine Virtualisierungssoftware wie beispielsweise libvirt zurückgreifen. Das folgende Beispiel verwendet hierfür virt-install, das auf libvirt basiert:
# virt-install \
   --name bootc \
   --memory 4096 \
   --vcpus 2 \
   --disk qcow2/disk.qcow2 \
--import
Podman Desktop als grafisches Frontend
Als Alternative zum Build-Vorgang innerhalb eines Terminals können Sie natürlich auch Podman Desktop einsetzen. Das Werkzeug stellt eine bootc-Erweiterung zur Verfügung und kümmert sich dann selbstständig darum, ein neues bootfähiges Container-Image für Sie zu generieren.
Hierfür drücken Sie den "Build"-Knopf und wählen dann einfach das gewünschte bootc-Basis-Image aus dem Pull-down-Menü sowie das gewünschte Image-Format aus. Das Tool kümmert sich dann selbstständig darum, den Image Builder Service innerhalb eines Containers zu starten und dort dann das neue Image zu erzeugen. Auch hier gilt natürlich, dass Sie das bootc-Basis-Image im Vorfeld nach den eigenen Vorstellungen anpassen können, bevor Sie hieraus ein bootfähiges Disk-Image erzeugen. Das Listing "Container-File" zeigt ein Beispiel für den Betrieb eines Webservers.
Listing: Container-File
### Ein einfaches Container-File um einen Webserver innerhalb eines bootc-Containers zu betreiben.
FROM quay.io/centos-bootc/centos-bootc:stream9
RUN dnf -y install httpd && \    systemctl enable httpd && \    mv /var/www /usr/share/www && \    fed -ie 's,/var/www,/usr/share/www,'
 /etc/httpd/conf/httpd.conf
RUN rm -rf /usr/share/httpd/noindex
COPY index.html /usr/share/www/html
EXPOSE 80
Fazit
Container-Images für Apps sind nichts Neues, aber was ist mit startfähigen Betriebssystemen? Mithilfe von bootc-Container-Images und dem bootc-Image-Builder-Service erzeugen Sie fix bootfähige Container-Images für Ihr gewünschtes OS. In diesem Open-Source-Tipp haben wir Ihnen gezeigt, mit welchen Schritten Sie das bewerkstelligen. Damit verwenden Sie Ihren containerbasierten Workflow nicht mehr nur für Ihre Applikationen, sondern auch Ihre Betriebssysteme. Weitere Informationen zu dieser neuen Deployment-Methode für Betriebssysteme finden Sie auch auf der Image-Mode-Seite von Red Hat [5].
(dr)
Link-Codes
[1] bootc-GitHub-Repository: https://github.com/containers/bootc
[3] Podman Desktop: https://podman-desktop.io/