Archiv des Autors: Jörg Kastning

Vorstellung: Red Hat Accelerators Program

In diesem Beitrag möchte ich euch das Red Hat Accelerators Programm vorstellen und einige Beispiele geben, was wir dort so tun. Ich selbst bin seit 2019 Mitglied dieser Gemeinschaft und freue mich, mit IT-Experten aus verschiedensten Branchen und Red Hat selbst austauschen zu können. Dieser Artikel gibt meine persönliche Meinung und Sicht auf die Red Hat Accelerators wieder. Diese kann mit der von Red Hat übereinstimmen, muss es aber nicht.

Das Programm selbst beschreibt sich als globale Gemeinschaft, bestehend aus IT-Experten unter den Red Hat Kunden/Partnern, welche ihr Wissen und ihre Leidenschaft für Red Hat Produkte und Open Source Projekte mit Fachkollegen und Red Hat teilen und sich darüber austauschen mögen. Dem Einzelnen verspricht das Programm dabei folgenden Nutzen.

Netzwerken

Kurz gesprochen sind die Red Hat Accelerators ein Slack Channel voller interessanter Menschen. Diese stammen aus den verschiedensten Branchen, wie z.B. dem Gesundheitswesen, der Automobilindustrie, Versicherungen und Banken, um nur einige zu nennen. Dazu gesellen sich auch einige „Rote Hüte“, darunter Technical Account Manager, Mitarbeiter:innen aus verschiedenen Produkt-Teams und selbstverständlich die Community-Managerinnen Andi und Lili.

Wenn man seit vielen Jahren im gleichen Unternehmen arbeitet und stets nur zu den eigenen Kollegen Kontakt hat, stellt sich häufig eine gewisse Betriebsblindheit ein. Bei den Red Hat Accelerators bietet sich die Gelegenheit, mit Fachkollegen aus der gleichen, aber vor allem auch aus anderen Branchen in Kontakt zu treten und sich auszutauschen, um über den Tellerrand schauen zu können und der Betriebsblindheit entgegen zu wirken.

Ganz nebenbei lernt man neue Anwendungsfälle für bekannte oder weniger bekannte Produkte kennen. Gleiches gilt für Fehler in bzw. Probleme mit eben diesen Produkten. So bilden sich im Chat häufig so etwas wie spontane Arbeitskreise, die Probleme in der allerneusten Version eines Produktes adressieren. Hier wird sich gegenseitig geholfen. Und sollte einmal noch keine Lösung existieren, nimmt meist einer der anwesenden TAMs (steht wahlweise für Technical Account Manager oder The Almighty Moderator) das Problem/die Frage mit, um eine Lösung zu finden.

Mir hat sich durch diesen Austausch schon einige Male ein neuer Blickwinkel eröffnet, wodurch sich neue Lösungswege auftaten. Und das selbst über Red Hat Produkte hinaus.

Zugang zu Produkt-Teams und zukünftigen Releases

Für mich persönlich ist dies der größte Nutzen, den ich aus dem Red Hat Accelerators Programm ziehe. Ich habe hier die Möglichkeit, frühzeitig Kenntnis über (geplante) Neuerungen in Red Hat Produkten zu erlangen und durch qualifizierte Beiträge die Produktentwicklung mit zu beeinflussen.

Die Produkt-Teams stellen ihre Ideen und Pläne in gemeinsamen Videokonferenzen mit den Accelerators vor und diskutieren mit uns über Anwendungsfälle sowie Vor- und Nachteile der Änderungen.

Diese Form der Kommunikation hat Vorteile sowohl für Red Hat selbst, als auch für uns Kunden. Red Hat erfährt von seinen Kunden, wo der Schuh drückt, was sich diese wünschen, um ihren Arbeitsalltag effizienter zu gestalten. Als Kund erfährt man frühzeitig von geplanten Entwicklungen und Ideen und kann diese in gewissem Rahmen mit beeinflussen. Dazu möchte ich drei Beispiele geben.

Umfragen

Regelmäßig werden Umfragen zu Produkten aus dem Red Hat Portfolio und IT-Themen durchgeführt, die viele von uns im Arbeitsalltag betreffen. Red Hat nutzt diese Fragen dazu, um seine Kunden besser kennen zu lernen. Basierend auf diesen Umfragen werden weitere Sitzungen geplant, um einzelne Punkte in kleineren Arbeitsgruppen besprechen zu können.

Umfragen werden z.B. als webbasierte Formulare durchgeführt oder als Live-Interviews mit den Produkt-Teams.

Produktvorstellungen

Hier stellt ein Produkt-Team geplante Neuerungen, Änderungen oder neue Funktionen vor und stellt sich direkt der Kritik der Accelerators. Es wird dabei darauf geachtet, dass Kritik konstruktiv geäußert wird. Ein einfaches „Das ist Mist.“ oder „Das finde ich doof.“ ist dabei nicht gern gesehen. Ein konstruktives „Ich würde mir dieses oder jenes aus folgenden Gründen wünschen.“ wird gern entgegengenommen.

Als Accelerator hat man hier die Möglichkeit, seine Wünsche mitzuteilen. Es besteht keine Garantie und kein Anspruch, dass diese Berücksichtigung finden. Auch kann man die Entwicklung nicht direkt bestimmen. Doch hat Red Hat selbstverständlich ein Interesse daran, möglichst viele seiner Kunden bei der Stange und bei Laune zu halten. Denn ein glücklicher Kunde kauft gern nochmal, während ein unglücklicher Kunde vermutlich etwas neues ausprobiert.

Schön finde ich bei diesen Veranstaltungen auch, dass man erfahren kann, warum einige Wünsche nicht berücksichtigt werden oder auf der Roadmap sehr weit hinten anstehen müssen. Dies schafft Transparenz und ist in meinen Augen sehr zu begrüßen.

Doch auch für Red Hat kann es hier manchmal eine Enttäuschung geben, wenn z.B. ein Design-Entwurf von einer großen Mehrheit abgelehnt (im Sinne von: „Wir mögen das wirklich nicht und wünschen es uns wie folgt.“) wird.

Fokus-Gruppen

In den sogenannten Fokus-Gruppen bietet sich für ausgewählte Accelerators die Chance, eng mit einem Red Hat Produkt-Team zusammen zu arbeiten.

So hatte ich im Sommer 2020 das Vergnügen, in der Fokus-Gruppe Red Hat Insights unter Leitung von Mohit Goyal (Senior Principal Product Manager, Red Hat) mitzuarbeiten. Hier bot sich mir die Möglichkeit, die besonderen Anforderungen an den Einsatz einer solchen Lösung in Deutschland und in meiner Organisation zu vertreten und dafür zu sensibilisieren. Durch den Einfluss mehrerer Red Hat Accelerators wurde die geplante automatische Registrierung von RHEL-Systemen in Red Hat Insights auf unbestimmte Zeit verschoben.

So viel Einfluss auf eine laufende Produktentwicklung hatte ich bisher bei keinem anderen Hersteller. Und ich wünsche mir deutlich mehr davon.

Welche Vorteile hat Red Hat davon?

Selbstverständlich profitiert auch Red Hat von dem Accelerators-Programm. Wie bereits erwähnt, bekommt der Hersteller hier wertvolle Rückmeldungen von vertrauten Kunden, direkt aus der Praxis. Darüber hinaus stehen die Accelerators bereit, Produktneuheiten zu testen, zu validieren und den Einsatz in der eigenen Umgebung zu prüfen, bevor diese veröffentlicht werden. Dadurch kann bei Problemen noch rechtzeitig gegengesteuert werden.

Das Programm hilft Red Hat, seine Kunden und deren Bedürfnisse besser zu verstehen und die eigenen Produkte noch besser am Bedarf der Kunden auszurichten.

