staging.inyokaproject.org

2025 Woche 05

2. Februar 2025

Gestern war wieder der „Änder-dein-Passwort-Tag“. Früher war das Standard. Wer heute noch in einer Firma arbeitet, die das erzwingt, weiß, dass er eine unfähige IT-Abteilung hat. Aber so ein Tag ist eine gute Gelegenheit, sich zu fragen, ob man Passwörter überhaupt noch braucht.

Warum kein Passwort?

Die Kombination aus Benutzername/E-Mail-Adresse und Passwort ist nach wie vor das Rückgrat der Kontosicherheit im Internet. Dieses Prinzip ist jedoch sehr anfällig. Ist das Passwort zu einfach, kann es schnell geknackt werden. Ist das Passwort zu schwer, kann man es sich schlecht merken. Deshalb verwenden viele Menschen immer dasselbe Passwort. Auch deshalb sind Datenlecks so gefährlich. Die Voraussetzung eines einzigen Sicherheitsfaktors („Wissen“) ermöglicht zudem Phishing-Angriffe.

Passwortmanager sind ein Hilfsmittel, um den Passwort-Zoo überschaubar zu halten. Nur so können individuelle und sichere Passwörter für alle Accounts verwendet werden. Die Sicherheit dieser Passwortmanager hängt jedoch vom sicheren Master-Passwort ab. Außerdem haben Passwortmanager das „alle Eier in einem Korb“-Problem.

Vor einigen Jahren kamen daher Hardware-Schlüssel wie der Yubikey oder der Nitrokey auf. Damit sollten einfachere PINs (Faktor „Wissen“) mit einem externen Sicherheitsschlüssel (Faktor „Besitz“) kombiniert werden. Ich habe hier auch damit gespielt. Sie haben sich nur nie durchgesetzt. Man kann damit ein paar kritische Dienste absichern, aber Reichweite bekommen die nicht. Ich würde daher darauf nicht mehr setzen.

Das einzige verbreitete Hilfsmittel sind zusätzliche Einmalpasswörter auf der Basis von TOTP. Diese werden in der Regel mit einer App auf dem Smartphone generiert und ergänzen den Faktor „Besitz“ um den Faktor „Wissen“, den das Passwort erfordert. Viele Menschen empfinden dies als lästig, weshalb TOTP oft erst dann genutzt wird, wenn Diensteanbieter massiv darauf hinweisen oder es gar erzwingen.

Was sind Passkeys?

Was geblieben ist, ist die FIDO-Allianz als Standardisierungsgremium für Passwortalternativen. Diese hat mit FIDO2 inzwischen einen Standard geschafft, der mit einigen Anpassungen unter dem Marketingbegriff Passkey oder auch passwortloses Anmelden bekannt wurde. Das System wurde benutzerfreundlicher gemacht und anstelle von zusätzlichen Hardwaredongeln wird mit dem Smartphone ein Gerät verwendet, das man sowieso besitzt.

Passkeys basieren auf dem bewährten Prinzip der getrennten Schlüssel. Es gibt einen öffentlichen Schlüssel, der dem Dienstanbieter bekannt ist, und einen geheimen Schlüssel im internen Speicher, der für die Anmeldung benötigt wird. Dies hat mehrere Vorteile gegenüber Passwörtern:

  • Passkeys sind nie unterkomplex
  • Passkeys können nicht vergessen werden
  • Passkeys können nicht einfach durch Phishing abgegriffen werden
  • Passkeys werden immer individuell für einen Account erstellt.

Passkeys beheben also die schlimmsten Schwächen von Passwörtern. Gleichzeitig machen sie Krücken wie TOTP überflüssig, da der Faktor „Besitz“ – also des vertrauenswürdigen Endgerätes – den Passkeys immanent ist.

Funktionsweise

Das Konzept sah ursprünglich das Smartphone als zentrales Medium zur Generierung und Verwaltung von Passkeys vor. Das war konzeptionell klug gedacht, weil die meisten Menschen ein Smartphone haben und Banking Apps sowie TOTP bereits bei den Menschen verankert hat, dass Smartphones für so etwas geeignet sind.

Smartphones wurden aber vor allem deshalb gewählt, weil sie spezielle Sicherheitschips (z.B. Secure Enclave beim iPhone, Titan M beim Pixel) enthalten und die Betriebssysteme Android und iOS diese sinnvoll nutzen können. Nur so können Passkeys sicher gespeichert werden. Hier ist keine Synchronisation und keine proprietäre Cloud notwendig. Eine Anmeldung an Webseiten mit Passkey-Authentifizierung ist natürlich auch am Desktop möglich, setzt dann aber in diesem Konzept eine Freischaltung am Smartphone voraus. Zur Identifizierung ist entweder eine PIN oder ein biometrischer Abgleich notwendig. Also nichts, was moderne Smartphone-Nutzer nicht ohnehin schon kennen.

Moderne Desktop-Hardware für macOS und Windows kann Passkeys auch auf dem Desktop erzeugen und speichern. Das funktioniert schon Out-of-the-Box. Apple und Google (Android & Chrome) bieten in ihren Softwarelösungen eine cloudbasierte Synchronisation der Passkeys an. Dadurch sind Smartphones und Desktop synchron und es braucht kein Smartphone für die Freigabe auf dem Desktop. Auch Microsoft arbeitet an einer entsprechenden Lösung für Windows Hello. Auch hier ist eine biometrische Freigabe erforderlich. Moderne Hardware ist in der Regel mit Fingerabdruck- oder Gesichtserkennungsverfahren kompatibel und kann dafür genutzt werden. Das schließt andere Browser nicht aus. Firefox bietet ebenfalls Passkey-Unterstützung für Windows und macOS, nutzt dafür aber die entsprechenden Betriebssystemfunktionen (Apple Passwörter / Windows Hello).

Für Linux ist keine Out-of-the-Box-Implementierung integriert. Es sind auch keine Pläne bekannt, die Passwortspeicher entsprechend zu erweitern. Da es keine Linux-Smartphones gibt, ist das auch nicht weiter dramatisch. Nutzer können einfach auf Android ausweichen und darüber Passkeys erzeugen und freigeben. Will man Passkeys ohne Smartphone erzeugen und nutzen, benötigt man zusätzlich einen modernen Passwortmanager wie KeePassXC (ab Version 2.7.7.) und das entsprechende Firefox-Addon. Leider hat Linux auch hier Sicherheitsdefizite, da standardmäßig kein TPM zur Absicherung verwendet wird und biometrische Verfahren nicht sicher gespeichert werden können. Die KeePass-Datenbank sollte daher unbedingt zusätzlich mit einer Schlüsseldatei oder einem Hardwareschlüssel geschützt werden. Auch wenn dies die Vorteile von Passkeys wieder zunichte macht. Linux und Sicherheit ist leider keine einfache Sache mehr.

Ich habe gelesen dass…

Passkeys sind neu und Passwörter alt. Bornierte Alleshasser haben sich natürlich sofort darauf gestürzt. Da war anfangs sehr viel Halb- oder Unwahrheit im Unlauf und hat den Start von Passkeys zumindest in Deutschland massiv beeinträchtigt. Beliebte Angriffspunkte sind die Cloud-Sync-Funktion der großen Hersteller und die Bindung an ein Smartphone. Ersteres, weil die großen Hersteller böse sind und Smartphones gerne von Leuten als unsicher gebrandmarkt werden, die sie technisch nicht verstehen und die intime Kenntnis ihrer herkömmlichen Betriebssysteme mit Sicherheit verwechseln. Inzwischen ebbt die Pauschalkritikwelle aber ab und viele begreifen die Vorteile.

Wer auf solche Kommentare stößt, kann sie getrost ignorieren. Oft entlarven sie sich durch in diesen Kreisen beliebte Verballhornungen (Klaut, M$, Intelligenzphone etc.) selbst. Die Passkey-Synchronisation ist bei allen Anbietern durch zusätzliche Sicherheitsmaßnahmen wie Ende-zu-Ende-Verschlüsselung und die Speicherung auf dem Gerät zusätzliche Sicherheitsmodule wie TPM geschützt. Im direkten Vergleich zu Passwörtern haben Passkeys deutlich mehr Vorteile als Nachteile. Theoretisch überlegene Alternativen wie Yubikey sind leider an der Praxis gescheitert.

Fazit

Die Liste der Dienstanbieter, die Passkeys unterstützen wird stetig länger. Passkeys sind damit über jene Schwelle gekommen, die Hardwareschlüssel wie Yubikeys nie überschreiten konnten. Anstelle also sein Passwort zu ändern, sollte man prüfen, ob der Dienstanbieter nicht schon Passkeys unterstützt und diese anstelle nutzen.

31. Januar 2025

Mozilla hat Version 2.25 seiner VPN-Clients für das Mozilla VPN veröffentlicht. Dieser Artikel beschreibt die Neuerungen vom Mozilla VPN 2.25.

Mit dem Mozilla VPN bietet Mozilla in Zusammenarbeit mit Mullvad sein eigenes Virtual Private Network an und verspricht neben einer sehr einfachen Bedienung eine durch das moderne und schlanke WireGuard-Protokoll schnelle Performance, Sicherheit sowie Privatsphäre: Weder werden Nutzungsdaten geloggt noch mit einer externen Analysefirma zusammengearbeitet, um Nutzungsprofile zu erstellen.

Jetzt Mozilla VPN nutzen

Die Neuerungen vom Mozilla VPN 2.25

Das Update auf das Mozilla VPN 2.25 bringt keine neuen Funktionen, sondern vor allem Fehlerbehebungen und Verbesserungen unter der Haube. Die Option zum Starten des Mozilla VPNs mit Starten des Gerätes ist auf Desktop-Systemen jetzt standardmäßig aktiv. Das Adjust-SDK zwecks Kampagnenmessung wird nicht länger genutzt. Für Nutzer eines Smartphones oder Tablets von Apple ist iOS 15 die neue Mindestanforderung.

Der Beitrag Mozilla VPN 2.25 veröffentlicht erschien zuerst auf soeren-hentzschel.at.

30. Januar 2025

Solo ist ein Website-Builder von Mozilla, der auf Künstliche Intelligenz (KI) und einen maximal einfachen Erstellungsprozess setzt. Nun steht Solo 1.5 bereit und bringt viele Neuerungen.

Im Rahmen der Innovation Week im Dezember 2023 hatte das Mozilla Innovation Studio Solo angekündigt. Dabei handelt es sich um einen sogenannten Website-Builder mit Fokus auf Selbständige, der auf generative Künstliche Intelligenz für einen maximal einfachen Erstellungsprozess setzt.

Jetzt Website-Builder Solo von Mozilla testen

Seit dem Start hat Mozilla einige Funktionen ergänzt. Jetzt hat Mozilla Solo 1.5 fertiggestellt. Die vollständigen Release Notes:

  • Exportieren von CSV-Dateien aller Kontaktformulare und Newsletter-Einträge
  • Neuer Share-Button, um Ihre Website über einen Link oder in sozialen Netzwerken zu teilen
  • Neuer Abschnitt „Code einbetten“ zum Einbetten von benutzerdefinierten Audio, Video oder anderen Anwendungen
  • Unterstützung für mobiles Onboarding
  • Neue Google Safe URL-Erkennung beim Erstellen von Links auf Ihrer Website
  • Link zu den Abschnitten Textbanner, Bildbanner und Code-Einbettung
  • Hinzufügen einer Schaltfläche „Ablehnen“ auf dem Cookie-Banner, falls aktiviert
  • Mobile und Desktop-Vorschau Ihrer Website anzeigen
  • Weitere allgemeine Fehlerbehebungen und Aktualisierungen

Die Nutzung von Solo ist kostenlos. Geringe Kosten fallen höchstens bei Verwendung einer benutzerdefinierten Domain an. Als Nächstes stehen weitere Optionen zum Bearbeiten und Gestalten, ein Abschnitt für Kundenlogos sowie eine neue Bibliothek zur Verwendung von Icons auf der Website auf der Roadmap.

Zukünftig wird Solo außerdem im Abschnitt „Mehr von Mozilla“ in den Firefox-Einstellungen beworben werden.

Der Beitrag Website-Builder Solo von Mozilla: Version 1.5 fertiggestellt erschien zuerst auf soeren-hentzschel.at.

29. Januar 2025

Mit dem Programm Ollama könnt ihr Large Language Models (LLMs) wie DeepSeek oder Mistral lokal auf eurem PC oder Laptop installieren und laufen lassen. Dabei nimmt euch Ollama die meiste Arbeit ab.

Installation

Unter https://ollama.com/download könnt ihr Versionen für macOS, Windoof und Linux herunterladen. Unter Archlinux erfolgt die Installation per

sudo pacman -S ollama

Wenn Ollama nicht in eurem Repository vorhanden ist, könnt ihr diesen Befehl verwenden:

curl -fsSL https://ollama.com/install.sh | sh

Nach der Installation kann Ollama per systemd gesteuert werden:

sudo systemctl enable ollama.service
sudo systemctl start ollama.service

Speicherort anpassen

Um den Speicherort für die Modelle festzulegen, könnt ihr die Servicedatei /etc/systemd/system/ollama.service wie folgt anpassen (bei mir soll alles unter dem Pfad /media/SILO/Ollama abgelegt werden)

[Unit]
Description=Ollama Service
After=network-online.target

[Service]
ExecStart=/usr/bin/ollama serve
WorkingDirectory=/media/SILO/Ollama
Environment="HOME=/media/SILO/Ollama"
Environment="OLLAMA_MODELS=/media/SILO/Ollama/models"
User=ollama
Group=ollama
Restart=always
RestartSec=3

[Install]
WantedBy=default.target

Modelle installieren

Sobald Ollama gestartet ist, können die Modelle wie folgt installiert werden:

ollama pull MODELLNAME

Den MODELLNAMEN erhaltet ihr von der Ollama-Homepage https://ollama.com/search. Dort findet ihr das DeepSeek-R1-Modell unter https://ollama.com/library/deepseek-r1. Die Modelle sind jeweils in verschiedenen Varianten verfügbar, z.B. 1.5b, 7b, 14b, 70b. Hierbei handelt es sich um die Parameter, die das Modell verwendet (das b steht für Milliarden). Je kleiner die Zahl, desto “abgespeckter” ist die Version. Je größer die Zahl ist, desto krasser muss eure Hardware sein, damit das Modell nicht Tage benötigt, um zu antworten. Startet am besten mit der kleinsten Zahl, und wenn das gut läuft, dann nehmt die nächst höhere Zahl. Auf einem halbwegs aktuellem Laptop sollten die 7b-Versionen gut laufen.

Ihr installiert das konkrete Modell, indem ihr die Variante per Doppelpunkt an den MODELLNAMEN anhängt. Für DeepSeek-R1 in der Variante 7b lautet der Befehl:

ollama pull deepseek-r1:7b

Ihr könnt auch Modelle von HuggingFace verwenden, z.B. die abliterated Version von DeepSeek von huihui:

ollama pull huihui_ai/deepseek-r1-abliterated:14b

Modell benutzen

Eine Übersicht eurer installierten Modelle erhaltet ihr mittels