Und natürlich verfügt Red Hat mit den Accelerators über ein Heer aus Enthusiasten, Evangelisten und Missionaren, welche die Open Source Botschaft in die Welt hinaus tragen. Und wir alle wissen doch, dass Mund-zu-Mund-Propaganda die wirksamste Form der Werbung ist.

Wie kann man Mitglied werden?

Ihr seid bereits Red Hat Kunde und mein Beitrag hat euch neugierig gemacht, so dass ihr ebenfalls zu den Red Hat Accelerators dazustoßen möchtet? Das ist gut, denn die EMEA-Region und besonders der deutschsprachige Raum ist aktuell noch etwas unterrepräsentiert.

Bitte lest euch die Programm-Bedingungen (in englischer Sprache) durch und bewerbt euch.

Ich selbst darf übrigens keinerlei Geschenke von Red Hat oder dem Accelerators-Programm annehmen. Wenn ihr im letzten Feld des Bewerbungsformulars also meinen Namen angebt, ist mir nicht mehr und nicht weniger gewiss, als der ewige Dank von Andi und Lili.

Es ist in 2021 ein Lenovo ThinkPad T14s (AMD) geworden

Anfang April habe ich mir Gedanken zu Neuer Hardware in 2021 gemacht. Zu der Zeit hatte ich ein TUXEDO Pulse 14 Gen 1 und ein ThinkPad P14s Gen 1 ins Auge gefasst.

Eure Rückmeldungen in den Kommentaren und das Studium etlicher Testberichte auf notebookcheck.net mündeten nun in einer Entscheidung. Besonders das umfangreiche Feedback von ‚Art‘ hat meine Kaufentscheidung beeinflusst. Danke dafür.

Ich habe mir nun ein Lenovo Campus ThinkPad T14s 20UJS00K00 für 1.399 Euro bei cyberport gekauft. Das Gerät beinhaltet (Quelle: Datenblatt):

  • CPU: AMD Ryzen™ 7 Pro 4750U Prozessor (bis zu 4,1 GHz), Octa-Core
  • Display: 35,6 cm (14 Zoll) IPS Full-HD Display mit LED-Hintergrundbeleuchtung, 400 nits, 800:1 Kontrast
  • RAM: 32 GB DDR4-3200 SO-DIMM fest verlötet
  • Festplatte: 1 TB SSD M.2 2280 PCIe NVMe Opal2
  • Webcam: IR Kamera und HD720p Kamera mit ThinkShutter
  • WLAN und Bluetooth: Wireless LAN 802.11 ax und Bluetooth 5.1
  • Weitere Anschlüsse:
    • 2x USB 3.2 Gen 1 (1x Always On)
    • 2x USB 3.2 Type-C Gen 2 (mit Power Delivery und DisplayPort 1.4)
    • 1x HDMI 2.0
    • Ethernet extension connector (proprietärer Anschluss)
    • Mikrofoneingang / Kopfhörerausgang (komb.)
    • Dockinganschluss
    • MicroSD-Kartenleser; Lesegerät für Smartcards

Das Feedback von ‚Art‘ bezieht sich zwar auf das P14s, doch teilt sich dieses Modell etliche Komponenten mit dem T14s, so dass ich in der Hoffnung gekauft habe, einige Eigenschaften übertragen zu können. Dieses Feedback, der Trackpoint, dieser Testbericht und der Preis waren die Haupteinflussfaktoren bei diesem Kauf.

Es folgt ein erster persönlicher Erfahrungsbericht zum neuen Gerät.

Ach du Schreck, ist das dünn.

Mein erstes ThinkPad war ein R61. Ich habe dessen Größe, Gewicht und Robustheit geschätzt. Auch das T410 und das X201 machen einen stabilen und robusten Eindruck. Und nun ist da dieses T14s.

Mein erster Gedanke war: „Damit erschlägst du niemanden mehr.“ (Nicht, dass ich das jemals getan hätte.)

Für ein Gerät dieser Größe ist die Stabilität in Ordnung. Erwartungsgemäß ist es nicht so verwindungssteif, wie die älteren Modelle. Dafür ist es bedeutend leichter. Ich glaube, auf dieses Gerät muss ich deutlich besser acht geben, damit es lange hält.

Die äußeren Maße finde ich hingegen optimal. Es passt genau zwischen das T410 und das X201, was mir gut gefällt.

vergleich-t410-x201-t14s
T410 (links unten), X201 (oben) und T14s (rechts unten) auf einen Blick

Um es kurz zu machen, ich habe mich mit dem T14s angefreundet.

Die einzige Sache, die sich mir bisher noch nicht erschlossen hat, ist der Sinn hinter dem proprietären LAN-Anschluss.

proprietaerer-lan-anschluss
Der proprietäre LAN-Anschluss befindet sich zwischen dem USB-C-Ladeanschluss (links) und dem USB-A-Anschluss.

Um einen LAN-Anschluss mit bis zu 1 Gbps nach außen zu führen, hätte in einen Augen ein normaler USB-C-Port gereicht. Diesen hätte man auch noch anderweitig verwenden können. Aber vielleicht steckt ja noch mehr hinter diesem Port, das mir noch nicht bewusst ist.

Und wie läuft es mit Linux?

Debian Buster wollte nicht starten. Ich habe mehrere Debian Testing Images ausprobiert, doch hat mich die Partitionierung im Installer so genervt, dass ich schlussendlich (erstmal) zu Fedora 34 Workstation gegriffen habe. Hiermit funktionierte fast alles Out-of-the-Box.

Lediglich für den Standby-Modus war noch ein Firmware-Update auf Version 1.30 notwendig. Dank LVFS war dies im Handumdrehen aus Linux heraus erledigt.

Nur ein Bug nervt mich sehr. In meinem Gerät ist ein Touchpad und Trackpoint der Firma Elantech verbaut. Bei Nutzung des Trackpoints springt dieser sporadisch an die Seiten bzw. in die Ecken des Displays. Da dieser Bug bei Lenovo bekannt ist und reproduziert werden konnte, habe ich die Hoffnung, dass hier noch Abhilfe geschaffen wird.

Mit dem letzten Debian Testing weekly-build funktionieren Stand-By (ursächlich ist hier wohl eher die aktualisierte Firmware). Nur der Trackpoint-Bug existiert wenig überraschend auch hier.

Fazit

Alles in allem ist es ein schönes Gerät. Die Linux-Unterstützung ist gut und ich habe es behalten.

Das Problem mit dem Trackpoint ist wirklich nervig, doch verschmerzbar. Zudem hoffe ich hier auf Abhilfe.

An dieser Stelle noch einmal Danke für eure Kommentare, die mir bei der Entscheidung geholfen haben.

Weiterführende Links

Ansible: Wiederherstellung meines Blogs auf Buster und Bullseye in 2021

Dies ist ein Update zu den Beiträgen:

  1. Konzept zum Deployment meines Blogs mit Ansible und
  2. Erfahrungsbericht zum Deployment meines Blogs mit Ansible.

Umgebung

Aktuell nutze ich als Ansible Control Node (ACN) ein Debian Buster mit Ansible 2.7.7. Die Backups liegen wie gehabt auf einem Speicher im lokalen Heimnetzwerk.

Als Zielsysteme für die Wiederherstellung dienen ein Debian 10 (Buster) und Debian Testing (das kommende Bullseye). Bei beiden Zielsystemen handelt es sich um minimale Installation in zwei VMs auf einem KVM-Hypervisor.

Ablauf

Zuerst habe ich meinen Blog aus dem Backup auf der Debian 10 VM wiederhergestellt. Dabei gab es tatsächlich ein Problem. Das VHOST-Template für den Webserver entsprach nicht mehr der Version, die auf dem Produktivsystem zum Einsatz kommt. Ich hatte schlicht vergessen, die Änderung nachzupflegen. Der Fehler wurde schnell identifiziert und behoben. Anschließend verlief der Wiederherstellungsprozess reibungslos.

Beim zweiten Versuch erfolgte die Wiederherstellung auf einer VM mit Debian Testing (Bullseye). Dieser Test ist für mich wichtig, um zu sehen, ob ich meinen Blog auch auf der kommenden stabilen Debian-Version ausrollen kann. Hier waren etwas mehr Anpassungen an der Rolle „deploy-my-blog“ notwendig, um dieses Blog erfolgreich wiederherstellen zu können. So haben sich einige Paketnamen geändert:

Alter NameNeuer Name
python-aptpython3-apt
python-mysqldbpython3-mysqldb
Gegenüberstellung der alten und neuen Paketnamen

Doch auch an der VM selbst war ein manueller Eingriff notwendig, bevor sich mein ACN überhaupt mit dem Node verbinden konnte. Ansible konnte auf dem Node keinen Python-Interpreter finden. Ich schiebe die Schuld der Version 2.7.7 in die Schuhe. Nachdem ich einen Symlink von /usr/bin/python auf /usr/bin/python3 erstellt hatte, klappte der Zugriff.

Der letzte Stolperstein war php-fpm. Kommt unter Buster Version 7.3 zum Einsatz so ist dies unter Bullseye 7.4. Da die Versionsnummer in meiner Ansible-Rolle hart verdrahtet ist, war auch hier eine Anpassung notwendig. Anschließend gelang auch hier die Wiederherstellung.

Fazit

Grundsätzlich klappte die Wiederherstellung wie gewohnt. Den Fehler mit der VHOST-Datei könnte ich zukünftig vermeiden, indem ich diese einfach mit aus dem Backup wiederherstelle, statt ein Template zu nutzen.

Das bei der Wiederherstellung auf einer neueren Betriebssystemversion Anpassungen erforderlich sind, hatte ich erwartet. Diese halten sich meiner Meinung nach in Grenzen und sind akzeptabel.

Die längste Zeit beanspruchte das Kopieren der Backups auf die Zielsysteme. Die eigentliche Wiederherstellung war mit den Stolpersteinen in 10-15 Minuten. Mit fehlerbereinigter Rolle sogar nur noch ca. 5 Minuten. Eine manuelle Wiedereinrichtung hat mich früher eher zwischen 30-60 Minuten gekostet. Von daher bin ich sehr zufrieden.

Postfix: From-Adresse beim Relay über Smarthost erzwingen

In diesem Beitrag dokumentiere ich eine Lösung für die Meldung: „554 5.7.1 REJECT policy violation – too many different Display Names – code #242 (in reply to end of DATA command)“

Umgebung

Ich betreibe einen Virtual Private Server (VPS) im Internet, sowie einige Raspberry Pis und weitere Geräte, die man heute wohl am ehesten dem Internet der Dinge zuordnen würde.

Diese Systeme sollen mir Systemmeldungen per E-Mail senden. Dafür habe ich mir ein günstiges E-Mail-Postfach bei Mailbox.org gebucht und auf den betroffenen Systemen Postfix installiert und zum Versand über einen Smarthost konfiguriert. Die Konfiguration erfolgte über die Ansible-Rolle relaymail von Yannik. Diese dient jedoch nur als Werkzeug. Die Konfiguration kann selbstverständlich auch manuell durchgeführt werden.

Problembeschreibung

Bei einer Systemüberprüfung fielen mir einige Fehlermeldungen der folgenden Art ins Auge (einige Werte durch <Platzhalter> ersetzt):

„<Hostname und IP-Adresse> said: 554 5.7.1 id=<ID> – Rejected by next-hop MTA on relaying, from MTA(smtp:[<IP-Adresse>]:10025): 554 5.7.1 REJECT policy violation – too many different Display Names – code #242 (in reply to end of DATA command)“

Weitere Informationen zu dieser Meldung und deren Ursache finden sich im Mailbox.org-Benutzerforum in: „mailbox.org als smtp Relay nutzen“

Während meine Raspberry Pis mit Raspbian GNU/Linux 10 (buster) und Postfix 3.4.14-0+deb10u1 sich wie erwartet verhalten und lediglich meine E-Mail-Adresse in das Header-Feld „From“ eintragen, fügt mein VPS mit Debian GNU/Linux 10 (buster) und Postfix 3.4.14-0+deb10u1 den Namen des jeweiligen Benutzers bzw. Dienstes mit ein, welcher die E-Mail versenden möchte. Diese Informationen nimmt der VPS aus dem Kommentarfeld der /etc/passwd. Während die Kommentarfelder auf meinen Raspberry Pis leer sind, sind diese auf dem VPS entsprechend gefüllt.

Im E-Mail-Header stellt sich das dann wie folgt dar.

Header-Auszug bei E-Mail von Raspberry Pi

Date: Mon, 10 May 2021 04:56:32 +0200 (CEST)
From: no-reply@example.com

Header-Auszüge bei E-Mails vom VPS

From: no-reply@example.com (Cron Daemon)
To: root
Date: Mon, 10 May 2021 04:44:12 +0200 (CEST)
From: Jörg Kastning <no-reply@example.com>
Date: Mon, 10 May 2021 04:44:36 +0200 (CEST)
From: root <no-reply@example.com>

Lösung

Um das Problem aufzulösen, lasse ich nun Postfix das Header-Feld „From“ umschreiben und explizit auf den Wert no-reply@example.com setzen. In der /etc/postfix/main.cf müssen dazu folgende Zeilen vorhanden sein:

sender_canonical_classes = envelope_sender, header_sender
sender_canonical_maps =  regexp:/etc/postfix/sender_canonical_maps
smtp_header_checks = regexp:/etc/postfix/header_check

Inhalt der /etc/postfix/sender_canonical_maps:

/.+/    no-reply@example.com

Dies sorgt dafür, dass Postfix das Feld „Envelope-From“ explizit auf no-reply@example.com setzt.

Inhalt der /etc/postfix/header_check:

/From:.*/ REPLACE From: no-reply@example.com

Hiermit wird der Wert des Header-Felds „From“ explizit auf no-reply@example.com gesetzt. Die Lösung habe ich hier gefunden. Damit läuft der Versand meiner Systembenachrichtigungen wieder.

Weitere Artikel zu Postfix und Smarthosts in diesem Blog

Linux-Distributionen zwischen Stabilität und Aktualität

Die Linux-Gemeinschaft lässt sich grob in drei Lager unterteilen. Dabei nimmt ein Lager den Extremwert „stabil wie ein Fels“ mit z.B. Debian oldstable ein, während der andere Extremwert „bleeding edge“ durch Anhänger z. B. von Arch Linux besetzt wird. Das dritte Lager besetzt die Mitte, in der sich unzählige weitere Distributionen tummeln, die mehr zu dem einen oder dem anderen Extremwert hin tendieren.

Warum das so ist und welche Distribution einen, wie ich finde, ganz interessanten Mittelweg eingeschlagen hat, möchte ich in diesem Artikel beleuchten. Bierernst bin ich dabei allerdings nicht. Die ein oder andere Ausführung ist durchaus mit einem Augenzwinkern zu verstehen. ;-)

Stabil wie ein Fels

So soll eine Linux-Distribution aus Sicht vieler Systemadministratoren sein. Gut getestet, alle Komponenten perfekt aufeinander abgestimmt und über ihren Lebenszyklus nur wenigen — am besten gar keinen — Änderungen unterworfen. Einzig Sicherheitsaktualisierungen dürfen und sollen zeitnah geliefert werden.