ollama list
NAME                                     ID              SIZE      MODIFIED       
deepseek-r1:7b                           0a8c26691023    4.7 GB    2 minutes ago     
llama2-uncensored:7b                     44040b922233    3.8 GB    53 minutes ago    
deepseek-r1:14b                          ea35dfe18182    9.0 GB    55 minutes ago    
huihui_ai/deepseek-r1-abliterated:14b    6b2209ffd758    9.0 GB    57 minutes ago 

Um eines dieser Modelle zu starten, gebt ihr ein:

ollama run MODELLNAME

Also zum Beispiel

ollama run deepseek-r1:7b

oder

ollama run huihui_ai/deepseek-r1-abliterated:14b

Der Promt startet, und ihr könnt eure Eingabe machen. Das interessante bei DeepSeek-R1 ist, dass ihr den Reasoning-Prozess verfolgen könnt. Zwischen den tags könnt ihr mitlesen, wie das Modell “nachdenkt”.

DeepSeek-R1 denkt nach, und ja, ich habe mich im ersten Prompt vertippt…

Fazit

Ollama macht es mir super einfach, verschiedene Modelle zu installieren und zu nutzen. Und es ist echt interessant, dem “thinking” zuzuschauen.

Generell ist es sowieso immer besser, seine lokale “KI” zu befragen, statt den Datenkraken die Infos einzuwerfen.

Weblinks



 

Bislang erhält Thunderbird nur ein großes Update pro Jahr. Ab diesem März wird es auf Wunsch Feature-Updates im Monats-Takt geben, wie man es bereits von Firefox kennt.

Bereits vor knapp zwei Jahren hatte ich zum ersten Mal darüber berichtet, dass MZLA plant, einen monatlichen Release-Zyklus für Feature-Updates einzuführen, wie man es auch von Firefox kennt. Nun ist es soweit: Ab März 2025 mit Veröffentlichung von Thunderbird 136 werden die monatlichen Feature-Updates zum Standard.

Doch was bedeutet das genau? Neue Nutzer, welche sich Thunderbird über die Website herunterladen wollen, werden ab dann standardmäßig die Version von Thunderbird erhalten, welche dem neuen Release-Modell folgt. Für bestehende Nutzer ändert sich nichts. Wer derzeit Thunderbird auf dem sogenannten ESR-Kanal nutzt und damit ein Feature-Update pro Jahr und dazwischen lediglich Sicherheits- und Bugfix-Updates erhält, wird weiterhin auf diesem Veröffentlichungskanal bleiben.

Für die Zukunft ist es denkbar, dass über Benachrichtigungen innerhalb von Thunderbird ESR ein Wechsel der Thunderbird-Version beworben wird. Eine automatische Umstellung ist nicht geplant.

Mit Veröffentlichung von Thunderbird 136 wird sich dann auch die Berichterstattung auf diesem Blog ändern. Wie bei Firefox ESR werde ich nicht länger über neue Versionen auf dem ESR-Kanal berichten, sondern stattdessen ausschließlich über Updates auf dem Release-Kanal, der monatliche Feature-Updates bringt. Aber natürlich werde ich auch weiterhin über Sicherheits- und Bugfix-Updates auf dem neuen Release-Kanal berichten.

Der Beitrag Thunderbird: Monatliche Feature-Updates ab März 2025 Standard erschien zuerst auf soeren-hentzschel.at.

28. Januar 2025

Die MZLA Technologies Corporation hat mit Thunderbird 128.6.1 ein Update für seinen Open Source E-Mail-Client veröffentlicht.

Neuerungen von Thunderbird 128.6.1

Mit Thunderbird 128.6.1 hat die MZLA Technologies Corporation ein Update für seinen Open Source E-Mail-Client veröffentlicht. Die neue Version bringt mehrere Korrekturen für die Versionsreihe 128, welche sich in den Release Notes (engl.) nachlesen lassen.

Der Beitrag Thunderbird 128.6.1 veröffentlicht erschien zuerst auf soeren-hentzschel.at.

Da die Dokumentation für dieses Addon nicht mal die 3 einfachen Zeilen Erklärung enthält, die es benötigt, um sogar eine beidseitige Kommunikation zu ermöglichen, dokumentiere ich das wenigstens hier. Danke an der Stelle an Tobias.

Grafiken wegen Blog-Migration nicht vorhanden.

Folgendermaßen hat es bei mir geklappt

  1. Klicke in Friendica auf “Einstellungen” deines Accounts
  2. Wähle “Soziale Netzwerke” aus. Hier sollte jetzt “Bluesky Import/Export” auftauchen.
  3. Du solltest mindestens den ersten Punkt (1) “Bluesky Post Addon aktivieren” anhaken. Die anderen Punkte lies dir bitte SORGFÄLTIG durch.
  4. Dann gibst du bei (2) BlueSky Hendl deine vollständige BlueSkyAdresse an, z.B. @Fritze4711sinktechmal.bsky.social
  5. Und bei (3) “Bluesky App Passwort” gibst du das sichere Passwort ein, mit dem du dich bei BlueSky auch anmeldest, z.B. ®I"sü¢}Ì~cÈh¥¡Wâl5,¡ãÊËÓ»G5a|WmJmB7VÄä6ü®jÝwH"ÞÓ¼?Û{¾wµiùð]|KñZ·{ì¹q¶u|ÛYêZ8¨³¿¾áÑ8Âß228)Èb
    • Eventuell muss du das Passwort nehmen, das du bei Bluesky"Einstellungen->Privatsphäre und Sicherheit->App Paswords" kreieren lassen musst, um es dann hier im Import/Export einzutragen.
  6. Dann auf “Einstellung speichern” oder “Save Settings” klicken und wenn du das Passwort ordentlich eingegeben hast, dann geht die Sause auch schon los.

Da die Dokumentation für dieses Addon nicht mal die 3 einfachen Zeilen Erklärung enthält, die es benötigt, um sogar eine beidseitige Kommunikation zu ermöglichen, dokumentiere ich das wenigstens hier. Danke an der Stelle an Tobias.

Grafiken wegen Blog-Migration nicht vorhanden.

Folgendermaßen hat es bei mir geklappt

  1. Klicke in Friendica auf “Einstellungen” deines Accounts
  2. Wähle “Soziale Netzwerke” aus. Hier sollte jetzt “Bluesky Import/Export” auftauchen.
  3. Du solltest mindestens den ersten Punkt (1) “Bluesky Post Addon aktivieren” anhaken. Die anderen Punkte lies dir bitte SORGFÄLTIG durch.
  4. Dann gibst du bei (2) BlueSky Hendl deine vollständige BlueSkyAdresse an, z.B. @Fritze4711sinktechmal.bsky.social
  5. Und bei (3) “Bluesky App Passwort” gibst du das sichere Passwort ein, mit dem du dich bei BlueSky auch anmeldest, z.B. ®I"sü¢}Ì~cÈh¥¡Wâl5,¡ãÊËÓ»G5a|WmJmB7VÄä6ü®jÝwH"ÞÓ¼?Û{¾wµiùð]|KñZ·{ì¹q¶u|ÛYêZ8¨³¿¾áÑ8Âß228)Èb
    • Eventuell muss du das Passwort nehmen, das du bei Bluesky"Einstellungen->Privatsphäre und Sicherheit->App Paswords" kreieren lassen musst, um es dann hier im Import/Export einzutragen.
  6. Dann auf “Einstellung speichern” oder “Save Settings” klicken und wenn du das Passwort ordentlich eingegeben hast, dann geht die Sause auch schon los.

27. Januar 2025

Dieses Tutorial führt in den RHEL image mode ein und zeigt, wie ein solches Image in einer virtuellen Maschine (VM) installiert werden kann. Es wird ebenfalls gezeigt, wie ein installiertes Image aktualisiert und bei Bedarf zurückgerollt werden kann.