Distributionen, die sich diesem Paradigma unterwerfen, versprechen geringe Wartungsaufwände und sind des Sysadmins Freund. In meinen Augen dürfen Debian, RHEL, SLES, etc. dieser Kategorie zugeordnet werden.

Doch bergen diese Distributionen paradigmenbedingt auch einige Nachteile. Da Kernel und Bibliotheken meist schon etwas älter sind — manche sagen dazu steinalt, andere gut abgehangen — wird neue Hardware evtl. nicht in vollem Umfang unterstützt. Oder die mitgelieferten Bibliotheken und Laufzeitumgebungen sind schlicht zu alt, um mit aktuellen Versionen verfügbarer Software noch kompatibel zu sein.

Um den Nachteilen zu begegnen, bleibt Sysadmins häufig nichts anderes übrig, als das wohlige Heim der Distribution zu verlassen und Laufzeitumgebungen aus Upstream- oder Drittanbieter-Repos zu installieren, Software selbst zu übersetzen oder sich Container in die heilige Halle zu stellen. Die Distributionen versuchen dem zu begegnen, in dem sie unter Umständen zu Minor-Releases neuere Software-Versionen als sogenannte Rebases oder Backports nachliefern. Das dies passiert ist jedoch keineswegs garantiert und stellt im Zweifel ein Risiko für die Stabilität dar.

Wenn die Distribution dann aber doch eine neue Softwareversion ausliefert, hat der Sysadmin meist keine Wahl. Entweder er bleibt auf der alten Version und erhält voraussichtlich keinerlei Sicherheitsupdates mehr für diese oder installiert die aktuelle Version und lernt die Neuerungen lieben bzw. damit zu leben.

Bleeding Edge

Mit diesem Beinamen werden häufig Distributionen bezeichnet, welche dem Rolling-Release-Modell folgen und Software mitliefern, die sehr nah am aktuellen Stand der Upstream-Entwicklung ist (the latest and greatest). In dieser Ecke findet man z. B. Distributionen wie Arch Linux, Manjaro, Fedora Rawhide, etc. wobei diese Liste keinen Anspruch auf Vollständigkeit erhebt.

Der Betrieb dieser Distributionen ist geprägt von häufigen Updates. Die stetige Weiterentwicklung birgt das Risiko, dass auch mal etwas kaputt geht und plötzlich nicht mehr funktioniert. Doch versprechen die Distributionen meist, dass gerade durch den schnellen Entwicklungszyklus gefundene Fehler auch schnell behoben werden. Wohingegen die Nutzer stabiler Version häufig Monate, wenn nicht Jahre oder gar vergebens auf einen Bugfix warten müssen.

Blöd wird es, wenn man Software betreiben muss, die nur für eine bestimmte Version einer Laufzeitumgebung, oder bestimmter Bibliotheken freigegeben ist und unterstützt wird. Wer solche Software betreibt, sollte sich jedoch von vornherein fragen, ob er bei rollenden Releases richtig aufgehoben ist.

Dann sind da auch noch jene unter uns, die für den Betrieb auf gewisse Zertifizierungen ihrer Betriebssysteme angewiesen sind. Hier sind die Zertifizierungsverfahren häufig länger, als die Lebensspanne eines Bleeding-Edge-Release.

Das Mittelfeld

Dieses Feld ist weitgespannt. Hier tummeln sich Distributionen wie Fedora, Ubuntu sowie viele weitere. Ihnen allen unterstelle ich, dass sie den besten Kompromiss suchen, um so stabil wie möglich und so aktuell wie nötig zu sein.

So habe auch ich in der Vergangenheit auf Ubuntu LTS gesetzt, da ich es für den besten Kompromiss hielt. Leider waren unsere Entwickler mit den mitgelieferten Software-Versionen nicht lange zufrieden und ließen sich nicht bis zum nächsten Release hinhalten. Also wurden auch hier wieder {Dritanbieter,Upstream}-Repos eingebunden und die Software von dort installiert. Eine Erfahrung die ich bisher unter jeder Distribution machen durfte.

Genauso gut kenne ich den umgekehrten Fall, wo Paket XY auf gar keinen Fall aktualisiert werden darf, da sonst ein Dienst unrettbar kaputt geht. Lasst euch gesagt sein, man hat es schon nicht leicht in der Systemadministration. ;-)

Appstreams und Module

Mit RHEL 8 hat Red Hat eine interessante Neuerung eingeführt, die sog. Module im Appstream-Repository. Nun ein Listing sagt vermutlich mehr, als viele Sätze:

$ sudo dnf module list nginx php postgresql
Updating Subscription Management repositories.
Last metadata expiration check: 0:27:21 ago on Mi 21 Apr 2021 05:41:58 CEST.
Extra Packages for Enterprise Linux Modular 8 - x86_64
Name            Stream        Profiles                        Summary                                 
nginx           mainline      common                          nginx webserver                         

Red Hat Enterprise Linux 8 for x86_64 - AppStream (RPMs)
Name            Stream        Profiles                        Summary                                 
nginx           1.14 [d]      common [d]                      nginx webserver                         
nginx           1.16          common [d]                      nginx webserver                         
nginx           1.18          common [d]                      nginx webserver                         
php             7.2 [d]       common [d], devel, minimal      PHP scripting language                  
php             7.3           common [d], devel, minimal      PHP scripting language                  
php             7.4           common [d], devel, minimal      PHP scripting language                  
postgresql      9.6           client, server [d]              PostgreSQL server and client module     
postgresql      10 [d]        client, server [d]              PostgreSQL server and client module     
postgresql      12            client, server [d]              PostgreSQL server and client module     

Hint: [d]efault, [e]nabled, [x]disabled, [i]nstalled

Wie ihr sehen könnt, hat man damit die Auswahl aus mehreren Versionen ein und der selben Anwendung. Das kannte ich so bisher noch nicht, ohne zusätzliche Repos einbinden zu müssen, oder mich gar mit den berüchtigten Red Hat Software Collections beschäftigen zu müssen.

Als Sysadmin habe ich damit etwas Flexibilität dazugewonnen. Ich kann z. B. eine Altlast mit NGINX 1.14, PHP 7.2 und PostgreSQL 9.6 auf einem Host und eine aktuelle Anwendung mit NGINX 1.18, PHP 7.4 und PostgreSQL 12 auf einem anderen Host betreiben, dabei aber das gleiche stabile Release RHEL 8 nutzen.

Allerdings kann man nicht zwei verschiedene Versionen von z. B. PHP oder PostgreSQL parallel auf dem gleichen Host betreiben. Wer dies wünscht, kann die entsprechenden Anwendungen lokal in Podman-Containern ausführen. Auch hier stehen Images für die verschiedenen Versionen bereit.

Red Hat verspricht, neue Versionen von Anwendungen, Sprachen und Werkzeugen auf diesem Weg verfügbar zu machen. So sind in der Beta des kommenden RHEL 8.4 zum Beispiel PostgreSQL 13, Python 3.9 und Podman 3.0.1 enthalten. Zu beachten ist jedoch, dass die jeweiligen Streams ihre eigenen Life-Cycles besitzen, die es im Auge zu behalten gilt. Hier hilft ein Blick in die offizielle Dokumentation weiter:

Fazit

Ob diese Neuerung und die damit einhergehenden Vorteile in der Praxis von Relevanz sein werden, kann ich heute noch nicht sagen. Dafür fehlt mir noch etwas Erfahrung mit diesem neuen Konzept.

Ich persönlich glaube, dass sich Application Streams und das Konzept zur Verwendung von Containern nicht gegenseitig ausschließen, sondern sinnvoll ergänzen können. In meinen Augen gelingt es Red Hat mit Appstreams, seine stabile Distribution etwas in Richtung Aktualität zu schieben, ohne dabei Stabilität aufgeben zu müssen.

Aktualisierung eines Kanboard-Pods

Dies ist der letzte Artikel in meiner kleinen Reihe, über meinen Ausflug ins Container-Land, zur Bereitstellung der Anwendung Kanboard.

Wie meine Reise ins Container-Land begonnen hat, kann in „Kanboard im Container…“ nachgelesen werden. Wie man einen Reverse-Proxy vor einem Pod betreibt sowie mit dem Thema Backup und Restore habe ich mich inzwischen ebenso beschäftigt. Letzteres habe ich zum Glück implementiert und getestet, bevor ich mit der Dokumentation Datenverlust erlitten habe. Damit die Anwendung nach einem Neustart automatisch startet und für ein bisschen Komfort, habe ich Systemd-Service-Units generiert. In diesem Teil geht es nun um die Aktualisierung dieser Umgebung.

Umgebung

Aktuell läuft Kanboard 1.2.18 auf einer RHEL 8 VM. Zur Ausführung sind folgende Werkzeuge und Container-Images beteiligt.

$ podman --version
podman version 2.2.1
$ podman images
REPOSITORY                              TAG      IMAGE ID      CREATED        SIZE
registry.redhat.io/rhel8/postgresql-96  latest   4ce7daa6dc1d  7 weeks ago    451 MB
docker.io/kanboard/kanboard             v1.2.18  e7ee6403944b  3 months ago   58.6 MB
k8s.gcr.io/pause                        3.2      80d28bedfe5d  14 months ago  688 kB

Um mir die Erstellung eines Pods und das Einhängen von Podman-Volumes zu erleichtern, nutze ich folgendes kleines Skript:

#!/bin/bash
podman run -d --pod new:kanboardpod --name kanboard --privileged -p 127.0.0.1:8080:80 -v kanboard_datadir:/var/www/app/data:Z -v kanboard_pluginsdir:/var/www/app/plugins:Z kanboard/kanboard:v1.2.18

podman run -d --pod kanboardpod --name pgsql_db -e POSTGRESQL_USER=<USERNAME> -e POSTGRESQL_PASSWORD=<Verrate ich nicht> -e POSTGRESQL_DATABASE=kanboard -v pgsql_dbdir:/var/lib/pgsql/data:Z rhel8/postgresql-96:1-107

Mein Pod und die drei dazugehörigen Container werden während der folgenden Schritte noch normal ausgeführt.

Die Container selbst sind dabei zustandslos. Die persistent zu speichernden Daten werden in Podman-Volumes im lokalen Dateisystem der VM abgelegt.

Vorgehensweise

Ich verzichte in diesem Fall bewusst auf podman-auto-update(1), da ich mir erstmal einen Überblick verschaffen möchte, was denn generell zu tun ist und wie die einzelnen Schritte aussehen können. Die grundsätzliche Reihenfolge für ein Update sieht dabei wie folgt aus:

  1. Aktuelle Container-Images aus einer Registry holen (podman-pull(1))
  2. Laufende Pod-Instanz stoppen und entfernen (podman-pod(1))
  3. Neue Pod-Instanz mit angepasstem Wrapper-Skript erstellen
  4. Systemd-Service-Units erneut generieren (podman-generate-systemd(1))
  5. Pod-Instanz stoppen
  6. Generierte Systemd-Service-Unit starten

An dieser Stelle möchte ich vorweg nehmen, dass es genau so einfach war, wie es sich anhört. Die neuen Container-Images habe ich mit folgenden Kommandos heruntergeladen.

$ podman pull docker.io/kanboard/kanboard:v1.2.19
Trying to pull docker.io/kanboard/kanboard:v1.2.19...
Getting image source signatures
Copying blob 0c2b98bb5f7e done
Copying blob ca3cd42a7c95 done
Copying blob e994ab432c32 done
Copying blob 7b30337f40d2 done
Copying blob f58d66ecc40b done
Copying config 2cb48121b7 done
Writing manifest to image destination
Storing signatures
2cb48121b7437ba15cd984472754b300395026c3e09e7c659b4f9b62e5b5b4dd

$ podman pull registry.redhat.io/rhel8/postgresql-96:1-127
Trying to pull registry.redhat.io/rhel8/postgresql-96:1-127...
Getting image source signatures
Copying blob 64607cc74f9c done
Copying blob 320ae7fa06a7 done
Copying blob 13897c84ca57 done
Copying blob b3b2bbe848df done
Copying config 9c6ab01c14 done
Writing manifest to image destination
Storing signatures
9c6ab01c14748f7ff79483759122cb28e0f2c8b0310e5c8d9b5af8383e91f163

$ podman images
REPOSITORY                              TAG      IMAGE ID      CREATED        SIZE
docker.io/kanboard/kanboard             v1.2.19  2cb48121b743  4 days ago     61.3 MB
registry.redhat.io/rhel8/postgresql-96  1-127    9c6ab01c1474  2 weeks ago    449 MB
registry.redhat.io/rhel8/postgresql-96  latest   4ce7daa6dc1d  7 weeks ago    451 MB
docker.io/kanboard/kanboard             v1.2.18  e7ee6403944b  3 months ago   58.6 MB
k8s.gcr.io/pause                        3.2      80d28bedfe5d  14 months ago  688 kB

Mit den folgenden Befehlen werden Informationen zum laufenden Pod angezeigt, der Service wird gestoppt und der Pod inkl. seiner Container entfernt.

$ podman pod ls
POD ID        NAME         STATUS   CREATED      INFRA ID      # OF CONTAINERS
2f3aa7d07e6e  kanboardpod  Running  4 weeks ago  34e8479a2847  3

$ systemctl --user stop pod-kanboardpod.service

$ podman pod ls
POD ID        NAME         STATUS  CREATED      INFRA ID      # OF CONTAINERS
2f3aa7d07e6e  kanboardpod  Exited  4 weeks ago  34e8479a2847  3

$ podman pod rm kanboardpod
2f3aa7d07e6eb7d4c3a0c9927dac222be52b8992f95929c12af8ce4afafd4eb1

In mein Wrapper-Skript (siehe Abschnitt Umgebung) trage ich die neuen Versionsnummern bei den entsprechenden Aufrufen ein:

#!/bin/bash
podman run -d --pod new:kanboardpod --name kanboard --privileged -p 127.0.0.1:8080:80 -v kanboard_datadir:/var/www/app/data:Z -v kanboard_pluginsdir:/var/www/app/plugins:Z kanboard/kanboard:v1.2.19

podman run -d --pod kanboardpod --name pgsql_db -e POSTGRESQL_USER=<USERNAME> -e POSTGRESQL_PASSWORD=<Verrate ich nicht> -e POSTGRESQL_DATABASE=kanboard -v pgsql_dbdir:/var/lib/pgsql/data:Z rhel8/postgresql-96:1-127

Nachdem das obige Wrapper-Skript ausgeführt wurde, prüfe ich, ob die neue Pod-Instanz läuft, erstelle die Service-Units und aktiviere diese:

$ podman pod ls
POD ID        NAME         STATUS   CREATED             INFRA ID      # OF CONTAINERS
85273ee9bb82  kanboardpod  Running  About a minute ago  82f45a722dff  3