Während diese Einführung in Deutsch gehalten ist, liegen die Dokumentation und weitere verwendete Quellen ausschließlich in englischer Sprache vor.

Das Tutorial richtet sich in erster Linie an Sysadmins, die bereits Erfahrung mit dem Betrieb von RHEL oder einer verwandten Enterprise Linux Distribution haben. Es bietet keine allgemeine Einführung in die Installation und den Betrieb von Red Hat Enterprise Linux.

Zum Inhalt

Die folgende Liste bietet einen Überblick über den Inhalt:

Was ist der RHEL image mode?

RHEL image mode ist eine Technology Preview und stellt eine neue Methode dar, um RHEL zu konfigurieren, installieren bzw. deployen und zu verwalten.

Durch Nutzung von Container-Tools wird ein Container-Image erstellt, welches neben dem RHEL-Userland auch den RHEL-Kernel, Boot Loader, Firmware und Treiber umfasst. Dieses RHEL-Container-Image (auch RHEL Bootc Image genannt) kann anschließend genutzt werden, um RHEL im Datacenter oder in der Cloud – auf Bare-Metal-Servern, virtuellen Maschinen oder Edge-Geräten zu deployen. Das RHEL-Container-Image kann direkt als Container ausgeführt werden, um die Funktionalität zu testen. Für das Deployment kann das Container-Image in ein Disk-Image für die entsprechende Zielplattform konvertiert werden. Ein installiertes oder als Disk-Image provisioniertes System läuft anschließend nativ auf der Hardware bzw. in der virtuellen Maschine und wird dort nicht als Container ausgeführt.

Konsolidierung von Bereitstellungsprozessen

In vielen Unternehmen kommen heute neben klassischen virtuellen Maschinen auch Linux-Container zum Einsatz. RHEL image mode bietet die Möglichkeit, Bereitstellungsprozesse zu konsolidieren, indem für die Bereitstellung von RHEL-Images die gleichen Werkzeuge genutzt werden, wie für die Bereitstellung von Container-Images für Anwendungen.

Immutable RHEL

Mit Ausnahme von /etc und /var ist das Wurzel-Dateisystem in RHEL image mode immutable (read-only).

Anwendungen und Updates werden durch aktualisierte RHEL-Container-Images verteilt. Ein provisioniertes System lädt dazu das aktualisierte Image auf die lokale Festplatte und startet dieses nach einem Neustart. Im Fehlerfall kann durch einen weiteren Neustart einfach das vorherige Image gestartet werden. So können fehlgeschlagene Updates einfach zurückgerollt werden.

Dies bietet dem Admin die Sicherheit, bei Bedarf zum vorherigen Zustand zurückkehren zu können, ohne dafür auf VM-/Storage-Snapshots oder andere Mechanismen außerhalb des Betriebssystems zurückgreifen zu müssen.

Deklarative Konfiguration des Betriebssystems

RHEL image mode macht es einfach, zu konfigurieren und zu verfolgen, welche Pakete in einem Basis-Image enthalten sind und wann welche Pakete hinzugefügt wurden.

Red Hat veröffentlicht in der Container-Registry registry.redhat.io RHEL Bootc Base Images, welche die Basis für eigene Images darstellen. Zu jeder Version wird eine Liste der enthaltenen Pakete veröffentlicht. Diese ist über den Red Hat Ecosystem Catalog einsehbar:

Ansicht der Paketliste eines RHEL 9 Bootc Base Image

Hier ist zu beachten, dass obwohl amd64 als Architektur ausgewählt wurde, die Liste Pakete aller verfügbaren Architekturen zeigt. Natürlich sind im Basis-Image nicht 2302 Pakete enthalten. Die Filtermöglichkeiten und die Ergebnisliste zeigen leider unerwartete Ergebnisse. Ich habe dies bereits intern gemeldet und hoffe, dass sich bald jemand der Sache annimmt.

Das in obiger Abbildung gezeigte Image enthält für die amd64-Architektur 441 Pakete. Vergleiche ich dies mit zwei meiner RHEL 9 Installationen, die auf der Minimalinstallation basieren, so umfassen diese 591 bzw. 510 Pakete. Der Vergleich hinkt allerdings, da ich auf den RHEL package mode Installationen bereits weitere Software nachinstalliert habe. Ich bin jedoch erfreut, dass das Basis-Image nicht mehr Pakete als eine Minimalinstallation enthält.

Pakete, die zusätzlich hinzugefügt werden sollen, werden im Containerfile aufgeführt, welches üblicherweise einer Versionskontrolle unterliegt. Änderungen können so jederzeit nachvollzogen werden.

Weitere Informationen bietet das Kapitel 1 in Using image mode for RHEL to build, deploy, and manage operating systems.

Voraussetzungen

Um die in diesem Tutorial gezeigten Schritte selbst ausführen zu können, werden folgende Dinge benötigt:

  • Ein registriertes RHEL 9 System
    • mit einer beliebigen RHEL Subskription,
    • dem installierten Meta-Paket container-tools
  • Zugriff auf registry.redhat.io
  • Eine virtuelle Maschine oder einen Rechner, auf dem RHEL image mode installiert werden kann

Falls ihr gerade keine geeignete Laborumgebung zur Verfügung habt, könnt ihr den Image Mode auch in diesen interaktiven Labs ausprobieren:

Meine Laborumgebung

Meine Laborumgebung besteht aus zwei virtuellen Maschinen, welche auf einem Laptop ausgeführt werden. Beide VMs verfügen über 2 vCPU, 8 GB RAM und 40 GB Speicher.

Auf VM 1 werden folgende Tätigkeiten ausgeführt:

  • Erstellung und Ausführung einer einfachen Container-Registry
  • Erstellung und Pflege eines oder mehrerer rhel-bootc-Container-Images
  • Erstellung von Disk-Images

Anhand von VM 2 werden folgende Dinge demonstriert:

  • Installation von RHEL image mode
  • Aktualisierung der Installation
  • Wechsel des verwendeten Images
  • Rollback

Die in diesem Tutorial verwendeten Containerfiles, Dateien und Skripte habe ich in einem Git-Repository gesammelt. Fühlt euch frei, die dortigen Dateien auf eigene Gefahr für eigene Versuche zu verwenden. Repository-URL: https://github.com/tronde/image-mode-demo

RHEL Bootc Image erstellen

Dieser Abschnitt wurde aus Kapitel 2 der Dokumentation Using image mode for RHEL to build, deploy, and manage operating systems abgeleitet. In ihm wird das RHEL-Container-Image erstellt, welches im nächsten Schritt für das Deployment in einer VM vorbereitet wird. Dieser Abschnitt behandelt folgende Schritte:

  1. Containerfile(5) erstellen
  2. Container-Image mit podman-build(1) erstellen
  3. Container-Image auf dem Build-System testen

Containerfile

Mit dem folgenden Containerfile(5) wird konfiguriert, wie das RHEL Bootc Base Image ‚rhel-bootc:9.5‚ angepasst werden soll:

$ cat Containerfile 
FROM registry.redhat.io/rhel9/rhel-bootc:9.5
ADD index.html /var/www/html/index.html
RUN dnf -y install httpd \
    openssh-server \
    bind-utils \
    net-tools \
    chrony \
    vim-enhanced \
    man-pages \
    strace \
    lsof \
    tcpdump \
    bash-completion && \
    dnf clean all
RUN systemctl enable httpd sshd
  1. Es wird eine index.html-Datei hinzugefügt
  2. Die installierten Pakete werden aktualisiert
  3. Weitere Pakete werden installiert
  4. Der DNF-Paket-Cache wird entfernt
  5. Die Dienste httpd und sshd werden aktiviert, damit sie nach dem Boot-Vorgang automatisch starten

Die im Containerfile aufgeführten Pakete sind eine persönliche Auswahl, die ich gern auf meinen Systemen habe. Ihr könnt hier natürlich die Pakete eurer Wahl eintragen.

Für dieses Tutorial installiere ich den Dienst httpd. Das von dem Image provisionierte System wird also einen Webserver hosten. Dass ich die index.html-Datei ebenfalls dem Image hinzufüge, soll mir lediglich den späteren Test in diesem Tutorial vereinfachen. Je nach Aufbau, Inhalt und Änderungsrate der auszuliefernden Webseite bzw. Webanwendung ist es nicht sinnvoll, diese in das Image zu integrieren.

Build

Login registry.redhat.io

Bevor das erste Container-Image erstellt werden kann, ist eine Anmeldung an der Container-Registry registry.redhat.io notwendig:

$ podman login registry.redhat.io
Username: alice
Password: 
Login Succeeded!

Weitere Unterstützung zur Anmeldung bietet: Red Hat Container Registry Authentication

Image erstellen

Mit dem folgenden Befehl kann nun ein Image aus obigen Containerfile erstellt werden:

$ time podman build -t localhost/rhel9.5-bootc:test .
…
Successfully tagged localhost/rhel9.5-bootc:test
c958185aa4c578af37b5bca796c7c5e50a270f7b7de38126c31fa6ab97046f41

real    2m52.574s
user    2m31.787s
sys     0m59.680s
$ podman images
REPOSITORY                                  TAG               IMAGE ID      CREATED         SIZE
localhost/rhel9.5-bootc  test              c958185aa4c5  40 seconds ago  1.68 GB
registry.redhat.io/rhel9/rhel-bootc         9.5               7cf5466a7756  2 days ago      1.56 GB

Das Container-Image wird unter dem Namen localhost/rhel9.5-bootc:test im lokalen Dateisystem gespeichert.

Der Build-Vorgang dauerte insgesamt knapp 3 Minuten. Darin ist die Zeit zum Herunterladen des Basis-Image registry.redhat.io/rhel9/rhel-bootc:9.5 enthalten. Ist dieses Image bereits vorhanden, dauert der Build-Vorgang nur knapp über 1 Minute.

Test

Der nun folgende Code-Block zeigt, wie das soeben erstellte Container-Image mit Podman im interaktiven Modus gestartet werden kann. Es wird geprüft, ob die index.html-Datei vorhanden ist und wie viele Pakete das Image enthält.

$ podman run -it --rm --name mybootc localhost/rhel9.5-bootc:test /bin/bash
bash-5.1# ls -l /var/www/html
total 4
-rw-r--r--. 1 root root 342 Jan 11 11:20 index.html
bash-5.1# rpm -qa | wc -l
465
bash-5.1#

Als nächste teste ich, ob die index.html-Datei auch ausgeliefert wird:

$ podman run -d --rm -p 127.0.0.1:8888:80 --name mybootc localhost/rhel9.5-bootc:test 
fa9c1f5110cd58c3f28760fb5a5d69cdc4595a5cba2f29ff67f85eaa076204ab
$ curl http://127.0.0.1:8888
<!DOCTYPE html>
<html lang="de">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Bootc Demo Page</title>
  </head>
  <body>
                <p>Diese Seite wird von einem Webserver ausgeliefert, der mit RHEL Bootc Image Mode bereitgestellt wurde.</p>
  </body>
</html>

Test erfolgreich! Die konfigurierte Webseite wird wie erwartet ausgeliefert. Der Container wird mit podman stop mybootc gestoppt und der Test ist beendet.

Zwischenfazit

Bis hier wurde ein Containerfile erstellt, welches das zu verwendende Basis-Image, die zusätzlich zu installierenden Pakete und die auszuführenden Dienste definiert. Mit Hilfe dieses Containerfiles und Podman wurde anschließend das Container-Image localhost/rhel9.5-bootc:test erzeugt. Mit einem einfachen Test konnte auf dem Build-System verifiziert werden, dass die index.html-Datei wie gewünscht ausgeliefert wird.

Das Image enthält keinerlei Passwörter oder SSH-Schlüssel. Es sind somit bisher keinerlei Geheimnisse enthalten, die mit dem Image verloren gehen könnten.

Verglichen mit einer klassischen RHEL-Minimalinstallation, die als Basis für ein Golden-Image dient, konnte der Vorgang deutlich schneller abgeschlossen werden.

ISO-Image mit dem bootc-image-builder erstellen

Der bootc-image-builder ist eine Container-Variante des RHEL Image Builder. Mit diesem wird in den folgenden Schritten ein ISO-Image aus dem zuvor erstellten Container-Image erzeugt. Mit dem ISO-Image wird anschließend eine Installation in einer VM durchgeführt.

Mit dem bootc-image-builder können auch Disk-Images wie AMI, GCE, QCOW2, RAW und VMDK erzeugt werden. Ich habe mich für ISO entschieden, da dies am vielseitigsten verwendbar ist. Man kann damit VMs unter KVM/Qemu und VMware genauso installieren, wie Bare-Metal-Server.

Benutzer, Passwort und SSH-Schlüssel hinzufügen

Um sich nach der Installation interaktiv am System anmelden zu können, werden dem ISO-Image ein Benutzer mit Passwort und SSH-Schlüssel hinzugefügt. Dafür wird die folgende Datei toml.config genutzt:

$ cat config.toml 
[[customizations.user]]
name = "alice"
password = "changeme"
key = "ssh-ed25519 AAAAC3NzaC…cr alice@example.com"
groups = ["wheel"]

Durch Hinzufügen des Benutzers zur Gruppe wheel darf dieser privilegierte Kommandos mittels sudo ausführen.

Das Container-Image in den passenden Benutzerkontext kopieren

Das Image localhost/rhel9.5-bootc:test wurde mit einem rootless-Benutzer erstellt. Der Befehl im folgenden Abschnitt muss jedoch mit root-Rechten ausgeführt werden. Rootful-Podman kann jedoch nicht auf das Image zugreifen, welches wir mit rootless-Podman erstellt haben. Der Vorgang würde fehlschlagen mit der Meldung: Error: localhost/rhel9.5-bootc:test: image not known.

Um dies zu verhindern, gibt es zwei Möglichkeiten. Möglichkeit 1 bietet sich an, wenn man das ISO-Image auf dem gleichen System wie das Container-Image erzeugen möchte. Hierbei wird das Container-Image einfach in den passenden Benutzerkontext kopiert. Die zweite Möglichkeit besteht darin, das Container-Image in eine Container-Registry zu pushen, aus der es dann im nächsten Schritt wieder gepullt werden kann.

Möglichkeit 1

Das Container-Image wird mit folgendem Befehl aus dem Kontext des Benutzers ‚alice‘ in den Kontext des Benutzers ‚root‘ kopiert.

$ podman image scp alice@localhost::rhel9.5-bootc:test
…
$ sudo podman images
REPOSITORY                                    TAG         IMAGE ID      CREATED         SIZE
localhost/rhel9.5-bootc                       test        fb6237fff684  21 minutes ago  1.68 GB

Wird kein Ziel-Benutzer spezifiziert, wird root als Ziel angenommen. Weitere Informationen zur Verwendung dieses Befehls bietet podman-image-scp(1) und der Artikel: How Podman can transfer container images without a registry?

Möglichkeit 2

Selbstverständlich kann das Container-Image auch in einer Container-Registry gespeichert und im root-Kontext von dort wieder heruntergeladen werden. Für die spätere Aktualisierung eines installierten RHEL image mode Systems ist die Nutzung einer Container-Registry von Vorteil.