$ podman container ls
CONTAINER ID  IMAGE                                         COMMAND         CREATED             STATUS                 PORTS                   NAMES
6becc68a9c20  registry.redhat.io/rhel8/postgresql-96:1-127  run-postgresql  About a minute ago  Up About a minute ago  127.0.0.1:8080->80/tcp  pgsql_db
82f45a722dff  k8s.gcr.io/pause:3.2                                          About a minute ago  Up About a minute ago  127.0.0.1:8080->80/tcp  85273ee9bb82-infra
e72ca46110be  docker.io/kanboard/kanboard:v1.2.19                           About a minute ago  Up About a minute ago  127.0.0.1:8080->80/tcp  kanboard

$ podman generate systemd --files --name kanboardpod
/home/bob/pod-kanboardpod.service
/home/bob/container-kanboard.service
/home/bob/container-pgsql_db.service

$ mv *.service .config/systemd/user/

$ podman pod stop kanboardpod
85273ee9bb82e49e236ae37d9320fd95af1eb186d7d965d72b9e2a270ca5cedf

$ systemctl --user daemon-reload
$ systemctl --user start pod-kanboardpod.service

Fazit

Das war einfacher als gedacht. Oder anders formuliert, es hat tatsächlich so funktioniert, wie ich es erwartet habe.

Mein kleines Wochenend-Projekt skaliert sicher nicht gut und ist als Beispiel für Produktionsumgebungen vermutlich weniger geeignet. Doch um Software als rootless-Container auszuführen und in kleinem Umfang zu testen, scheint dieser Weg durchaus geeignet zu sein.

Vielleicht schiebe ich in Zukunft noch einen Artikel unter Verwendung von podman-auto-update(1) nach.

Neue Hardware 2021

Vergangenes Jahr habe ich meinen Tower-PC generalüberholt und mit frischer Hardware bestückt. Dieses Jahr möchte ich meine beiden ThinkPads (T410 und X201) durch aktuelle Hardware ablösen.

Das neue Gerät soll folgende Anforderungen erfüllen:

  • 100% Linux-Kompatibilität – Ich möchte auf dem Gerät Debian, RHEL, Fedora, Ubuntu LTS oder evtl. auch mal ganz was neues betreiben. Da möchte ich natürlich nicht für Hardware bezahlen, die ich anschließend nicht nutzen kann.
  • Lange Akkulaufzeit >7 Std. – Damit ich mit dem Gerät auf dem Sofa, im Garten, im Büro oder auch mal im Auto arbeiten kann, ohne nach wenigen Stunden an eine Steckdose gefesselt zu sein.
  • Gute Tastatur – Dies ist ein sehr subjektiver Punkt. Ich liebe die ThinkPad-Tastaturen. Die alten mehr, als die neuen. Ich hasse hingegen die Tastaturen aus der Dell Latitude Reihe.
  • Leise Lüfter – Wenn mehrere Prozesse schwere Arbeit verrichten, muss die Hardware selbstverständlich gekühlt werden. Wenn mich das Gerät allerdings bei der Internetrecherche und dem Schreiben von Texten bereits permanent anbläst und die Lüfter heulen lässt, nervt mich dies extrem.
  • Virtualisierung – Ich arbeite viel mit virtuellen Maschinen und zukünftig auch vermehrt mit Containern. Das neue Gerät soll nicht meinen Hypervisor ersetzen, aber für Testzwecke schon mal 2-3 VMs parallel starten können. Daher sind 8 Threads und mindestens 32 GB RAM Pflicht.
  • 1 TB Festplattenspeicher – Denn darunter wird der Platz nur wieder erschreckend schnell knapp.

Bisher habe ich mich in den Online-Shops von TUXEDO Computers und Lenovo umgesehen und die beiden folgenden Geräte ins Auge gefasst

TUXEDO Pulse 14

Ich hab das TUXEDO Pulse 14 Gen 1 wie folgt konfiguriert:

  • Display: Full-HD (1920×1080) IPS matt | 100% sRGB
  • RAM: 64 GB (2x 32 GB) 3200 MHz CL22 Samsung
  • CPU: AMD Ryzen 7 4800H (8x 2,9-4,2 GHz, 8 Cores, 16 Threads, 12 MB Cache, 45 W TDP)
  • Festplatte: 1 TB Samsung 980 Pro (NVMe PCIe 4.0)
  • WLAN & Bluetooth: Intel Wifi AX200 & Bluetooth 5.1
  • LAN: 1x Gigabit LAN/Netzwerk RJ45
  • Weitere Anschlüsse
    • 1x USB 3.2 Gen1 Typ-C (DisplayPort: nein; Power Delivery/DC-IN: ja, mind. 20V/4.5A)
    • 2x USB 3.2 Gen1 Typ-A
    • 1x USB 2.0 Typ-A
    • 1x HDMI 2.0 inkl. HDCP (4k UHD@60Hz / 2k FHD@120Hz)
    • 1x 2-in-1 Kopfhörer/Headset (Kopfhörer & Mikrofon)
    • 1x HD Webcam / Kamera inkl. Mikrofon
  • Preis: ca. 1489 EUR

Das ist in meinen Augen bereits eine gute Ausstattung zu einem fairen Preis. Nur bin ich skeptisch, ob mir die Tastatur gefallen wird und ich mich daran gewöhnen kann, keinen TrackPoint mehr zu haben.

Ist unter euch evtl. ein ehemaliger ThinkPad-User, welcher nun ein TUXEDO sein Eigen nennt und etwas zur Tastatur und dem Touchpad sagen mag? Und auch wenn ihr kein ThinkPad-User seid, freue ich mich über euer Feedback.

ThinkPad P14s Gen 1

Das ThinkPad P14s Gen 1 käme mit folgender Konfiguration in Frage:

  • Display: 35,6 cm (14,0″) FHD (1.920 x 1.080), IPS, entspiegelt, 300 cd/m², Multitouch, schmale Ränder
  • RAM: 32 GB DDR4 3.200 MHz (16 GB verlötet + 1 x 16 GB SODIMM gesteckt)
  • CPU: AMD Ryzen 7 PRO 4750U Prozessor (8 Kerne, 16 Threads, 8 MB Cache, bis zu 4,10 GHz)
  • Festplatte: 1 TB SSD, M.2 2280, PCIe 3.0 x4/PCIe 4.0 x4, NVMe, OPAL 2.0-fähig, TLC
  • WLAN & Bluetooth: Intel Wi-Fi 6 AX200 (2×2) WLAN, Bluetooth 5
  • LAN: 1x Gigabit LAN/Netzwerk RJ45
  • Weitere Anschlüsse
    • 2 x USB-A 3.2* (Gen 1) (1 Always-on)
    • 2 x USB-C 3.2 (Gen 2)
    • 1x HDMI 2.0
    • 1x 2-in-1 Kopfhörer/Headset (Kopfhörer & Mikrofon)
    • MicroSD-Kartenleser (UHS-II)
    • 1x Infrarot- und 720p-HD-Kamera mit Mikrofon
  • Sonstiges: Das System ist Red Hat Linux zertifiziert und das Gehäuse ist spritzwassergeschützt
  • Preis: ca. 1459 EUR

Die Akkulaufzeit beträgt nach MobileMark 2014 bis zu 13,25 Std. und nach MobileMark 2018 bis zu 10,5 Std. Das sagt mir persönlich erstmal gar nichts, da ich beide Benchmarks nicht kenne. Davon ab mag sich die reale Laufzeit im Wirkbetrieb, gerade unter Linux, völlig anders darstellen. Wie sind eure Erfahrungen mit der Akkulaufzeit von aktuellen ThinkPads unter Linux? Weicht diese stark von den Angaben ab?

Wer die Wahl hat, hat die Qual

Da sitze ich nun vor meinem altgedienten T410 und kann mich nicht entscheiden. Die Preise beider Geräte liegen sehr nahe beieinander. Bei TUXEDO bekomme ich die doppelte Menge RAM fürs Geld. Bei Lenovo bekomme ich eine gute Tastatur und meinen geliebten TrackPoint.

Bevor ich mich entscheide, werde ich das Web wohl noch nach ein paar Testberichten umgraben. Falls ihr welche kennt, freue ich mich über eure Hinweise.

Für welches Gerät würdet ihr euch denn entscheiden? Und warum?

Wenn ihr Geräte von anderen Herstellern kennt, die obige Anforderungen erfüllen und eine vergleichbare Ausstattung bieten, freue ich mich ebenfalls, wenn ihr Hinweise darauf in den Kommentaren verlinkt.

Euch allen noch ein frohes Osterfest.

Podman kann auch Systemd-Service-Units generieren

Mit „Kanboard im Container…“ hat mein Ausflug ins Containerland begonnen. Mittlerweile läuft mein Pod bereits eine Weile und ich nutze die Anwendung regelmäßig. Jedoch musste ich nach jedem Neustart des Hosts den Pod kanboardpod manuell starten. Ich hatte mir daher vorgenommen, hierfür eine Systemd-Service-Unit zu erstellen, welche diesen Task automatisiert. Doch habe ich mit Freude festgestellt, dass podman-generate-systemd(1) mir diese Arbeit abnehmen kann.

Also starte ich einen ersten Versuch und erzeuge entsprechende Service-Unit-Dateien in meinem HOME-Verzeichnis. Die Option „--name“ sorgt dafür, dass in den Service-Unit-Dateien die Namen des Pods bzw. der Container verwendet werden, anstatt der UUIDs. Die Option „--files“ sorgt dafür, dass die Ausgabe in Dateien und nicht auf die Standard-Ausgabe geschrieben wird.

$ podman generate systemd --name --files kanboardpod
/home/alice/pod-kanboardpod.service
/home/alice/container-kanboard.service
/home/alice/container-pgsql_db.service

$ cat pod-kanboardpod.service
# pod-kanboardpod.service
# autogenerated by Podman 2.0.5
# Mon Jan 25 13:19:51 CET 2021

[Unit]
Description=Podman pod-kanboardpod.service
Documentation=man:podman-generate-systemd(1)
Wants=network.target
After=network-online.target
Requires=container-kanboard.service container-pgsql_db.service
Before=container-kanboard.service container-pgsql_db.service

[Service]
Environment=PODMAN_SYSTEMD_UNIT=%n
Restart=on-failure
ExecStart=/usr/bin/podman start 62cdd29105a4-infra
ExecStop=/usr/bin/podman stop -t 10 62cdd29105a4-infra
ExecStopPost=/usr/bin/podman stop -t 10 62cdd29105a4-infra
PIDFile=/run/user/1000/containers/overlay-containers/b3c9bd9754cdc999108d0f4aad7d808c007cc34eee34faefd41ee39c3e1ca18b/userdata/conmon.pid       
KillMode=none
Type=forking

[Install]
WantedBy=multi-user.target default.target

$ cat container-kanboard.service 
# container-kanboard.service
# autogenerated by Podman 2.0.5
# Mon Jan 25 13:19:51 CET 2021

[Unit]
Description=Podman container-kanboard.service
Documentation=man:podman-generate-systemd(1)
Wants=network.target
After=network-online.target
BindsTo=pod-kanboardpod.service
After=pod-kanboardpod.service

[Service]
Environment=PODMAN_SYSTEMD_UNIT=%n
Restart=on-failure
ExecStart=/usr/bin/podman start kanboard
ExecStop=/usr/bin/podman stop -t 10 kanboard
ExecStopPost=/usr/bin/podman stop -t 10 kanboard
PIDFile=/run/user/1000/containers/overlay-containers/99d386a42b186efb3347d909cea265b990469dc33e1889a3006425a71956699b/userdata/conmon.pid
KillMode=none
Type=forking

[Install]
WantedBy=multi-user.target default.target

$ cat container-pgsql_db.service 
# container-pgsql_db.service
# autogenerated by Podman 2.0.5
# Mon Jan 25 13:19:51 CET 2021

[Unit]
Description=Podman container-pgsql_db.service
Documentation=man:podman-generate-systemd(1)
Wants=network.target
After=network-online.target
BindsTo=pod-kanboardpod.service
After=pod-kanboardpod.service

[Service]
Environment=PODMAN_SYSTEMD_UNIT=%n
Restart=on-failure
ExecStart=/usr/bin/podman start pgsql_db
ExecStop=/usr/bin/podman stop -t 10 pgsql_db
ExecStopPost=/usr/bin/podman stop -t 10 pgsql_db
PIDFile=/run/user/1000/containers/overlay-containers/fe757283f0662220fee23a563053ea7f30dbdf6d9fbb492c010a01dd7598fc9b/userdata/conmon.pid
KillMode=none
Type=forking

[Install]
WantedBy=multi-user.target default.target

Um die generierten Service-Units zu installieren und zukünftig als derjenige User auszuführen, welcher den Pod und die Container erzeugt hat, verschiebe ich sie in das zu erstellende Verzeichnis ~/.config/systemd/user. Anschließend werden die neuen Units in die Systemd-Konfiguration eingelesen und aktiviert.

$ mkdir -p .config/systemd/user
$ mv *.service .config/systemd/user/
$ systemctl --user enable pod-kanboardpod.service
$ podman pod stop kanboardpod
$ systemctl --user start pod-kanboardpod.service

Nachdem ich die Service-Units an die richtige Stelle verschoben und aktiviert hatte, habe ich meine laufende Pod-Instanz gestoppt und über die entsprechende Service-Unit gestartet.

Ich wähnte mich nun bereits am Ziel. Doch nach einem Neustart des Hosts war die Anwendung wieder nicht verfügbar. Die Service-Unit war nicht gestartet worden. Podman kann hier nichts dafür, denn es ist systemd, welcher dafür sorgt, dass im User-Kontext laufende Services beendet werden, wenn sich der entsprechende User ausloggt und diese erst startet, wenn der User sich einloggt.

Valentin Rothberg von Red Hat gab mir den entscheidenden Tipp, um dieses Problem zu lösen. Die Lösung versteckt sich in der Manpage zu podman-generate-systemd(1):

The systemd user instance is killed after the last session for the user is closed. The systemd user instance can be kept running ever after the user logs out by enabling lingering using

$ loginctl enable-linger <username>

Manual page podman-generate-systemd(1)

@Valentin: Thanks a lot, that solved my issue!

Fazit

Ich bin ehrlich gesagt hoch erfreut, dass die Entwickler hier eine Möglichkeit vorgesehen haben, um aus bestehenden Pods bzw. Container-Instanzen Systemd-Service-Units generieren zu können. Dies ermöglicht es, Container-Instanzen und Pods mit den gewohnten Werkzeugen zu starten, zu stoppen und deren Status zu kontrollieren.

So besteht die Möglichkeit, die rootless-Podman-Container auch als unprivilegierte Dienste laufen zu lassen. Das gefällt mir.

Running a NetBSD Virtual Machine on VMware ESXi on Arm Fling

Dies ist ein Gastbeitrag von meinem geschätzten Kollegen Jörn Clausen. Der Beitrag wurde in englischer Sprache verfasst und behandelt die Installation von NetBSD auf dem VMware ESXi on ARM Fling.

In October 2020, VMware released a preview of their hypervisor ESXi for
the ARM architecture. It is free to download (registration needed, though) and will run for 180 days, and one of the supported platforms is the Raspberry Pi 4B. So it’s quite easy to give it a try. To install the ESXi ARM Fling, use the instructions you’ll find at the download page. The ESXi installation is not covered by this article.