How to implement a simple personal/private Linux container image registry for internal use beschreibt die Einrichtung einer einfachen Registry. Ich habe die auszuführenden Schritte in dem Skript create_simple_container_registry.sh zusammengefasst. Die zur Ausführung notwendigen Parameter werden in der Datei registry.vars konfiguriert. Diese Datei ist bereits mit Standardwerten gefüllt, die direkt verwendet werden können. Installiert und konfiguriert wird die Registry mit dem Kommando:

$ sudo bash create_simple_container_registry.sh

Ich trage die IP-Adresse und den Hostnamen meiner VM 1 in die Datei /etc/hosts ein, damit die Namensauflösung funktioniert. Der folgende Code-Block zeigt, wie das Image localhost/rhel9.5-bootc in die Registry gepusht wird.

$ podman login --tls-verify=false vm1.example.com:5000
Username: registryuser
Password: 
Login Succeeded!
$ podman tag localhost/rhel9.5-bootc:test vm1.example.com:5000/rhel9.5-bootc:test
$ podman push --tls-verify=false jkastnin-tpp1-rhel9-podman-1:5000/rhel9.5-bootc:test
Getting image source signatures
…
Writing manifest to image destination

Die Option --tls-verfiy=false ist notwendig, da ein selbstsigniertes TLS-Zertifikat verwendet wird. Mit dem folgenden Befehl kann überprüft werden, ob sich das Image in der Registry befindet.

$ curl -k -u registryuser:registrypass https://vm1.example.com:5000/v2/_catalog
{"repositories":["rhel9.5-bootc"]}

Der bootc-image-builder in Aktion

Der folgende Code-Block zeigt, wie mit dem bootc-image-builder eine ISO-Datei erzeugt wird, die sich für eine RHEL-Installation in einer Offline-Umgebung eignet. Der Befehl muss mit sudo ausgeführt werden, da erweiterte Benutzerrechte erforderlich sind.

Da das Container-Image des bootc-image-builder noch nicht lokal vorliegt, muss zuerst ein Login bei registry.redhat.io erfolgen. Dies wurde weiter oben bereits für den rootless-Benutzer durchgeführt, muss für den rootful-Benutzer jedoch wiederholt werden, da Logins nicht zwischen verschiedenen Benutzerkontexten geteilt werden.

Achtung: Der folgende Befehl funktioniert nur, wenn das Image localhost/rhel9.5-bootc:test für root verfügbar ist. Dies kann durch eine der Methoden, die im vorherigen Abschnitt beschrieben wurden, sichergestellt werden. Ich habe in diesem konkreten Fall Möglichkeit 1 verwendet.

$ sudo podman login registry.redhat.io
Username: alice
Password: 
Login Succeeded!
$ mkdir output
$ time sudo podman run \
> --rm \
> -it \
> --privileged \
> --pull=newer \
> --security-opt label=type:unconfined_t \
> -v /var/lib/containers/storage:/var/lib/containers/storage \
> -v $(pwd)/config.toml:/config.toml \
> -v $(pwd)/output:/output \
> registry.redhat.io/rhel9/bootc-image-builder:latest \
> --type iso \
> --config /config.toml \
> --local \
> localhost/rhel9.5-bootc:test
…
real    22m31.407s
user    0m1.997s
sys     0m2.049s
$ ls -lh output/bootiso/
total 2.4G
-rw-r--r--. 1 root root 2.4G Jan 11 14:26 install.iso

Nun zur Erklärung des Ganzen:

  1. Der Login erfolgt, um das bootc-image-builder-Image herunterladen zu können
  2. Im Projektverzeichnis wird das Verzeichnis output erstellt, welches die ISO-Datei enthalten wird
  3. Nun folgt ein ziemlich langer Aufruf von podman run
    • Falls in registry.redhat.io eine neuere Version des bootc-image-builder gefunden wird, wird diese heruntergeladen und genutzt
    • bootc-image-builder muss mit erhöhten Rechten ausgeführt werden, weshalb die Ausführung mittels sudo und die Option --privileged erforderlich sind
    • Ort der config.toml und Verzeichnis für das ISO werden dem Container als Volume zugänglich gemacht
    • Mit --type iso wird festgelegt, dass eine ISO-Datei erstellt werden soll
    • Die Option --local gibt an, dass das lokal existierende Image localhost/rhel9.5-bootc.test verwendet und dies nicht aus einer Registry geholt werden soll

Dass der Vorgang ganze 22 Minuten dauerte, ist den 2 vCPU-Kernen und den 8 GB RAM meiner VM geschuldet. Während der Arbeitsspeicher gerade ausreichend war, dürften weitere CPU-Kerne den Vorgang deutlich beschleunigen.

Das nun erstellte ISO kann zur Installation in VM 2 verwendet werden.

Offline-Installation mit dem RHEL image mode

Das im vorherigen Abschnitt erstellte Disk-Image install.iso wird nun verwendet, um VM 2 zu installieren. Die Installation läuft wie eine normale unbeaufsichtigte Anaconda-Installation ab.

In der Datei toml.config wurde ein Benutzer mit einem SSH-Schlüssel spezifiziert, der nun zum Login in das neue System verwendet werden kann.

$ ssh -o StrictHostKeyChecking=no alice@vm2.example.com
Warning: Permanently added 'vm2.example.com' (ED25519) to the list of known hosts.

$ lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
loop0    7:0    0  7.1M  1 loop 
sr0     11:0    1  2.4G  0 rom  
zram0  251:0    0  7.8G  0 disk [SWAP]
vda    252:0    0   30G  0 disk 
├─vda1 252:1    0    1G  0 part /boot
├─vda2 252:2    0    1G  0 part [SWAP]
└─vda3 252:3    0   28G  0 part /var
                                /sysroot/ostree/deploy/default/var
                                /etc
                                /sysroot

$ $ mount | grep -E '"/"|var|sysroot|etc'
/dev/vda3 on /sysroot type ext4 (ro,relatime,seclabel)
composefs on / type overlay (ro,relatime,seclabel,lowerdir=/run/ostree/.private/cfsroot-lower::/sysroot/ostree/repo/objects,redirect_dir=on,metacopy=on)
/dev/vda3 on /etc type ext4 (rw,relatime,seclabel)
/dev/vda3 on /sysroot/ostree/deploy/default/var type ext4 (rw,relatime,seclabel)
/dev/vda3 on /var type ext4 (rw,relatime,seclabel)

$ less /usr/lib/systemd/system/bootc-fetch-apply-updates.service
[jkastnin@localhost ~]$ systemctl status httpd
● httpd.service - The Apache HTTP Server
     Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; preset: disabled)
     Active: active (running) since Tue 2025-01-14 15:29:07 UTC; 28min ago
       Docs: man:httpd.service(8)
   Main PID: 829 (httpd)
…

Da ich im Vorfeld keine genaueren Angaben gemacht habe, wurde der Datenträger automatisch partitioniert. Die Installation lässt sich durch Kickstart-Dateien steuern. Dazu wird der Inhalt der Kickstart-Datei in die Datei config.toml eingefügt. Siehe hierzu Kapitel 4.9. Using bootc-image-builder to build ISO images with a Kickstart file in der RHEL-Dokumentation.

Fazit nach der Installation von RHEL image mode

  • Mit rootless podman wurde ein rhel9.5-bootc:test Image erstellt
  • Mit dem bootc-image-builder wurde ein ISO-Image erstellt, welchem ein Benutzer mit Passwort und öffentlichem SSH-Schlüssel hinzugefügt wurde und welches sich für die Installation von Offline-Systemen eignet
  • Das ISO-Image wurde genutzt, um RHEL image mode in einer VM zu installieren
  • Test von Login und einiger weniger Kommandos
  • Der konfigurierte Webserver wird ausgeführt und liefert die kleine Beispielwebseite aus

Auf dem Weg hier her wurde erklärt, wie Container-Images mittels podman-image-scp(1) ohne Container-Registry zwischen Benutzerkontexten und Hosts kopiert werden können. Es wurde gezeigt, wie eine einfache Container-Registry betrieben und genutzt werden kann.

Weitere Möglichkeiten zum Deployment von RHEL Bootc Images finden sich in der Dokumentation in Chapter 6. Deploying the RHEL bootc images. Darin findet sich auch ein Abschnitt, wie man das RHEL bootc image aus einer Registry mithilfe von Anaconda und Kickstart installiert.

Systemupdate und Rollback

Zu den Aufgaben des IT-Betriebs gehört es, Betriebssysteme zu aktualisieren, ihre Konfiguration neuen Anforderungen anzupassen und im Fehlerfall die letzten Änderungen schnell rückgängig machen zu können. Diesen Aufgaben widmen sich die beiden folgenden Abschnitte.

Bootc Image Installation aktualisieren bzw. Konfiguration ändern

Während RHEL package mode Systeme zur Laufzeit mit DNF bzw. YUM aktualisiert werden und mit diesen Werkzeugen Software (de-)installiert wird, ist der Ablauf bei RHEL image mode Systemen anders:

  1. Das RHEL Bootc Image wird aktualisiert
  2. Das aktualisierte Container-Image wird in einer Registry verfügbar gemacht
  3. Das aktualisierte Image wird in den Staging-Bereich des laufenden RHEL image mode Systems geladen
  4. Durch einen Neustart wird das aktualisierte Image geladen
  5. Bei Bedarf, z.B. bei auftretenden Problemen, kann das vorherige Image geladen werden

Aktualisierung des RHEL Bootc Image

Ich möchte die Pakete lsof, strace und tcpdump doch nicht in meiner Standardinstallation haben und sie aus der existierenden Installation entfernen. Deshalb kommentiere die entsprechenden Zeilen aus:

$ cat Containerfile
FROM registry.redhat.io/rhel9/rhel-bootc:9.5
ADD index.html /var/www/html/index.html
RUN dnf -y install httpd \
    openssh-server \
    bind-utils \
    net-tools \
    chrony \
    vim-enhanced \
    man-pages \
#    strace \
#    lsof \
#    tcpdump \
    bash-completion && \
    dnf clean all
RUN systemctl enable httpd sshd

Als Nächstes wird ein neues Image erstellt und in die Registry gepusht. Diesmal verwende ich den Tag 0.0.1, um für den Verlauf dieses Tutorials leichter den Überblick zu behalten:

$ podman build -t vm1.example.com:5000/rhel9.5-bootc:0.0.1 .
STEP 1/4: FROM registry.redhat.io/rhel9/rhel-bootc:9.5
STEP 2/4: ADD index.html /var/www/html/index.html
--> Using cache eb262e01451d150d95636b3771ca8b5985155edd45bcfef838726002f910a411
…
Successfully tagged vm1.example.com:5000/rhel9.5-bootc:0.0.1
ce3ec0f5ae5af0d27415c76aed480bfda51d39d5aeffdd78c7c06e29907c3d46

$ podman push --tls-verify=false vm1.example.com:5000/rhel9.5-bootc:0.0.1

Das zu verwendende Image aus dem System heraus wechseln

Der nun folgende Schritt wird in dem laufenden RHEL image mode System in VM 2 ausgeführt. In der RHEL-Dokumentation ist dieser Schritt in Abschnitt 8.1. Switching the container image reference beschrieben.

Für diesen Schritt ist eine funktionierende Namensauflösung zwischen VM 1 und VM 2 erforderlich. In der Laborumgebung kann dies mithilfe der Datei /etc/hosts erfolgen. Da in der Registry ein selbstsigniertes Zertifikat verwendet wird und das Kommando bootc keine Option --tls-verify besitzt, muss eine insecure registry in VM 2 konfiguriert werden. Der folgende Codeblock zeigt den Inhalt der Datei, mit der die insecure registry konfiguriert wird:

~]# cat /etc/containers/registries.conf.d/001-labregistry.conf
[[registry]]
location="vm1.example.com:5000"
insecure=true

Da bootc auch nicht über ein Login-Kommando verfügt und keinen Zugriff auf die Login-Informationen von Podman hat, wird in VM 2 ein Pull-Secret für bootc konfiguriert. Dazu wird eine Zeichenkette bestehend aus Benutzername:Passwort in Base-64 kodiert und zusammen mit der Registry-URL in die Datei /etc/ostree/auth.json geschrieben. Der folgende Code-Block zeigt dies mit den Beispielwerten aus diesem Tutorial:

~]# echo -n "registryuser:registrypass" | base64 -w 0 ; echo
cmVnaXN0cnl1c2VyOnJlZ2lzdHJ5cGFzcw==

~]# cat /etc/ostree/auth.json 
{
	"auths": {
		"vm1.example.com:5000": {
			"auth": "cmVnaXN0cnl1c2VyOnJlZ2lzdHJ5cGFzcw=="
		}
	}
}

Es gibt verschiedene Möglichkeiten, das Pull-Secret zu hinterlegen:

  • Manuell, wie gerade gezeigt
  • Mit einer Automationslösung wie z.B. Ansible zur Laufzeit des Zielsystems
  • Bei der Erstellung des Disk-Images mit bootc-image-builder
  • Bei hinreichend gesicherter Container-Registry direkt im RHEL Bootc Image

Siehe für weitere Hinweise hierzu Abschnitt 11.2 bis 11.4 im Anhang Managing users, groups, SSH keys, and secrets in image mode for RHEL.

Nun können wir mit dem folgenden Befehl von Image vm1.example.com:5000/rhel9.5-bootc:test zu Image vm1.example.com:5000/rhel9.5-bootc:0.0.1 wechseln:

~]# bootc switch vm1.example.com:5000/rhel9.5-bootc:0.0.1
layers already present: 67; layers needed: 2 (37.5 MB)
Fetched layers: 35.74 MiB in 23 seconds (1.58 MiB/s)                                                                   Deploying: done (5 seconds)                                                                                        Pruned images: 1 (layers: 0, objsize: 0 bytes)
Queued for next boot: vm1.example.com:5000/rhel9.5-bootc:0.0.1
  Version: 9.20250109.0
  Digest: sha256:c3925bc5d9618e803a3164f8f87a16333e4bf274469e72075d5cb50cf8ac51d9

Nach dem Wechsel befindet sich das ab nun zu verwendende Image zunächst im Staging-Bereich des lokalen Systems und wird beim nächsten Neustart aktiviert. Der Befehl bootc status gibt dazu übersichtlich Informationen aus, welches Image gestaged ist und welches aktuell verwendet wird:

~]# bootc status
Current staged image: vm1.example.com:5000/rhel9.5-bootc:0.0.1
    Image version: 9.20250109.0 (2025-01-14 19:58:27.484294313 UTC)
    Image digest: sha256:c3925bc5d9618e803a3164f8f87a16333e4bf274469e72075d5cb50cf8ac51d9
Current booted image: localhost/rhel9.5-bootc:test
    Image version: 9.20250109.0 (2025-01-11 12:40:29.172146867 UTC)
    Image digest: sha256:eee2c8ea204615a9341f3747a6156c5b7bc208bbcf60f0a5bb28f142f6b0aa54
No rollback image present

Nach einem Neustart wird der Status mit bootc status erneut kontrolliert und wir sehen, dass nun das Image aus der Registry verwendet wird und das vorherige Image für ein Rollback vorgehalten wird:

~]$ sudo bootc status
No staged image present
Current booted image: jkastnin-tpp1-rhel9-podman-1:5000/rhel9.5-bootc:0.0.1
    Image version: 9.20250109.0 (2025-01-14 19:58:27.484294313 UTC)
    Image digest: sha256:c3925bc5d9618e803a3164f8f87a16333e4bf274469e72075d5cb50cf8ac51d9
Current rollback image: localhost/rhel9.5-bootc:test
    Image version: 9.20250109.0 (2025-01-11 12:40:29.172146867 UTC)
    Image digest: sha256:eee2c8ea204615a9341f3747a6156c5b7bc208bbcf60f0a5bb28f142f6b0aa54

Automatische Aktualisierungen und wie man sie deaktivieren kann

Auf RHEL image mode Systemen existiert ein systemd.timer(5), welcher automatische Updates anstößt. Folgender Code-Block zeigt die Timer- und Service-Unit in VM 2:

$ systemctl status --no-pager bootc-fetch-apply-updates.{timer,service}
● bootc-fetch-apply-updates.timer - Apply bootc updates
     Loaded: loaded (/usr/lib/systemd/system/bootc-fetch-apply-updates.timer; disabled; preset: disabled)
     Active: active (waiting) since Wed 2025-01-15 08:29:37 UTC; 1h 1min ago
      Until: Wed 2025-01-15 08:29:37 UTC; 1h 1min ago
    Trigger: Wed 2025-01-15 10:28:13 UTC; 57min left
   Triggers: ● bootc-fetch-apply-updates.service
       Docs: man:bootc(8)

Jan 15 08:29:37 localhost systemd[1]: Started Apply bootc updates.

○ bootc-fetch-apply-updates.service - Apply bootc updates
     Loaded: loaded (/usr/lib/systemd/system/bootc-fetch-apply-updates.service; static)
     Active: inactive (dead)
TriggeredBy: ● bootc-fetch-apply-updates.timer
       Docs: man:bootc(8)

Ein Blick in die Service-Unit verrät, was passiert, wenn diese getriggert wird:

$ cat /usr/lib/systemd/system/bootc-fetch-apply-updates.service
[Unit]
Description=Apply bootc updates
Documentation=man:bootc(8)
ConditionPathExists=/run/ostree-booted

[Service]
Type=oneshot
ExecStart=/usr/bin/bootc update --apply --quiet

Das Kommando hinter ExecStart=:

  1. Prüft, ob ein neues Image in der Container-Registry verfügbar ist (Prüfung efolgt auf Digest nicht auf Tag)
  2. Falls ein neues Image verfügbar ist, wird dieses gestaged
  3. Der Host wird automatisch neugestartet, um das neue Image zu laden

Möchte man Aktualisierungen durch andere Verfahren steuern, kann die automatische Aktualisierung wie folgt gestoppt werden:

$ systemctl mask bootc-fetch-apply-updates.timer

Rollback

Angenommen, das System soll auf das zuvor verwendete Conatiner-Image zurückgerollt werden. So kann man sich zuvor mit bootc status einen Überblick verschaffen, welches Image als Rollback-Image eingetragen ist:

$ sudo bootc status
Current staged image: jkastnin-tpp1-rhel9-podman-1:5000/rhel9.5-bootc:0.0.2
    Image version: 9.20250109.0 (2025-01-15 09:36:38.866194063 UTC)
    Image digest: sha256:e68453dd17a45ad9243139b5cbb0565bbd97aa2bcd5a230c41e44d295281f9a7
Current booted image: jkastnin-tpp1-rhel9-podman-1:5000/rhel9.5-bootc:0.0.1
    Image version: 9.20250109.0 (2025-01-15 09:36:38.866194063 UTC)
    Image digest: sha256:e68453dd17a45ad9243139b5cbb0565bbd97aa2bcd5a230c41e44d295281f9a7
Current rollback image: jkastnin-tpp1-rhel9-podman-1:5000/rhel9.5-bootc:0.0.1
    Image version: 9.20250109.0 (2025-01-14 19:58:27.484294313 UTC)
    Image digest: sha256:c3925bc5d9618e803a3164f8f87a16333e4bf274469e72075d5cb50cf8ac51d9

Euch fällt evtl. auf, dass zwei Images den gleichen Tag, aber unterschiedliche SHA-256-Prüfsummen haben, und zwei Tags die gleiche Prüfsumme und unterschiedliche Tags. Lasst euch davon bitte nicht irritieren; dies ist nur meiner Spielerei geschuldet.

Bei einem Rollback wird das Image hinter dem Eintrag Current rollback image als Boot-Image verwendet. Ein Rollback wird mit folgendem Kommando ausgeführt:

$ sudo bootc rollback
Next boot: rollback deployment

Nur den Neustart muss man noch selbst durchführen. Nach dem Neustart sieht der Status wie folgt aus:

$ sudo bootc status
[sudo] password for jkastnin: 
No staged image present
Current booted image: jkastnin-tpp1-rhel9-podman-1:5000/rhel9.5-bootc:0.0.1
    Image version: 9.20250109.0 (2025-01-14 19:58:27.484294313 UTC)
    Image digest: sha256:c3925bc5d9618e803a3164f8f87a16333e4bf274469e72075d5cb50cf8ac51d9
Current rollback image: jkastnin-tpp1-rhel9-podman-1:5000/rhel9.5-bootc:0.0.1
    Image version: 9.20250109.0 (2025-01-15 09:36:38.866194063 UTC)
    Image digest: sha256:e68453dd17a45ad9243139b5cbb0565bbd97aa2bcd5a230c41e44d295281f9a7

Anhand der SHA-256-Prüfsumme ist zu erkennen, dass das vorherige rollback image nun den Platz mit dem vorherigen booted image gewechselt hat. Ein weiterer Aufruf von bootc rollback führt zu einem weiteren Image-Wechsel.

Hinweis: Wenn nach einem Update ein Rollback durchgeführt wird und der Systemd-Timer für automatische Updates nicht deaktiviert wurde, führt dieser Timer bei Ablauf zu einem erneuten Update des Systems.

Ende

Hier endet die Einführung in RHEL image mode. Wer dem Tutorial aufmerksam gefolgt ist, sollte an dieser Stelle in der Lage sein:

  • RHEL Bootc Images zu erstellen
  • Eine einfache Container-Registry mit Podman zu betreiben
  • Mit bootc-image-builder Disk-Images zu erstellen
  • Ein System im RHEL image mode zu installieren
  • Das installierte System zu aktualisieren
  • Zu einem anderen Image zu wechseln
  • Ein Rollback auf das vorherige Image durchzuführen

Wenn euch diese Einführung gefallen hat, freue ich mich, wenn ihr sie mit euren Netzwerken teilt. Nutzt gern die Kommentarfunktion, um mich wissen zu lassen, wie euch diese Einführung gefallen hat.

Falls ihr euch weitere Artikel rund um den RHEL image mode wünscht, teilt mir dies gern ebenfalls über die Kommentarfunktion mit.

Quellen und weiterführende Links

  1. What does a „Technology Preview“ feature mean?
  2. Technology Preview Features – Scope of Support
  3. Image mode for RHEL: 4 key use cases for streamlining your OS
  4. How to get list of the packages included in ‚Minimal Install‘ ? (Login notwendig)
  5. How Podman can transfer container images without a registry?
  6. How to implement a simple personal/private Linux container image registry for internal use
  7. Using image mode for RHEL to build, deploy, and manage operating systems
  8. Red Hat Container Registry Authentication
  9. Composing a customized RHEL system image
  10. Deploying a container image by using Anaconda and Kickstart
  11. 8.5. Turning off automatic updates