A lot of Linux distributions and FreeBSD are working as guest OSes, and luckily NetBSD’s motto holds up: „Of course it runs NetBSD!“. Thanks to the work of Jared McNeill, the ARM port of NetBSD will run on ESXi for ARM.

As his instructions for creating a running NetBSD VM are a bit terse, I’d like to elaborate a little bit.

Prerequisites

You will need the following things:

  • ESXi on Arm Fling up and running (duh!)
  • SSH access to the ESXi host (activate either from the console or the
    web interface)
  • qemu-img, for example by installing emulators/qemu from
    pkgsrc

And of course you will need NetBSD. Download the latest installation image either from Jared’s site „http://www.armbsd.org/arm/“ (be sure to download „Generic 64-bit“ from the tab „NetBSD -current“), or use the latest HEAD release.

Creating a NetBSD VMDK file

Unpack the image:

$ gunzip arm64.img.gz

Increase the image to the size the hard disk should have. In this case, we grow it to just 2 GB:

$ qemu-img resize -f raw arm64.img 2g
Image resized.

Convert the image to a VMDK file

$ qemu-img convert -o compat6 -f raw arm64.img -O vmdk arm64.vmdk

Transfer the last file arm64.vmdk to the datastore on the ESXi host, either using scp or by uploading it via the web interface.

Creating a NetBSD VM

Log on to the ESXi host using ssh. Navigate to the directory where you uploaded the VMDK file. If you used a basic setup with all the defaults, this will be /vmfs/volumes/datastore1/.

Convert the VMDK file to a proper virtual hard disk:

# vmkfstools -i arm64.vmdk -d thin arm64-hd.vmdk
Destination disk format: VMFS thin-provisioned
Cloning disk 'arm64.vmdk'...
Clone: 100% done.

Switch to the web interface of ESXi and create a new VM. Use „Other“ as Guest OS family and „Other (64-bit)“ as Guest OS version.

Remove the hard disk that is automatically added to the VM. Instead, select „Add hard disk“ and „Existing hard disk“. Choose the VMDK you created in the last step (be sure to use arm64-hd.vmdk and not arm64.vmdk).

You can use the default network adapter (E1000e) or you can replace it with the paravirtualized one (VMXNET3).

Running the NetBSD VM

Now start the VM and open the console. The virtual machine should boot straight into the NetBSD boot loader and then into NetBSD. On the first boot, NetBSD will grow the filesystem to use the complete hard disk and reboot. After that, you should be able to login as root.

Now you have a complete NetBSD system. You can even run an X server on the console.

Mit Dokumentation zum Datenverlust

Wie ihr sicher gemerkt habt, beschäftige ich mich im Rahmen eines Wochenend-Projekts mit „Kanboard im Container…“ im Speziellen und Linux-Containern im Allgemeinen. Die Einrichtung von „Backup und Restore im Kanboard-Container-Land“ liegt bereits hinter mir. Und das ist gut so, habe ich doch nun den ersten Datenverlust erlitten und musste meine Daten wiederherstellen.

Die etwas unglückliche Verkettung von Umständen, welche zum Datenverlust führten, möchte ich in diesem Artikel festhalten, so dass euch diese Erfahrung erspart bleiben kann.

Die Vorgeschichte

Da Container zustandslose Gebilde sind, nutze ich podman volumes, um die anfallenden Daten persistent zu speichern.

Als Einsteiger in die Thematik habe ich mich an der offiziellen Container-Dokumentation von Red Hat entlang gehangelt und bin den Anweisungen in Kapitel 3.4. Sharing files between two containers (die Dokumentation wurde überarbeitet; das Kapitel existiert so nicht mehr) gefolgt. Dort wird beschrieben, wie man den Volume-Pfad einer Variablen zuweist, welche später verwendet wird, um das Volume über den Pfad in den Container einzuhängen.

Da ich es nicht besser wusste, bin ich der Anleitung Schritt-für-Schritt gefolgt. Dies führte zu einer funktionierenden Konfiguration, in der meine Daten persistent gespeichert wurden.

Kommando ‚podman volume prune‘ und die Daten waren weg

Am Ende meiner Spielerei wollte ich das Spielfeld bereinigen. Dabei bin ich auf das Kommando podman volume prune gestoßen, welches laut podman-volume-prune(1) alle Volumens entfernt, die sich nicht in Verwendung befinden. Dies klang nach genau dem Befehl, nach dem ich gesucht habe.

TL;DR: Nach der Ausführung des Kommandos waren meine Volumes weg. Auch jene, die aktiv in laufenden Container-Instanzen eingehängt waren.

Die Analyse

Nach ein paar Tests und einer Internetrecherche stand die Ursache für das Verhalten fest. Diese ist im GitHub Issue #7862 dokumentiert und besagt, dass podman volume prune in Verwendung befindliche Volumes löscht, wenn diese über ihren Pfad und nicht über ihren Namen eingehängt wurden. Da ich wie oben beschrieben der Dokumentation von Red Hat strikt gefolgt bin, welche aber genau den Pfad und eben nicht den Namen verwendet, waren Ursache und Erklärung für den Datenverlust gefunden.

Die Folge

In Folge meiner Erfahrungen habe ich zwei Anfragen zur Produktverbesserung (englisch: Request For Enhancement oder kurz RFE) gestellt:

  1. Bug 1914096 – Needs improvement: Building, running, and managing containers: 3.4. Sharing files between two containers
  2. RFE: Let `podman volume prune` show the volumes that are going to be removed

Die erste Anfrage ist an Red Hat adressiert, mit der Bitte, in der Dokumentation den Volume-Namen an Stelle des in einer Variablen gespeicherten Volume-Pfades zu benutzen. Damit sollte verhindert werden, dass andere, die der Dokumentation folgen, die gleichen Erfahrungen wie ich machen müssen.

Als Ziel wird die Veröffentlichung von RHEL 8.4 anvisiert. Dieses Release sollte im Mai bzw. Juni 2021 erscheinen. Ich bin gespannt. Ich würde mich über eine frühere Aktualisierung der Dokumentation freuen. Update 2021-01-25: Bereits am 20. Januar wurde eine neue Version der Dokumentation veröffentlicht. In dieser war nur noch ein kleiner Tippfehler enthalten. Der Bug wurde mit dem heutigen Datum (25.01.2021) geschlossen. So ist sichergestellt, dass hier niemand mehr in die Falle tappt. Vielen Dank ans RHEL-Docs-Team im Allgemeinen und Gabriela im Speziellen.

Die zweite Anfrage richtet sich an das Upstream-Projekt. Sie beinhaltet den Vorschlag, podman volume prune (um eine Option) zu erweitern, so dass die Liste der zu löschenden Volumes angezeigt wird, bevor man die Entfernung bestätigt. Stand 17.01.2021 existiert bereits ein Pull-Request, welcher dieses Thema adressiert.

Meinen Artikel „Kanboard im Container…“ habe ich entsprechend angepasst, so dass auch dort die Volumen-Namen zum Einhängen verwendet werden und nicht die Volume-Pfade.

Alte Erkenntnis bestätigt

Dieses Beispiel zeigt wieder einmal sehr deutlich, wie wichtig eine funktionierende Datensicherung ist. Denn sie ist die zwingende Voraussetzung, um im Fehlerfall Daten auch wiederherstellen zu können. Daher kann ich nur jedem raten, ein entsprechendes Datensicherungs- und Wiederherstellungs-Konzept zu implementieren, bevor man Daten in eine Anwendung tut, die einem am Herzen liegen oder von denen die Zukunft des Unternehmens abhängt.

Zum Stöbern führe ich im Folgenden einige Artikel aus diesem Blog auf, welche sich mit dem Thema Backup befassen: