Normale Ansicht

Tipp: virtuelle Linux-Maschinen, Probleme mit Zwischenablage und Uhrzeit beheben

20. Oktober 2025 um 16:21

In meinem Arbeitsalltag wimmelt es von virtuellen Linux-Maschinen, die ich primär mit zwei Programmen ausführe:

  • virtual-machine-manager alias virt-manager (KVM/QEMU) unter Linux
  • UTM (QEMU + Apple Virtualization) unter macOS

Dabei treten regelmäßig zwei Probleme auf:

  • Bei Neuinstallationen funktioniert der Datenaustausch über die Zwischenablage zwischen Host und VM (= Gast) funktioniert nicht.
  • Die Uhrzeit in der VM ist falsch, nachdem der Host eine Weile im Ruhestand war.

Diese Ärgernisse lassen sich leicht beheben …

Anmerkung: Ich beziehe mich hier explizit auf die Desktop-Virtualisierung. Ich habe auch VMs im Server-Betrieb — da brauche ich keine Zwischenablage (Text-only, SSH-Administration), und die Uhrzeit macht wegen des dauerhaften Internet-Zugangs auch keine Probleme.

Zwischenablage mit Spice als Grafik-Protokoll

Wenn das Virtualisierungssystem das Grafiksystem mittels Simple Protocol for Independent Computing Environments (SPICE) überträgt (gilt per Default im virtual-machine-manager und in UTM), funktioniert die Zwischenablage nur, wenn in der virtuellen Maschine das Paket spice-vdagent installiert ist. Wenn in der virtuellen Maschine Wayland läuft, was bei immer mehr Distributionen standardmäßig funktioniert, brauchen Sie außerdem wl-clipboard. Also:

sudo apt install spice-vdagent wl-clipboard 
sudo dnf install spice-vdagent wl-clipboard
sudo pacman -S spice-vdagent wl-clipboard

Nach der Installation müssen Sie sich in der VM aus- und neu einloggen, damit die Programme auch gestartet werden. Manche, virtualisierungs-affine Distributionen installieren die beiden winzigen Pakete einfach per Default. Deswegen funktioniert die Zwischenablage bei manchen Linux-Gästen sofort, bei anderen aber nicht.

Synchronisierung der Uhrzeit

Grundsätzlich beziehen sowohl die virtuellen Maschine als auch der Virtualisierungs-Host die Uhrzeit via NTP aus dem Internet. Das klappt problemlos.

Probleme treten dann auf, wenn es sich beim Virtualisierungs-Host um ein Notebook oder einen Desktop-Rechner handelt, der hin- und wieder für ein paar Stunden inaktiv im Ruhezustand schläft. Nach der Reaktivierung wird die Zeit im Host automatisch gestellt, in den virtuellen Maschinen aber nicht.

Vielleicht denken Sie sich: Ist ja egal, so wichtig ist die Uhrzeit in den virtuellen Maschinen ja nicht. So einfach ist es aber nicht. Die Überprüfung von Zertifikaten setzt die korrekte Uhrzeit voraus. Ist diese Voraussetzung nicht gegeben, können alle möglichen Problem auftreten (bis hin zu Fehlern bei der Software-Installation bzw. bei Updates).

Für die lokale Uhrzeit in den virtuellen Maschinen ist das Programm chrony zuständig. Eigentlich sollte es in der Lage sein, die Zeit automatisch zu justieren — aber das versagt, wenn die Differenz zwischen lokaler und echter Zeit zu groß ist. Abhilfe: starten Sie chronyd neu:

sudo systemctl restart chronyd

Um die automatische Einstellung der Uhrzeit nach der Wiederherstellung eines Snapshots kümmert sich der qemu-guest-agent (z.B. im Zusammenspiel mit Proxmox). Soweit das Programm nicht automatisch installiert ist:

sudo apt install qemu-guest-agent
sudo dnf install qemu-guest-agent
sudo pacman -S qemu-guest-agent

Quellen / Links

Wie ein fish im Wasser

16. Oktober 2025 um 08:51

Seit über 30 Jahren nutze ich Linux, und knapp 25 Jahre davon war die bash meine Shell. Ein eigener Prompt, der das aktuelle Verzeichnis farbig anzeigte, was das Maß der Dinge :-)

Mein Umstieg auf die zsh hatte mit Git zu tun: Die zsh in Kombination mit der Erweiterung Oh my zsh gibt im Prompt direktes Feedback über den Zustand des Repositories (aktiver Zweig, offene Änderungen). Außerdem agiert die zsh in vielen Details »intelligenter« (ein viel strapazierter Begriff, ich weiß) als die bash. Es macht ein wenig Arbeit, bis alles so funktioniert wie es soll, aber ich war glücklich mit meinem Setup.

Seit ein paar Monaten habe ich die Default-Shell meiner wichtigsten Linux-Installationen neuerlich gewechselt. Ich gehöre jetzt zum rasch wachsenden Lager der fish-Fans. fish steht für Friendly Interactive Shell, und die Shell wird diesem Anspruch wirklich gerecht. fish bietet von Grund auf eine Menge Features, die zsh plus diverse Plugins inklusive Oh my zsh erst nach einer relativ mühsamen Konfiguration beherrschen. Die Inbetriebnahme der fish dauert bei den meisten Distributionen weniger als eine Minute — und die Defaultkonfiguration ist so gut, dass weitere Anpassungen oft gar nicht notwendig sind. Und sollte das doch der Fall sein, öffnet fish_config einen komfortablen Konfigurationsdialog im Webbrowser (außer Sie arbeiten in einer SSH-Session).

Die Stärken der fish im Vergleich zu bash und zsh haben aus meiner Sicht wenig mit der Funktionalität zu tun; einige Features der fish lassen sich auch mit bash-Hacks erreichen, fast alle mit zsh-Plugins. Der entscheidende Vorteil ist vielmehr, dass die fish out of the box zufriedenstellend funktioniert. Für mich ist das deswegen entscheidend, weil ich viele Linux-Installationen verwende und keine Zeit dafür habe, mich jedesmal mit dem Shell-Setup zu ärgern. Deswegen hatte ich in der Vergangenheit auf meinen wichtigsten Installationen zsh samt einer maßgeschneiderten Konfiguration, auf allen anderen aber der Einfachheit halber die bash oder eine unkonfigurierte zsh-Installation.

Auf den ersten Blick sieht die »fish« aus wie jede andere Shell

Installation

Die Installation ist schnell erledigt. Alle gängigen Distributionen stellen fish als Paket zur Verfügung. Also apt/dnf install fish, danach:

chsh -s $(which fish)

Aus- und neu einloggen, fertig.

Falls Ihnen die fish doch nicht zusagt, ist die bisherige Shell ebenso schnell mit chsh -s $(which bash) oder chsh -s $(which zsh) reaktiviert.

Features

Im Prinzip verhält sich die fish wie jede andere Shell. Insbesondere gelten die üblichen Mechanismen zum Start von Kommandos, zur Ein- und Ausgabeumleitung mit < und >, zur Bildung von Pipes mit | sowie zur Verarbeitung von Kommandoergebnissen mit $(cmd). Was ist also neu?

  • Während der Eingabe verwendet die fish Farben, um verschiedene Bestandteile Ihres Kommandos (z.B. Zeichenketten) zu kennzeichnen. Das sieht nett aus, der entscheidende Vorteil ist aber, dass Sie oft Tippfehler erkennen, bevor Sie Return drücken: Kommandos, die es gar nicht gibt, werden rot hervorgehoben, ebenso nicht geschlossene Zeichenketten. (Die Farben sind vom aktiven Farbschema abhängig.)
  • Die Vervollständigung von Kommandos, Optionen, Datei- und Variablennamen mit der Tabulator-Taste ist noch »intelligenter« als bei bash und zsh. fish greift dazu auf über 1000 *.fish-Dateien im Verzeichnis /usr/share/fish/completions zurück, die Regeln für alle erdenklichen Fälle enthalten und mit jeder fish-Version erweitert werden. Die fish zeigt sogar kurze Hilfetexte an (siehe die folgende Abbildung). Wenn es viele mögliche Vervollständigungen gibt, zeigt fish diese in mehreren Spalten an. Sie können mit den Cursortasten das gewünschte Element auswählen.

  • Bei der Eingabe von Kommandos durchsucht die fish die History, also eine Datei, in der alle zuletzt ausgeführten Kommandos gespeichert wurden. In etwas blasserer Schrift schlägt es das passendste Kommando vor. Die fish berücksichtigt dabei auch den Kontext (welches Verzeichnis ist aktiv, welche Kommandos wurden vorher ausgeführt) und schlägt oft — fast schon ein wenig unheimlich — das richtige Kommando vor. Wenn Sie dieses Kommando ausführen möchten, vervollständigen Sie die Eingabe mit Cursor rechts (nicht Tabulator!) und drücken dann Return. Durch ähnliche Kommandos können Sie mit den Cursortasten blättern.

  • Alternativ können Sie auch mit Strg+R suchmuster nach früher ausgeführten Kommandos suchen. Die fish sucht nach dem Muster nicht nur in den Anfangsbuchstaben, sondern in den gesamten Zeichenketten der History.

  • Wenn das aktuelle Verzeichnis Teil eines Git-Repositories ist, zeigt fish den Namen des aktuellen Zweigs in Klammern an. (Wenn Sie mehr Git-Infos sehen wollen, ändern Sie die Prompt-Konfiguration.)

Die »fish« zeigt Hilfetexte zu allen »mysql«-Optionen an, die mit »–default« beginnen.

Globbing-Eigenheiten

In Shells wird die Umwandlung von *.txt in die Liste passender Dateinamen als »Globbing« bezeichnet. Die fish verhält sich dabei fast gleich wie die bash — aber mit einem kleinen Unterschied: Wenn es keine passenden Dateien gibt (z.B. keine einzige Datei mit der Endung .txt), löst die fish einen Fehler aus. Die bash übergibt dagegen das Muster — also *.txt — an das Kommando und überlässt diesem die Auswertung. In der Regel tritt der Fehler dann dort auf. Also kein großer Unterschied?

Es gibt Sonderfälle, in denen das Verhalten der bash günstiger ist. Stellen Sie sich vor, Sie wollen mit scp alle *.png-Dateien von einem externen Rechner auf Ihren lokalen Rechner übertragen:

scp externalhost:*.png .

In der bash funktioniert das wie gewünscht. Die fish kann aber mit externalhost:*.png nichts anfangen und löst einen Fehler aus. Abhilfe: Sie müssen das Globbing-Muster in Anführungszeichen stellen, also:

scp "externalhost:*.png" .

Analoge Probleme können auch beim Aufruf von Paketkommandos auftreten. apt install php8-* funktioniert nicht, wohl aber apt install "php8-*". Hintergründe zum Globbing-Verhalten können Sie hier nachlesen:

Tastenkürzel

Grundsätzlich gelten in der fish dieselben Tastenkürzel wie in der bash. In der fish gibt es darüberhinaus weitere Kürzel, von denen ich die wichtigsten hier zusammengestellt habe. bind oder fish_config (Dialogblatt bindings) liefert eine wesentlich längerer Liste aller Tastenkürzel. Beachten Sie, dass es vom Desktopsystem und vom Terminal abhängt, ob die Alt-Tastenkürzel wirklich funktionieren. Wenn die Kürzel vom Terminal oder dem Desktopsystem verarbeitet werden, erreichen Sie die fish nicht.

Kürzel              Bedeutung
------------------  -------------------------------------------------------
Alt+Cursor links    führt zurück ins vorige Verzeichnis (prevd)
Alt+Cursor rechts   macht die obige Aktion rückgängig (nextd)
Alt+E               öffnet den Dateinamen mit $EDITOR
Alt+H oder F1       zeigt die man-Seite zum eingegebenen Kommando an (Help)
Alt+L               führt ls aus
Alt+P               fügt der Eingabe &| less hinzu (Pager)
Alt+S               fügt sudo am Beginn der Eingabe ein
Alt+W               zeigt Aliasse und eine Beschreibung des Kommandos (What is?)

Noch eine Anmerkung zu Alt+S: In meiner Praxis kommt es ständig vor, dass ich sudo vergesse. Ich führen also dnf install xy aus und erhalte die Fehlermeldung, dass meine Rechte nicht ausreichen. Jetzt drücke ich einfach Alt+S und Return. Die fish stellt sudo dem vorigen, fehlgeschlagenen Kommando voran und führt es aus.

Konfiguration

Das Kommando fish_config öffnet einen Konfigurationsdialog im Webbrowser. Falls Ihr Webbrowser gerade minimiert ist, müssen Sie das Fenster selbst in den Vordergrund bringen. Im Browser können Sie nun ein Farbenschema auswählen, noch mehr Informationen in den Prompt integrieren, die Tastenkürzel nachlesen etc.

In SSH-Sessions scheitert der Start eines Webbrowsers. In diesem Fall können Sie mit fish_config prompt bzw. fish_config theme das Promptaussehen und das Farbschema direkt im Textmodus verändern.

fish-Konfiguration im Webbrowser

Wenn Sie Änderungen durchführen, werden diese im Terminal mit set -U fish_xxx newvalue ausgeführt und in Konfigurationsdateien in .config/fish gespeichert, insbesondere in:

~/.config/fish/fish_variables                (Farbeinstellungen)
~/.config/fish/functions/fish_prompt.fish    (Prompt)

Das Gegenstück zu .bashrc oder .zshrc ist die Datei .config/fish/config.fish. Das ist der richtige Ort, um eigene Abkürzungen zu definieren, den PATH zu erweitern etc. config.fish enthält einen vordefinierten if-Block für Einstellungen, die nur für interaktive fish-Sessions relevant sind. Alle anderen Einstellungen, die z.B. in Scripts gelten sollen, führen Sie außerhalb durch. Das folgende Listing zeigt ein paar typische Einstellungen:

# Datei .config/fish/config.fish
...

# PATH ändern
fish_add_path ~/bin
fish_add_path ~/.local/bin

# keine fish-Welcome-Nachricht
set -U fish_greeting ""

# Einstellungen nur für die interaktive Nutzung
if status is-interactive
    # abr statt alias
    abbr -a ls eza
    abbr -a ll 'eza -la'
    abbr -a gc 'git commit'

    # Lieblingseditor
    set -gx EDITOR /usr/bin/jmacs
end

Das obige Listing zeigt schon, das die fish gängige Einstellungen anders handhabt als bash und zsh:

Abkürzungen: Anstelle von alias sieht die fish das Kommando abbr vor. alias steht auch zur Verfügung, von seinem Einsatz wird aber abgeraten. abbr unterscheidet sich durch ein paar Details von alias: Die Expansion in das Kommando erfolgt bereits, wenn Sie Return drücken. Sie sehen daher, welches Kommando wirklich ausgeführt wird, und dieses Kommando (nicht die Abkürzung) wird in der History gespeichert.

PATH-Änderungen: Sie müssen die PATH-Variable nicht direkt verändern, sondern können stattdessen fish_add_path aufrufen. Ihr Pfad wird am Ende hinzugefügt, wobei die Funktion sicherstellt, dass es keine Doppelgänger gibt.

Variablen (set): Die Optionen des set-Kommandos zur Einstellung von Variablen funktionieren anders als in der bash:

  • -g: Die Variable ist in der gesamten fish-Session zugänglich (Global Scope), nicht nur in einer Funktion oder einem Block.
  • -x: Die Variable wird an Subprozesse weitergegeben (Export).

  • -U: Die Variable wird dauerhaft in .config/fish/fish_variables gespeichert und gilt daher auch für künftige fish-Sessions (Universal). Sie wird aber nicht exportiert, es sei denn, Sie verwenden -Ux.

  • -l: Definiert eine lokale Variable, z.B. innerhalb einer Funktion.

Zusätzliche eingebaute Kommandos

Jede Shell hat eine Menge integrierter Kommandos wie cd, if oder set. In der fish können Sie mit builtin -n alle derartigen Kommandos auflisten. Die meisten Kommandos entsprechen exakt den bash- und zsh-Vorgaben. In der fish gibt es aber einige originelle Erweiterungen: math führt einfache Berechnungen aus, random produziert ganzzahlige Zufallszahlen, string manupuliert Zeichenketten ohne die umständliche Parametersubstitution, path extrahiert Komponenten aus einem zusammengesetzten Dateinamen, count zählt Objekte (vergleichbar mit wc -l etc. Das folgende Listing zeigt die Anwendung dieser Kommandos:

math "2.5 * 3.8"

  9.5

string split " "  "lorem ipsum dolor est"

  lorem
  ipsum
  dolor
  est

string replace ".png" ".jpg" file1.png file2.png file3.png

  file1.jpg
  file2.jpg
  file3.jpg

string sub -s 4 -e 8 "abcdefghijkl"   # Start und Ende inklusive

  defgh

path basename /home/kofler/images/img_234.png

  img_234.png

path dirname /home/kofler/images/img_234.png

  /home/kofler/images

path extension /home/kofler/images/img_234.png

  .png

random 1 100

  13

random choice a b c

  c

count *          # das aktuelle Verzeichnis hat
                 # 32 Dateien/Verzeichnisse
  32

ps ax | count    # gerade laufen 264 Prozesse

  264

Programmierung

Die Bezeichnung Friendly Interactive Shell weist schon darauf hin: Die fish ist für die interaktive Nutzung optimiert, nicht für die Programmierung. Die fish unterstützt aber sehr wohl auch die Script-Programmierung. Diese ist insofern attraktiv, weil die fish-Entwickler auf maximale Kompatibilität verzichtet haben und die schlimmsten Syntaxungereimtheiten der bash behoben haben. fish-Scripts sind daher ungleich leichter zu verstehen als bash-Scripts. Umgekehrt heißt das leider: fish-Scripts sind inkompatibel zu bash und zsh und können nur ausgeführt werden, wo die fish zur Verfügung steht. Für mich ist das zumeist ein Ausschlusskriterium.

Anstelle einer systematischen Einführung will ich Ihnen hier anhand eines Beispiels die Vorteile der fish beim Programmieren nahebringen. Das Script ermittelt die Anzahl der Zeilen für alle *.txt-Dateien im aktuellen Verzeichnis. (Ich weiß, wc -l *.txt wäre einfacher; es geht hier nur darum, diverse Syntaxeigenheiten in wenig Zeilen Code zu verpacken.) Die bash-Variante könnte so aussehen:

#!/bin/bash
files=(*.txt)
if [ ${#files[@]} -eq 0 ]; then
    echo "No .txt files found"
    exit 1
fi
for file in "${files[@]}"; do
    if [ -f "$file" ]; then
        lines=$(wc -l < "$file")
        echo "$file: $lines lines"
    fi
done

Das äquivalente fish-Script ist deutlich besser lesbar:

#!/usr/bin/env fish
set files *.txt
if not count $files > /dev/null
    echo "No .txt files found"
    exit 1
end
for file in $files
    if test -f $file
        echo "$file: "(count < $file)" lines"
    end
end

Auf ein paar Details möchte ich hinweisen:

  • Kontrollstrukturen werden generell mit end abgeschlossen, nicht mit fi für if oder mit esac für case.
  • Bedingungen für if, for etc. müssen weder in eckige Klammern gestellt noch mit einem Strichpunkt abgeschlossen werden.

  • Die fish verarbeitet Variablen korrekt selbst wenn sie Dateinamen mit Leerzeichen enthalten. Es ist nicht notwendig, sie in Anführungszeichen zu stellen (wie bei "$file" im bash-Script).

Wenn Sie in eigenen Scripts Optionen und andere Parameter verarbeiten möchten, hilft Ihnen dabei das Builtin-Kommando argparse. Eine gute Zusammenstellung aller Syntaxunterschiede zwischen bash und fish gibt die fish-Dokumentation.

Paketmanager fisher

Das Versprechen von fish ist ja, dass fast alles out-of-the-box funktioniert, dass die Installation von Zusatzfunktionen und deren Konfiguration ein Thema der Vergangenheit ist. Aber in der Praxis tauchen trotzdem immer Zusatzwünsche auf. Mit dem Paketmanager fisher können Zusatzmodule installiert werden. Eine Sammlung geeigneter Plugins finden Sie hier.

Die Geschichte von fish

Die fish ist erst in den letzten Jahren so richtig populär geworden. Das zeigt, dass es auch in der Linux-Welt Modetrends gibt. fish ist nämlich alles andere als neu. Die erste Version erschien bereits 2005.

fish wurde ursprünglich in C entwickelt, dann nach C++ und schließlich nach Rust portiert. Erst seit Version 4.0 (erschienen im Februar 2025) besteht fish ausschließlich aus Rust-Code sowie in fish selbst geschriebenen Erweiterungen.

Fazit

Die fish punktet durch die gut durchdachte Grundkonfiguration und die leichte Zugänglichkeit (Konfiguration und Hilfe im Webbrowser). Es gibt nicht das eine Feature, mit dem sich die fish von anderen Shells abhebt, es ist vielmehr die Summe vieler, gut durchdachter Kleinigkeiten und Detailverbesserungen. Das Arbeiten in der fish ist intuitiver als bei anderen Shells und macht mehr Spaß. Probieren Sie es aus!

Bei der Programmierung ist die fish inkompatibel zu anderen Shells und insofern kein Ersatz (auch wenn die fish-eigenen Features durchaus spannend sind). Zur Ausführung traditioneller Shell-Scripts brauchen Sie weiterhin eine traditionelle Shell, am besten die bash.

Quellen/Links

YouTube-Videos

Ubuntu 25.10

13. Oktober 2025 um 14:26

Aktuell komme ich mit den Blog-Artikeln zu neuen Linux-Distributionen kaum mehr hinterher. Ubuntu 25.10 ist gerade fertig geworden, und zur Abwechslung gibt es deutlich mehr technische Neuerungen/Änderungen (und auch mehr Bugs) als sonst. Ich konzentriere mich hier vor allem auf die neue SSD-Verschlüsselung mit Keys im TPM. Generell ist Ubuntu 25.10 als eine Art Preview für die nächste LTS-Version 26.04 zu sehen.

Ubuntu 25.10 mit Gnome 49 und Wayland

Neuerungen

Neben den üblichen Software-Updates, auf die ich diesmal nicht im Detail eingehe (topaktueller Kernel 6.17!) gibt es vier grundlegende Neuerungen:

  • Gnome unterstützt nur noch Wayland als Grafiksystem. Diese Neuerung hat das Gnome-Projekt vorgegeben, und die Ubuntu-Entwickler mussten mitziehen. Ich kann nicht sagen, ob mit Überzeugung — immerhin ist das ja auch eine Vorentscheidung für Ubuntu 26.04. Die Alternative wäre gewesen, sowohl für dieses als auch für das kommende Release bei Gnome 48 zu bleiben. Persönlich läuft Gnome + Wayland für mich in allen erdenklichen echten und virtuellen Hardware-Umgebungen gut, d.h. ich trauere X nicht nach. (Über XWayland können natürlich weiterhin einzelne X-Programme ausgeführt werden — wichtig für Programme, die noch nicht auf Wayland-kompatible Bibliotheken portiert sind. Aber der Desktop als Ganzes und der Display Manager müssen jetzt Wayland verwenden.)
  • initramfs-Dateien mit Dracut: Ubuntu verwendet zum Erzeugen der für den Boot-Prozess erforderlichen Initial-RAM-Filesystem (umgangssprachlich der initrd-Dateien) das von Red Hat etablierte Kommando dracut und weicht damit vom Debian-Fundament ab, das weiterhin mkinitramfs verwendet. Das bewährte Kommando update-initramfs bleibt erhalten, aber dieses Script ruft nun eben dracut auf. Die Änderung gilt aktuell nur für Ubuntu Desktop, während Ubuntu Server vorerst bei mkinitramfs bleibt (mehr Details).

  • Rust Utilities: Nicht nur im Linux-Kernel wächst die Bedeutung der Programmiersprache Rust, auch immer mehr Standard-Utilities von Linux werden aktuell im Rahmen von uutils neu in Rust implementiert. Der entscheidende Vorteil von Rust ist eine bessere interne Speicherverwaltung, die weniger Sicherheitsprobleme verspricht (keine Buffer Overflows, keine Null Pointer). In Ubuntu 25.10 wurde sudo durch die Rust-Implementierung sudo-rs ersetzt. Analog kommen auch die Rust-Core-Utilities zum Einsatz (Paket rust-coreutils, siehe /usr/lib/cargo/bin/coreutils). Das betrifft viele oft benötigte Kommandos, z.B. cat, chmod, chown, cp, date, dd, echo, ln, mv, shaXXXsum etc. Ein Blick in /usr/bin zeigt eine Menge entsprechender Links. Sicherheitstechnisch ist die Umstellung erfreulich, aber die Neuimplementierung hat natürlich auch zu neuen Fehlern geführt. Schon während der Beta-Phase hat Phoronix über größere Probleme berichtet, und ganz ist der Ärger vermutlich noch nicht ausgestanden. Update 27.10.: Ein Fehler in date hat dazu geführt, dass automatische Updates nicht mehr funktionieren, siehe den Bugbericht im Launchpad. Dieser Fehler ist mittlerweile behoben.

  • TPM-Unterstützung: Bei der Installation können Sie die Keys für die Dateisystemverschlüsselung nun im TPM speichern. Auf die Details gehe ich gleich ausführlich ein.

Flatpak-Probleme

Viel schlechte Presse haben sich die Ubuntu-Entwickler mit einem Flatpak-Bug eingehandelt. Aktuell gibt es ja zwei alternative Formate für (Desktop-)Pakete, Snap (Ubuntu) versus Flatpak (Red Hat und der Rest der Welt). Aufgrund einer AppArmor-Änderung funktionierten Flatpaks unter Ubuntu nicht mehr. Bugbericht, Behebung, fertig?

Und genau hier begann das eigentliche Fiasko. Der Bug-Bericht stammt nämlich vom 5. September. Dennoch wurde Ubuntu 23.10 fünf Wochen später mit eben diesem Bug freigegeben. Und das ist doch ein wenig peinlich, weil es den Eindruck vermitteln könnte, dass es Ubuntu nur wichtig ist, dass das eigene Paketformat funktioniert. (Und auch wenn Ubuntu ein großer Snap-Befürworter ist, gibt es eine Menge Ubuntu-Derivate, die auf Flatpaks setzen.)

Seit ein paar Tagen gibt es einen Fix, dieser wird aber noch nicht ausgeliefert. (Es kann sich nur noch um wenige Tage handeln.) Alternativ kann als Workaround das AppArmor-Profil für fusermount3 deaktiviert werden:

sudo ln -s /etc/apparmor.d/fusermount3 /etc/apparmor.d/disable/
sudo apparmor_parser -R /etc/apparmor.d/fusermount3

Natürlich ist die ganze Geschichte ein wenig der Sturm im Wasserglas, aber es ist/war definitiv ein vermeidbarer Sturm.

Dateisystem-Verschlüsselung mit Keys im TPM

Zuerst eine Einordnung des Themas: Wenn Sie eine Linux-Installation mit einem verschlüsselten Dateisystem einrichten, müssen Sie während des Boot-Vorgangs zwei Passwörter eingeben: Ganz zu Beginn das Disk-Verschlüsselungspasswort (oft ‚Pass Phrase‘ genannt), und später Ihr Login-Passwort. Die beiden Passwörter sind vollkommen getrennt voneinander, und sie sollten aus Sicherheitsgründen unterschiedlich sein. Elegant ist anders.

Wenn Sie dagegen unter macOS oder Windows das Dateisystem verschlüsseln (FileVault, Bitlocker), gibt es trotzdem nur ein Login-Passwort. Analog gilt das übrigens auch für alle Android- und Apple-Smartphones und -Tablets.

Warum reicht ein Passwort? Weil der Key zur Verschlüsselung des Dateisystems in der Hardware gespeichert wird und während des Boot-Vorgangs von dort ausgelesen wird. Auf x86-Rechnern ist dafür das Trusted Platform Module zuständig. Das TPM kann kryptografische Schlüssel speichern und nur bei Einhaltung bestimmter Boot-Regeln wieder auslesen. Bei aktuellen AMD-CPUs sind die TPM-Funktionen im CPU-Package integriert, bei Intel kümmert sich der Platform Controller Hub (PCH), also ein eigenes Chipset darum. In beiden Fällen ist das TPM sehr Hardware-nah implementiert.

Der Sicherheitsgewinn bei der Verwendung des TPMs ergibt sich daraus, dass das Auslesen des Verschlüsselungs-Keys nur gelingt, solange die Verbindung zwischen Disk und CPU/Chipset besteht (die Disk also nicht in einen anderen Rechner eingebaut wurde) UND eine ganz bestimmte Boot-Sequenz eingehalten wird. Wird die Disk ausgebaut, oder wird der Rechner von einem anderen Betriebssystem gebootet, scheitert das Auslesen des Keys. (Genaugenommen enthält das TPM nicht direkt den Key, sondern den Key zum Key. Deswegen ist es möglich, den Dateisystemverschlüsselungs-Key im Notfall auch durch die Eingabe eines eigenen Codes freizuschalten.)

Die Speicherung des Keys im TPM ermöglicht es also, das Dateisystem zu verschlüsseln, OHNE die Anwender ständig zur Eingabe von zwei Schlüssel zu zwingen. Die TPM-Bindung schützt vor allen Angriffen, bei denen die SSD oder Festplatte ausgebaut wird. Wenn der gesamte Rechner entwendet wird, schützt TPM immer noch vor Angriffen, die durch das Booten von einem fremden System (Linux auf einem USB-Stick) erfolgen. Allerdings kann der Dieb den Rechner ganz normal starten. Das Dateisystem wird dabei ohne Interaktion entschlüsselt, aber ein Zugriff ist mangels Login-Passwort unmöglich. Das System ist also in erster Linie so sicher wie das Login-Passwort. Weiterhin denkbar sind natürlich Angriffe auf die auf dem Rechner laufende Software (z.B. ein Windows/Samba/SSH-Server). Kurzum: TPM macht die Nutzung verschlüsselter Dateisysteme deutlich bequemer, aber (ein bisschen) weniger sicher.

Zum Schluss noch eine Einschränkung: Ich bin kein Kryptografie-Experte und habe die Zusammenhänge hier so gut zusammengefasst (und definitiv vereinfacht), wie ich sie verstehe. Weder kann ich im letzten Detail erklären, warum es bei Windows/Bitlocker unmöglich ist, den Key auch dann auszulesen, wenn der Rechner von einem Linux-System gebootet wird, noch kann ich einschätzen, ob die von Ubuntu durchgeführte Implementierung wirklich wasserdicht und fehlerfrei ist. Aktuell ist sowieso noch Vorsicht angebracht. Die Ubuntu-Entwickler bezeichnen Ihr System nicht umsonst noch als experimentell.

Ubuntu mit TPM-Verschlüsselung einrichten

Ubuntu bezeichnet die Speicherung des Verschlüsselungs-Keys als noch experimentelles Feature. Dementsprechend habe ich meine Tests in einer virtuellen Maschine, nicht auf physischer Hardware ausgeführt. Mein Host-System war Fedora mit QEMU/KVM und virt-manager. Beim Einrichten der virtuellen Maschine sollten Sie UEFI aktivieren. Außerdem müssen Sie unbedingt ein TPM-Device zur virtuellen Maschine hinzufügen.

Virtuelle Maschine mit TPM-Device einrichten

Bei der Installation entscheiden Sie sich für die Hardware-gestützte Verschlüsselung.

Zuerst aktivieren Sie die Verschlüsselung …
… und dann die Variante »Hardwaregestützte Verschlüsselung« auswählen

Im nächsten Dialog können Sie den Entschlüsselung des Datenträgers von einem weiteren Passwort abhängig machen. (Der Key für die Verschlüsselung ist dann mit einem TPM-Key und mit Ihrer Passphrase abgesichert.) Sicherheitstechnisch ist das die optimale Variante, aber damit erfordert der Boot-Vorgang doch wieder zwei Passworteingaben. Da können Sie gleich bei der »normalen« Verschlüsselung bleiben, wo Sie das LUKS-Passwort zum Beginn des Boot-Prozesses eingeben. Ich habe mich bei meinen Tests auf jeden Fall gegen die zusätzliche Absicherung entschieden.

Eine zusätzliche Passphrase macht das System noch sicherer, der Bequemlichkeits-Gewinn durch TPM geht aber verloren.

Die Zusammenfassung der Konfiguration macht schon klar, dass das Setup ziemlich komplex ist.

Der Installer richtet vier Partitionen ein: /boot/efi, /boot, / sowie eine zusätzliche Partition mit Seed-Daten

Der Key für die Verschlüsselung wird zufällig generiert. Der Installer zeigt einen Recovery-Key in Textform und als QR-Code an. Diesen Key müssen Sie unbedingt speichern! Er ist erforderlich, wenn Sie den Datenträger in einen anderen Rechner übersiedeln, aber unter Umständen auch nach größeren Ubuntu- oder BIOS/EFI-Updates. Wenn Sie den Recovery-Key dann nicht mehr haben, sind Ihre Daten verloren!

Sie müssen den Recovery-Key unbedingt speichern oder aufschreiben!
Dieser QR-Code enthält einfach den darunter dargestellten Zahlencode. (Es handelt sich nicht um einen Link.)

Nach dem Abschluss der Installation merken Sie beim nächsten Reboot nichts von der Verschlüsselung. Der Key zum Entschlüsseln der SSD/Festplatte wird vom TPM geladen und automatisch angewendet. Es bleibt nur der »gewöhnliche« Login.

Als nächstes habe ich mir natürlich das resultierende System näher angesehen. /etc/fstab ist sehr aufgeräumt:

cat /etc/fstab

  /run/mnt/ubuntu-boot/EFI/ubuntu /boot/grub none bind
  /swap.img none    swap    sw  0   0

Selbiges kann man von der Mount-Liste leider nicht behaupten. (Diverse Snap-Mounts habe ich weggelassen, außerdem habe ich diverse UUIDs durch xxx bzw. yyy ersetzt.)

findmnt  -t ext4,vfat

  TARGET                             SOURCE                                         FSTYPE
  /                                  /dev/mapper/ubuntu-data-xxx                    ext4
  ├─/run/mnt/ubuntu-boot             /dev/vda3                                      ext4
  ├─/run/mnt/ubuntu-seed             /dev/vda2                                      vfat
  ├─/run/mnt/data                    /dev/mapper/ubuntu-data-xxx                    ext4
  │ ├─/run/mnt/data/usr/lib/firmware /dev/mapper/ubuntu-data-xxx[/var/.../firmware] ext4
  │ └─/run/mnt/data/usr/lib/modules  /dev/mapper/ubuntu-data-xxx[/var/.../modules]  ext4
  ├─/run/mnt/ubuntu-save             /dev/mapper/ubuntu-save-yyy                    ext4
  ├─/usr/lib/firmware                /dev/mapper/ubuntu-data-xxx[/var/.../firmware] ext4
  ├─/var/lib/snapd/seed              /dev/vda2                                      vfat
  ├─/boot/grub                       /dev/vda3[/EFI/ubuntu]                         ext4
  ├─/usr/lib/modules                 /dev/mapper/ubuntu-data-xxx[/var/.../modules]  ext4
  └─/var/lib/snapd/save              /dev/mapper/ubuntu-save-yyy                    ext4

lsblk

  vda                     253:0    0    32G  0 disk
  ├─vda1                  253:1    0     1M  0 part
  ├─vda2                  253:2    0   4,9G  0 part  /var/lib/snapd/seed
  │                                                  /run/mnt/ubuntu-seed
  ├─vda3                  253:3    0   750M  0 part  /boot/grub
  │                                                  /run/mnt/ubuntu-boot
  ├─vda4                  253:4    0    32M  0 part
  │ └─ubuntu-save-yyy     252:1    0    25M  0 crypt /var/lib/snapd/save
  │                                                  /run/mnt/ubuntu-save
  └─vda5                  253:5    0  26,4G  0 part
    └─ubuntu-data-xxx     252:0    0  26,3G  0 crypt /run/mnt/data/usr/lib/modules
                                                     /usr/lib/modules
                                                     /run/mnt/data/usr/lib/firmware
                                                     /usr/lib/firmware
                                                     /
                                                     /run/mnt/data

Die Partition ubuntu-save (Mount-Punkt /run/mnt/ubuntu-save) enthält lediglich eine JSON-Datei sowie ein paar Key-Dateien (ASCII).

Die Partition »ubuntu-save« enthält lediglich einige Key-Dateien

Ich bin ein großer Anhänger des KISS-Prinzips (Keep it Simple, Stupid!). Sollte bei diesem Setup etwas schief gehen, ist guter Rat teuer!

Mit virtuellen Maschinen kann man schön spielen — und das habe ich nun gemacht. Ich habe eine zweite, neue VM eingerichtet, die 1:1 der ersten entspricht. Diese VM habe ich mit dem virtuellen Datenträger der ersten VM verbunden und versucht zu booten. Erwartungsgemäß ist das gescheitert, weil ja der TPM-Speicher bei der zweiten VM keine Keys enthält. (Das Experiment entspricht also dem Ausbau der Disk aus Rechner A und den Einbau in Rechner B.)

Wichtig: Der Key ist ohne Bindestriche einzugeben. Die Eingabe erfolgt im Blindflug (ich weiß, Sicherheit), was bei 40 Ziffern aber sehr mühsam ist.

Wird die Disk ausgebaut bzw. von einer anderen virtuellen Maschine genutzt, muss der Recovery-Key mühsam eingegeben werden.

Immerhin hat der Boot-Vorgang anstandslos funktioniert — allerdings nur einmal. Beim nächsten Reboot muss der Recovery-Key neuerlich eingegeben werden. Ich habe keinen Weg gefunden, die Keys im TPM der zweiten virtuellen Maschine (Rechner B) zu verankern. Wenn sich wirklich die Notwendigkeit ergibt, die SSD in einen neuen Rechner zu migrieren, wäre das eine große Einschränkung.

Danach habe ich wieder VM 1 gebootet. Dort hat alles funktioniert wie bisher. VM 1 hat also nicht bemerkt, dass die Disk vorübergehend in einem anderen Rechner genutzt und auch verändert wurde. Ich bin mir nicht sicher, ob das wünschenswert ist.

Letztlich bleiben zwei Fragen offen:

  • Wie sicher sind die Daten, wenn das Notebook in falsche Hände gerät?
  • Wie sicher ist es, dass ich an meine eigenen Daten rankomme, wenn beim Setup etwas schief geht? Aus meiner persönlichen Sichtweise ist dieser zweiter Punkt der wichtigere. Die Vorstellung, dass nach einem Update der Boot-Prozess hängenbleibt und ich keinen Zugriff mehr auf meine eigenen Daten habe, auch keinen Plan B zur manuellen Rettung, ist alptraumhaft. Es ist diese Befürchtung, weswegen ich das System gegenwärtig nie in einem produktivem Setup verwende würde.

Einfacher ist oft besser, und einfacher ist aktuell die »normale« LUKS-Verschlüsselung, auch wenn diese mit einer wenig eleganten Passwort-Eingabe bei jedem Boot-Prozess verbunden ist. Da weiß ich immerhin, wie ich zur Not auch aus einem Live-System heraus meine Daten lesen kann.

Fazit

Ubuntu 25.10 ist aus meiner Sicht ein mutiges, innovatives Release. Ich kann die Kritik daran nur teilweise nachvollziehen. Die Nicht-LTS-Releases haben nun einmal einen gewissen Test-Charakter und sind insofern mit Fedora-Releases zu vergleichen, die auch gelegentlich etwas experimentell sind.

Das interessanteste neue Feature ist aus meiner Sicht definitiv die Speicherung der Crypto-Keys im TPM. Leider bin technisch nicht in der Lage, die Qualität/Sicherheit zu beurteilen. Noch hat das Feature einen experimentellen Status, aber falls TPM-Keys in Ubuntu 26.04 zu einem regulären Feature werden, würde es sich lohnen, das Ganze gründlich zu testen. Allerdings haben sich diese Mühe bisher wohl nur wenige Leute gemacht, was schade ist.

Generell hätte ich beim TPM-Keys-Feature mehr Vertrauen, wenn sich Ubuntu mit Red Hat, Debian etc. auf eine distributionsübergreifende Lösung einigen könnte.

Post Scriptum am 5.11.2025

Ich habe in den letzten Monaten aktuelle Versionen von CachyOS, Debian, Fedora, openSUSE und Ubuntu getestet. Immer wieder taucht die Frage auf, welche Distribution ich Einsteiger(inne)n empfehle. Ubuntu ist schon lange nicht mehr meine persönliche Lieblingsinstallation. Von den genannten fünf Distributionen hat Ubuntu aber definitiv das beste und einfachste Installationsprogramm. Und für den Start mit Linux ist das durchaus entscheidend …

Quellen/Links

TPM

Testberichte

Raspberry Pi OS Trixie

10. Oktober 2025 um 17:43

Einige Wochen nach dem Release von Debian 13 »Trixie« hat die Raspberry Pi Foundation auch Raspberry Pi OS aktualisiert. Abseits der Versionsnummern hat sich wenig geändert.

Der Raspberry Pi Desktop »PIXEL« sieht bis auf das Hintergrundbild ziemlich unverändert aus.

Raspberry Pi Imager

Die »Installation« von Raspberry Pi OS funktioniert wie eh und je: Sie laden die für Ihr Betriebssystem passende Version des Raspberry Pi Imagers herunter und wählen in drei Schritten Ihr Raspberry-Pi-Modell, die gewünschte Distribution und schließlich das Device Ihrer SD-Karte aus. Einfacher kann es nicht sein, würde man denken. Dennoch habe ich es geschafft, auf einem Rechner mit zwei SSDs (einmal Linux, diese SSD war aktiv in Verwendung, einmal Windows) die Installationsdaten auf die Windows-SSD statt auf die SD-Karte zu schreiben. Schuld war ich natürlich selbst, weil ich nur auf das Pictogram gesehen und nicht den nebenstehenden Text gelesen habe. Der Imager hat die SSD mit dem SD-Karten-Icon garniert.

Vorsicht bei der Bedienung des Raspberry Pi Imagers!

Wenn Sie möchten, können Sie im Imager eine Vorweg-Konfiguration durchführen. Das ist vor allem für den Headless-Betrieb praktisch, erspart aber auch erste Konfigurationsschritte im Assistenten, der beim ersten Start erscheint.

Die Vorab-Konfiguration ist vor allem für den Headless-Betrieb (also ohne Tastatur und Monitor) praktisch.

Versionsnummern

Raspberry Pi OS Trixie profitiert mit dem Versionssprung vom neueren Software-Angebot in Debian Trixie. Die aktuelleren Versionsnummern sind gleichzeitig das Hauptargument, auf Raspberry Pi OS Trixie umzusteigen.

Basis               Programmierung     Server
---------------     --------------     ---------------
Kernel     6.12     bash       5.2     Apache      2.4
glibc      2.41     gcc       14.2     CUPS        2.4
Wayland    1.23     git       2.47     MariaDB    11.8
NetworkMan 1.52     Java     21/25     OpenSSH    10.0
Mesa       25.0     PHP        8.4     PostgreSQL   17
Systemd     257     Python    3.13     Postfix    3.10
                                       Samba      4.22

Einheitliche Konfiguration

Die größte Änderung am Desktop »PIXEL« (vom Hintergrundbild abgesehen) betrifft die Konfiguration: Das Control Center umfasst nun auch Desktop-Einstellungen, die Bildschirm-Konfiguration und die Drucker-Konfiguration. Das ist definitiv ein Fortschritt im Vergleich zur bisher recht willkürlichen Aufteilung der Konfiguration über diverse Programme mit recht uneinheitlichem Erscheinungsbild.

Das Konfigurationsprogramm umfasst nun wesentlich mehr Module

gpioset

Die Syntax von gpioset hat sich geändert (vermutlich schon vor einiger Zeit, aber mir ist es erst im Rahmen meiner Tests mit Raspberry Pi OS Trixie aufgefallen):

  • Der gewünschte Chip (Nummer oder Device) muss mit der Option -c angegeben werden.
  • Das Kommando läuft per Default endlos, weil es nur so den eingestellten Status der GPIOs garantieren kann. Wenn Sie wie bisher ein sofortiges Ende wünschen, übergeben Sie die Option -t 0. Beachten Sie, dass -t nicht die Zeit einstellt, sondern für ein regelmäßiges Ein- und Ausschalten gedacht ist (toggle). Ich habe die Logik nicht verstanden, aber -t 0 führt auf jeden Fall dazu, dass das Kommando sofort beendet wird.

  • Alternativ kann das Kommando mit -z im Hintergrund fortgesetzt werden.

Das folgende Kommando gilt für Chip 0 (/dev/gpiochip0) und somit für die »gewöhnlichen« GPIOs. Dank -t 0 wird das Kommando sofort beendet.

gpioset -c 0 -t 0  7=1   # GPIO 7 (Pin 26) auf "high" stellen
sleep 3
gpioset -c 0 -t 0  7=0   # GPIO 7 (Pin 26) auf "low" stellen

Verwenden Sie besser das Kommando pinctrl, wenn Sie GPIOs im Terminal oder in bash-Scripts verändern wollen!

Sonstiges

Raspberry Pi OS verwendet nun per Default Swap on ZRAM. Nicht benötigte Speicherblöcke werden also komprimiert und in einer RAM-Disk gespeichert. Besonders gut funktioniert das bei Raspberry-Pi-Modellen mit viel RAM.

Raspberry Pi OS wird keine Probleme mit dem Jahr 2038 haben. Die zugrundeliegenden Änderungen stammen von Debian und wurden einfach übernommen.

Dank neuer Meta-Pakete ist es einfacher, von Raspberry Pi OS Lite auf die Vollversion umzusteigen. Das ist aus Entwicklersicht sicher erfreulich, der praktische Nutzen hält sich aber in Grenzen.

Mathematica steht aktuell noch nicht zur Verfügung, die Pakete sollen aber bald nachgeliefert werden.

Auch die Software für einige HATs (KI- und TV-Funktionen) müssen erst nachgereicht werden.

Fazit

Alles in allem ist das Raspberry-Pi-OS-Release unspektakulär. Das hat aber auch damit zu tun, dass Raspberry Pi OS bereits in den letztes Releases umfassend modernisiert wurde. Zur Erinnerung: Raspberry Pi OS verwendet Wayland, PipeWire, den NetworkManager etc., verhält sich also mittlerweile ganz ähnlich wie »normale« Linux-Distributionen. Diesmal gab es einfach weniger zu tun :-)

Bei meinen bisherigen Tests sind mir keine Probleme aufgefallen. Umgekehrt gibt es aber auch so wenig Neuerungen, dass ich bei einem vorhandenen Projekt dazu rate, die Vorgängerversion Raspberry Pi OS »Bookworm« einfach weiterlaufen zu lassen. Die Raspberry Pi Foundation rät von Distributions-Updates ab, und der Nutzen einer Neuinstallation steht in keinem Verhältnis zum Aufwand. Und es nicht auszuschließen, dass mit den vielen Versions-Updates doch die eine oder andere Inkompatibilität verbunden ist.

Quellen und Links

Tipp: Probleme mit Raspberry-Pi-Boot-Reihenfolge beheben

08. Oktober 2025 um 15:00

Mein Raspberry Pi 5 ist mit einem SSD-Hat ausgestattet (Pimoroni, siehe Blog). Auf der SSD ist Raspberry Pi OS Bookworm installiert. Jetzt möchte ich aber Raspberry Pi OS Trixie ausprobieren. Das System habe ich mit dem Raspberry Pi Imager auf eine SD-Card geschrieben. Sowohl SSD als auch SD-Karte sind angeschlossen, die Boot-Reihenfolge ist auf SD-Card first eingestellt.

Boot-Reihenfolge einstellen

raspi-config verändert die Variable BOOT_ORDER, die im EEPROM gespeichert wird. Die Variable kann mit `rpi-eeprom-config´ gelesen werden:

rpi-eeprom-config

  [all]
  BOOT_UART=0
  WAKE_ON_GPIO=0
  POWER_OFF_ON_HALT=1
  BOOT_ORDER=0xf461

0xf461 bedeutet (die Auswertung erfolgt mit den niedrigsten Bits zuerst, also von rechts nach links):

1 - Try SD card
6 - Try NVMe
4 - Try USB mass storage
f - RESTART (loop back to the beginning)

Die Einstellung ist also korrekt, trotzdem bootet der Pi hartnäckig von der SSD und ignoriert die SD-Card. Warum?

Analyse

Schuld sind die Partition-UUIDs! Die SSD habe ich vor eineinhalb Jahren mit dem SD Card Copier geklont. Die Option New Partition UUIDs habe ich nicht verwendet, ich sah keinen Grund dazu. Jetzt liegt folgendes Problem vor: Die SSD und die vom Rasbperry Pi Imager erzeugte SD-Card haben die gleichen Partition-UUIDs!

lsblk -o NAME,PARTUUID,UUID,MOUNTPOINT

  NAME          PARTUUID     UUID                                   MOUNTPOINT
  mmcblk0                                                            
  ├─mmcblk0p1   8a676486-01  1E1E-DAB6                              /boot/firmware
  └─mmcblk0p2   8a676486-02  b8316dab-786b-45e8-815c-3d4bbf198d98    

  nvme0n1                                                            
  ├─nvme0n1p1   8a676486-01  1E1E-DAB6                               
  ├─nvme0n1p2   8a676486-02  b8316dab-786b-45e8-815c-3d4bbf198d98   /
  └─nvme0n1p3   8a676486-03  293896b6-33ee-43de-87d4-56944456cec6 

Deswegen sind die UUIDs in /etc/fstab und in /boot/firmware/cmdline.txt nicht eindeutig:

cat /etc/fstab

  proc                  /proc           proc    defaults          0       0
  PARTUUID=8a676486-01  /boot/firmware  vfat    defaults          0       2
  PARTUUID=8a676486-02  /               ext4    defaults,noatime  0       1


cat /boot/firmware/cmdline.txt

  console=serial0,115200 console=tty1 root=PARTUUID=8a676486-02 rootfstype=ext4 \
    fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles cfg80211.ieee80211_regdom=AT

Solange beide Datenträger verbunden sind, ist nicht vorhersehbar, welche Partitionen tatsächlich genutzt werden. Am einfachsten wäre es natürlich, das Kabel zur SSD vorübergehend zu trennen; das ist aber nicht empfehlenswert, weil es hierfür keinen richtigen Stecker gibt, sondern nur eine sehr filigrane Kabelpressverbindungen, die möglichst nicht anrührt werden sollte.

Lösung

Ich habe den Pi ohne SD-Karte neu gebootet und dann

  • die Filesystem-UUIDs geändert,
  • /etc/fstab angepasst und
  • /boot/firmware/cmdline.txt ebenfalls angepasst.

Im Detail: Da die ursprüngliche Partitionierung der SSD von der SD-Karte übernommen wurde, liegt eine MBR-Partitionstabelle vor. In diesem Fall ergeben sich die Partition-UUIDs aus der Disk-ID plus Partitionsnummer. Die Disk-ID (Hex-Code mit 8 Stellen) kann mit fdisk geändert werden:

fdisk /dev/nvme0n1

  Welcome to fdisk (util-linux 2.38.1).
  Command (m for help): x.                   <-- aktiviert den Expertenmodus
  Expert command (m for help): i             <-- ID ändern
  Enter the new disk identifier: 0x1234fedc. <-- neue ID als Hex-Code
  Disk identifier changed from 0x8a676486 to 0x1234fedc.
  Expert command (m for help): r             <-- zurück ins Hauptmenü (return)
  Command (m for help): w                    <-- Änderungen speichern (write)

  The partition table has been altered.
  Syncing disks.

Mit fdisk -l vergewissern Sie sich, dass die Änderung wirklich funktioniert hat:

fdisk -l /dev/nvme0n1

  ...
  Disk identifier: 0x1234fedc

Weil der Datenträger in Verwendung ist, zeigt fdisk -l /dev/nvme0n1 weiter die alte UUID an. Sie müssen glauben, dass es funktioniert hat :-(

Bevor Sie einen Reboot machen, müssen Sie nun mit einem Editor auch /etc/fstab und /boot/firmware/cmdline.txt anpassen. In meinem Fall sehen die Dateien jetzt so aus:

cat /etc/fstab

  proc                  /proc           proc    defaults          0       0
  PARTUUID=1234fedc-01  /boot/firmware  vfat    defaults          0       2
  PARTUUID=1234fedc-02  /               ext4    defaults,noatime  0       1

cat /boot/firmware/cmdline.txt

  console=serial0,115200 console=tty1 root=PARTUUID=1234fedc-02 rootfstype=ext4 \
    fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles cfg80211.ieee80211_regdom=AT

Jetzt ist ein Reboot fällig, um zu testen, ob alles funktioniert. (Bei mir hat es im ersten Versuch NICHT funktioniert, weil ich bei fdisk das write-Kommando vergessen habe. Dann muss die SSD ausgebaut, ein USB-Gehäuse mit einem Computer verbunden und der Vorgang wiederholt werden.)

Ab jetzt sind die Partitions-UUIDs von SD-Karte und SSD voneinander unterscheidbar. Die Umschaltung des Boot-Systems mit raspi-config funktioniert, wie sie soll.

Quellen/Links

openSUSE Leap 16

03. Oktober 2025 um 07:58

Mit Version 16 springt openSUSE gewissermaßen in ein neues Zeitalter. Eine Weile war unklar, in welcher Form und auf welcher Basis openSUSE (überhaupt) weitergeführt wird. Letztlich haben sich die Entwickler zu einem pragmatischen Ansatz entschieden: Auch mit Version 16 bleibt openSUSE Leap eine »normale« Distribution mit Paket-Updates (kein Immutable System mit atomaren Updates) — so wie der große Enterprise-Bruder SLES 16. Für diesen Artikel habe ich einen ersten Blick auf die Distribution geworfen.

openSUSE Leap 16 mit KDE Desktop

Installation

openSUSE verwendet das neue, HTML-basiertes Installationsprogramm agama, dessen Minimalismus Parallelen zu Fedora zeigt. Das Programm läuft unter Gnome im Webbrowser Firefox im Full-Screen-Modus. Es ist mir zwar gelungen, den Voll-Screen-Modus zu beenden, ich konnte aber keine anderen Programme starten, d.h. es liegt kein vollwertiges Live-System vor.

Tipp 1: Mit [Strg]+[+] bzw. [Strg]+[-] können Sie den Zoomfaktor verändern. Per Kontextmenüs können Sie Screenshots erstellen. Je nach (erkannter) Bildschirmauflösung wird das seitliche Menü nicht dauerhaft angezeigt, kann aber über den Menü-Button eingeblendet werden.

Tipp 2: Es ist möglich, das Installationsprogramm von einem externen Rechner aus zu bedienen. Dazu wechseln Sie mit Strg+Alt+F1 in eine Konsole. Dort wird die URL (https://agama.local) und das Passwort angezeigt. Jetzt können Sie im Webbrowser die URL oder IP-Adresse angeben, müssen die unsichere Verbindung (selbst signiertes Zertifikat) akzeptieren und sich einloggen. Eigentlich cool!

Die Installation läuft im Webbrowser, der aber normalerweise nicht sichtbar ist (Fullscreen-Modus)
Ein Wechseln in die Textkonsole offenbart einen Login-Link zur Weboberfläche des Installers

Im ersten Schritt stellen Sie rechts oben Sprache und Tastaturlayout für das Installationsprogramm ein und entscheiden Sie sich zwischen Leap 16 und Leap Micro 6.2. (Ich habe nur ersteres ausprobiert.)

Einstellung der Sprache des Setup-Programms (rechts oben) und Auswahl des Grundsystems

Jetzt beginnt die eigentliche Installation. Wenn Sie einen statischen Hostnamen wünschen, geben Sie den gewünschten Namen an. Unter Lokalisierung stellen Sie nochmals (!) Sprache, Tastatur und Zeitzone ein — dieses Mal für das zu installierende System. Eleganter wäre, wenn der Installer die bereits durchgeführten Einstellungen einfach übernehmen würde, aber sei’s drum.

Neuerliche Spracheinstellung, jetzt für das Zielsystem

Im Punkt Netzwerk können Sie eine WLAN-Konfiguration durchnehmen. Ethernet-Verbindungen mit DHCP werden automatisch hergestellt.

Damit kommen wir zur Partitionierung und zum Einrichten der Dateisystemeim Punkt Speicherung. Der Installer schlägt vor, drei Partitionen einzurichten: /boot/efi, eine Swap-Partition und eine Systempartition mit btrfs-Dateisystem und neu Subvolumes (/boot, /var, /root, /home usw.). Optional können Sie das Setup auf LVM umstellen (was im Zusammenspiel mit btrfs aber selten große Vorteile mit sich bringt) und eine Verschlüsselung aktivieren. Für Installationen in eine virtuelle Maschine oder auf einen Rechner, wo Sie einfach die gesamte SSD nutzen möchten, ist das Layout OK.

Wenig Auswahl bei der Partitionierung und Einrichtung der Dateisysteme

Auf »echter« Hardware schlägt das Setup-Programm vor, alle vorhandenen Partitionen des Datenträgers zu löschen und dann openSUSE zu installieren. VORSICHT!! Das Setup-Programm bietet die Möglichkeit, auf die Partitionierung Einfluss zu nehmen, die Menüs sind aber nicht ganz leicht zu erkennen (siehe die folgenden fünf Screenshots).

Vorsicht: Per Default löscht der Installer alle vorhandenen Betriebssysteme
Eine manuelle Partitionierung ist möglich, aber die Optionen sind gut versteckt
Wenn Sie einzelne Partitionen oder Dateisysteme ändern wollen, ist hier das entscheidende Menü
Der Editor für eine Partition / ein Dateisystem
Parallel-Installation von openSUSE zu diversen anderen Linux-Distributionen

Aufpassen müssen Sie auch beim Punkt Software: Standardmäßig wird nur eine Minimalinstallation ohne Desktop-System durchgeführt! Sie müssen die Auswahl ändern und haben dann die Wahl zwischen Gnome, KDE und XFCE.

Bei der Software-Auswahl muss ein Desktop-System ausgewählt werden!

Zuletzt richten Sie einen Benutzer ein, der automatisch sudo-Rechte erhält. Installieren startet nun die Installation.

Jetzt läuft die Installation

Ich habe mehrere Installationen in VMs durchgeführt, eine »echte« auf meinen Mini-PC. Echte Fehler sind keine aufgetreten, aber intuitiv ist die Bedienung des neuen Installers wirklich nicht. Warum muss das Rad ununterbrochen neu erfunden werden, wenn soviele andere Linux-Probleme einer Lösung harren?

Software-Versionen und Paketverwaltung

Die Versionsnummern wichtiger Basispakete stimmen zum größten Teil mit jenen von Debian 13 überein.

Basis               Programmierung     Server
---------------     --------------     ---------------
Kernel     6.12     bash       5.2     Apache      2.4
glibc      2.40     gcc       15.1     CUPS        2.4
Wayland    1.24     git       2.51     MariaDB    11.8
GRUB       2.12     Java     17/21     OpenSSH    10.0
Mesa       24.3     PHP        8.4     PostgreSQL   17
Systemd     257     Podman     5.4     Postfix    3.10
NetworkMan 1.52     Python    3.13     qemu/KVM   10.0
Gnome        48                        Samba      4.22
KDE Plasma  6.4

Generell ist das Angebot in Leap 16 im Vergleich zu den Vorgängerversionen 15.n aber geschrumpft, worauf LinuxUser hinweist (32.400 Pakete im Vergleich zu 44.700). Für Desktop-Programme ist Flatpak die beste Alternative. Darüberhinaus wird sich weisen, wie groß das Angebot von Paketen sein wird, die in externen Repositories angeboten werden.

Für Multimedia-Pakete war in der Vergangenheit Packman zuständig. Es ist zu erwarten, dass es dort in Zukunft ein Leap-16-Repository geben wird. Aktuell ist das aber noch nicht der Fall.

Am Fundament der Paketverwaltung hat sich wenig geändert — dafür sind weiterhin rpm (Low-Level) und zypper (High-level) zuständig. Desktop-Programme können wahlweise mit Software (Gnome) oder Discover (KDE) installiert werden. Das allumfassende Paketverwaltungs-Modul innerhalb von YaST gibt es nicht mehr.

Standardmäßig sind nur die Repos repo-oss und repo-openh264 aktiv:

zypper repos

  Repository priorities are without effect. All enabled repositories share the same priority.

  # | Alias                       | Name                      | Enabled | GPG Check | Refresh
  --+-----------------------------+---------------------------+---------+-----------+--------
  1 | Leap                        | Leap 16.0                 | No      | ----      | ----
  2 | openSUSE:repo-non-oss       | repo-non-oss (16.0)       | No      | ----      | ----
  3 | openSUSE:repo-non-oss-debug | repo-non-oss-debug (16.0) | No      | ----      | ----
  4 | openSUSE:repo-openh264      | repo-openh264 (16.0)      | Yes     | (r ) Yes  | Yes
  5 | openSUSE:repo-oss           | repo-oss (16.0)           | Yes     | (r ) Yes  | Yes
  6 | openSUSE:repo-oss-debug     | repo-oss-debug (16.0)     | No      | ----      | ----
  7 | openSUSE:repo-oss-source    | repo-oss-source (16.0)    | No      | ----      | ----

Für Verwirrung — auch in Software und Discover — kann das inaktive Repo Leap 16.0 sorgen. Es bezieht sich aber nur auf das Installationsmedium und wird im weiteren Betrieb tatsächlich nicht mehr gebraucht.

Das non-oss-Repo enthält diverse proprietäre Programme:

zypper modifyrepo --enable openSUSE:repo-non-oss

AdobeICCProfiles
bladeRF-fpga-firmware
bladeRF-fx3-firmware
bpg-fonts
discord
iozone
iozone-doc
ivtv-firmware
john-wordlists
Leap-Addon-NonOss
Leap-Addon-NonOss-release
libunrar-devel
libunrar7_1_10
libunrar7_1_10-x86-64-v3
ncat
ndiff
netperf
nmap
non_oss
nping
opera
patterns-non_oss
patterns-non_oss_opt
perlref
Reaction
Reaction-data
steamcmd
stream
unrar
wine-mono
xv
xv-doc
zenmap

Erste Schritte unter KDE

Ich habe openSUSE sowohl mit Gnome als auch mit KDE installiert, aber die weiteren Tests dann in einem KDE-System durchgeführt. KDE verwendet sowohl in virtuellen Maschinen als auch auf echter Hardware X11. Das ist ein wenig enttäuschend, Fedora 42 läuft per default mit Wayland (Fedora 43 beta natürlich auch), und meine Erfahrungen damit waren ausgezeichnet.

Der Versuch, die Auflösung meines 4k-Monitors auf 1920×1080 zu reduzieren, scheiterte. Der Bildschirminhalt wird komplett falsch skaliert, oben und unter im Monitor bleibt ein schwarzer Streifen. Bei 2560×1600 kam gar kein Bild zustande. Diese Probleme hatte ich noch nie. Ich bin dann bei der 4k-Auflösung geblieben und habe die Skalierung verändert. Das funktioniert unter KDE glücklicherweise wunderbar.

Zur Paketverwaltung ist Discover vorgesehen. Prinzipiell funktioniert das Programm zufriedenstellend. Irritierend ist auch hier die (korrekt!) inaktive Paketquelle Leap 16.

Paketverwaltung mit Discover. Es irritiert, dass »Leap 16« nicht aktiv ist — aber diese Paketquelle ist nur für die Installation relevant, danach nicht mehr.

Bei der Systemadministration sind Sie auf die Module der KDE-Systemeinstellungen angewiesen. YaST steht nicht mehr zur Verfügung.

Wie schon erwähnt, entscheidet sich der Installer, wenn Sie nicht andere Optionen einstellen, für ein btrfs-Dateisystem mit vielen Subvolumes aber ohne Komprimierung.

cat /etc/fstab 

UUID=c3b4e719-0afe-4ad0-aea0-ad6a8c5c81e1  /                       btrfs  defaults                      0  0
UUID=c3b4e719-0afe-4ad0-aea0-ad6a8c5c81e1  /var                    btrfs  subvol=/@/var                 0  0
UUID=c3b4e719-0afe-4ad0-aea0-ad6a8c5c81e1  /usr/local              btrfs  subvol=/@/usr/local           0  0
UUID=c3b4e719-0afe-4ad0-aea0-ad6a8c5c81e1  /srv                    btrfs  subvol=/@/srv                 0  0
UUID=c3b4e719-0afe-4ad0-aea0-ad6a8c5c81e1  /root                   btrfs  subvol=/@/root                0  0
UUID=c3b4e719-0afe-4ad0-aea0-ad6a8c5c81e1  /opt                    btrfs  subvol=/@/opt                 0  0
UUID=c3b4e719-0afe-4ad0-aea0-ad6a8c5c81e1  /home                   btrfs  subvol=/@/home                0  0
UUID=c3b4e719-0afe-4ad0-aea0-ad6a8c5c81e1  /boot/grub2/x86_64-efi  btrfs  subvol=/@/boot/grub2/x86_64-efi  0  0
UUID=c3b4e719-0afe-4ad0-aea0-ad6a8c5c81e1  /boot/grub2/i386-pc     btrfs  subvol=/@/boot/grub2/i386-pc  0  0
UUID=EC5D-8DB9                             /boot/efi               vfat   utf8                          0  2
UUID=c3b4e719-0afe-4ad0-aea0-ad6a8c5c81e1  /.snapshots             btrfs  subvol=/@/.snapshots          0  0

lsblk

nvme1n1     259:6    0   1.8T  0 disk 
├─nvme1n1p1 259:7    0 372.5G  0 part 
├─nvme1n1p2 259:8    0     1G  0 part /boot/efi
├─nvme1n1p3 259:9    0   400G  0 part 
├─nvme1n1p4 259:10   0   100G  0 part 
├─nvme1n1p5 259:11   0   200G  0 part 
├─nvme1n1p6 259:12   0 279.4G  0 part 
├─nvme1n1p7 259:13   0 244.1G  0 part 
└─nvme1n1p8 259:14   0   100G  0 part /var
                                      /usr/local
                                      /srv
                                      /root
                                      /opt
                                      /home
                                      /boot/grub2/i386-pc
                                      /boot/grub2/x86_64-efi
                                      /.snapshots
                                      /

Neuerungen

Hinter den Kulissen gibt es eine Menge Neuerungen im Vergleich zu Version 15.n (siehe die Release Notes). Ganz kurz die wichtigsten Details:

  • Wie schon erwähnt: YaST gibt es nicht mehr. openSUSE empfiehlt, Cockpit zur Administration zu verwenden.
  • Per Default kommt SELinux zum Einsatz, AppArmor ist immerhin noch als Option verfügbar.

  • openSUSE 16 ist year-2038-safe.

  • openSUSE 16 soll bis 2031 jährlich mit neuen Versionen gepflegt werden. (Das wäre dann Version 16.6.) openSUSE 17 soll dann 2032 erscheinen. Warten wir ab, ob es dabei bleibt.

  • openSUSE 16 setzt bei x86-CPUs den V2-Level voraus. Konkret bedeutet das, dass die CPUs nicht älter als gut 15 Jahre sein dürfen (Details). 32-Bit-CPUs werden nicht mehr unterstützt.

  • Auf Rechnern mit NVIDIA-GPU werden die entsprechenden Paketquellen automatisch aktiviert und die proprietären Treiber installiert. Solche Systeme sollte jetzt out-of-the-box funktionieren. (Habe ich aber nicht getestet, mein Testrechner hat eine AMD-CPU/GPU.)

  • PulseAudio wurde durch PipeWire ersetzt.

  • Per Default darf root sich nicht via SSH anmelden. Verwenden Sie einen Account mit sudo-Rechten, oder ändern Sie ggfs. /etc/ssh/sshd_config.

  • libvirt + Docker: Wenn Sie Docker und libvirt (Qemu/KVM) einsetzen, funktioniert in den virtuellen Maschinen das Networking nicht mehr. Schuld ist Docker, das nicht in der Lage ist, sein Firewall-System auf nft umzustellen :-( Die Lösung ist gleich wie unter Fedora: Sie müssen das libvirt-Firewall-Backend zurück auf iptables setzen (Details).

  • nmap: Das populäre nmap-Tool hat die Lizenz geändert. openSUSE enthält die letzte Version unter der alten Lizenz.

Migrationstool

Es gibt ein neues Migrationstool, mit dem Sie einerseits openSUSE 15.6 auf Version 16.0 upgraden und andererseits einen Wechsel zwischen verschiedenen SUSE-Varianten (Leap, Tumblewheed, Slowroll, Enterprise) durchführen können. Ich habe das Programm allerdings nicht ausprobiert.

Das neue opensuse-migration-tool

SSH-Server und Firewall

Der SSH-Server wird standardmäßig installiert, läuft aber nicht. Abhilfe:

systemctl enable --now sshd

Als Firewall läuft standardmäßig das von Fedora und RHEL bekannte Programm firewalld. Standardmäßig sind nur die Ports für SSH und den DHCP-Client offen:

firewall-cmd --list-services

  dhcpv6-client ssh

Qemu/KVM-Zwischenablage

Wenn Sie openSUSE 16 in einer virtuellen Maschine mit Qemu ausführen, funktioniert die Zwischenablage nicht. Abhilfe: zypper install spice-vdagent, unter Gnome (Wayland!) zusätzlich zypper install wl-clipboard.

Fazit

In openSUSE 16 ist viel Zeit, Mühe und Liebe geflossen — und das Ergebnis kann sich wirklich sehen lassen. Die Frage ist allerdings, ob das reicht. Das Angebot am Distributionsmarkt ist überwältigend groß, und mir fällt es ehrlich schwer, eine klare Zielgruppe für openSUSE zu erkennen.

  • Den Mainstream decken Debian, Fedora und Ubuntu ab. Meine Empfehlung an Linux-Desktop-Einsteiger geht ganz stark in diese Richtung.
  • Server-seitig wieder Debian und Ubuntu plus RHEL und Klone.
  • Wer gerne immer Up-to-date ist: Arch Linux (oder ein Derivat).
  • CachyOS kitzelt maximale Performance aus dem Rechner, verbunden mit den Arch-Linux-Vorteilen und aktuell einem Hype-Faktor.
  • Linux Mint vielleicht für Einsteiger. (Ich war allerdings nie ein riesiger Mint-Fan und sehe wenig Vorteile im Vergleich zu Debian/Fedora/Ubuntu.)
  • Pop!_OS als Distribution für system76-Kunden. Und falls der COSMIC-Desktop je fertig + stabil wird, könnte die Distribution ein interessantes Angebot für technisch orientierte Anwender werden (Entwickler/Admins/Freaks).

Im Vergleich zu Debian/Fedora/Ubuntu ist in Leap 16 das Software-Angebot geringer. Die Aktualität vieler Pakete kann wiederum mit Fedora und Ubuntu nicht mithalten. Als ausgesprochen einsteigerfreundlich empfinde ich Leap auch nicht (schon gar nicht die Installation). YaST als Argument fällt weg. (Das Konfigurations-Tool wurde schon in den letzten Jahren nur noch sehr halbherzig gepflegt.) Der Dateisystem-Editor von openSUSE während der Installation war Weltklasse, aus meiner Sicht besser als bei allen anderen Distributionen. Er ist dem neuen Installationsprogramm zum Opfer gefallen.

Wer sollte sich also für openSUSE entscheiden, und warum? openSUSE 16 ist natürlich eine super Trainings-Umgebung für SLES 16. Aber ist das genug? Selbst innerhalb der SUSE-Welt empfand ich Tumblewheel (oder Slowroll) in den letzten Jahren deutlich spannender als Leap.

Quellen/Links

Neues von Linux: 6.17 veröffentlicht sowie anstehende bcachefs-Entfernung

30. September 2025 um 21:52

Kurz notiert: in den letzten beiden Tagen gab es einige Nachrichten vom Linux-Kernel.

Zuallererst wurde der Kernel in Version 6.17 veröffentlicht. Die Änderungen führen einerseits bessere Steueroption zur Auswahl von Prozessormitigationen, Live-Patching auf 64-Bit Arm sowie einige Verbesserungen an Dateisystemen wie ext4 und Btrfs ein. Die historische Sonderbehandlung von Einprozessorsystemen (ohne SMP) wird rückgebaut. Wer an allen Änderungen im Detail interessiert ist, kann einen Blick in die entsprechenden LWN Artikel oder bei LinuxNews werfen.

Apropos Dateisysteme: das jüngst aufgenommene bcachefs, um das sich vor und während seines Aufenthaltes im Mainline-Zweig viele kontroverse Diskussionen ergaben, wird Mainline im nächsten Release (6.18) voraussichtlich wieder verlassen. Torvalds kündigte im Commit zur Entfernung an, dass es als DKMS-Paket ausgeliefert werden soll.

Damit endet allerdings sicherlich auch die Maßgabe, dass die Module, von denen bcachefs abhängig ist, auf das Dateisystem abgestimmt werden. Hier gab es genau Streit, weil die Änderungen, die Kent Overstreet erwartet hatte, von den zuständigen Maintainern äußerst kritisch aufgenommen wurden. Ob die Änderungen in den anderen Modulen nun wieder zurückgesetzt werden, bleibt abzusehen.

Bilder unter Linux effizient per Kommandozeile skalieren

22. September 2025 um 04:00

Wer regelmäßig Webprojekte betreut, kennt das Problem: Große Bilddateien können die Ladezeiten einer Website deutlich beeinträchtigen und wirken sich negativ auf die Suchmaschinenoptimierung (SEO) aus. Besonders dann, wenn eine größere Anzahl von Fotos verarbeitet werden muss, ist eine manuelle Bearbeitung mit grafischen Programmen nicht nur zeitraubend, sondern auch ineffizient.

In einem aktuellen Fall erhielt ich rund 120 Fotos eines Fotografen, die für eine Galerie auf einer Webseite vorgesehen waren. Die Bilddateien lagen jedoch in einer Größe vor, die weder performant für das Web war noch den SEO-Richtlinien entsprach.

Da ich für meine Projekte eine maximale Bildbreite von 1024 Pixeln definiert habe, griff ich – wie bereits im Artikel „Bilder per Batch skalieren“ beschrieben – auf ein bewährtes Werkzeug aus dem Open-Source-Bereich zurück: ImageMagick.

Mit einem einfachen Befehl ließ sich die gesamte Bildersammlung direkt über das Terminal verarbeiten:

mogrify -resize 1024x1024 *.jpg

Dieser Befehl skaliert alle .jpg-Dateien im aktuellen Verzeichnis auf eine maximale Kantenlänge von 1024 Pixeln – unter Beibehaltung des Seitenverhältnisses. Innerhalb weniger Sekunden war der gesamte Stapel an Bildern webgerecht optimiert.

Solche kleinen, aber wirkungsvollen Tools aus der Open-Source-Welt sind nicht nur ressourcenschonend, sondern tragen auch dazu bei, Arbeitsabläufe deutlich zu beschleunigen – ganz ohne aufwendige GUI-Programme oder proprietäre Softwarelösungen.

Der Beitrag Bilder unter Linux effizient per Kommandozeile skalieren erschien zuerst auf intux.de.

gpt-oss-20b auf einer iGPU 780M ausführen

08. September 2025 um 17:40

Die Aufgabenstellung ist sehr speziell, und dementsprechend wird dieser Beitrag vermutlich nur wenig Leute interessieren. Aber egal: Ich habe mich drei Tage damit geärgert, vielleicht profitieren ein paar Leser von meinen Erfahrungen …

Die Zielsetzung ist bereits in der Überschrift beschrieben. Ich besitze einen Mini-PC mit AMD 8745H-CPU und 32 GiB RAM. Die CPU enthält auch eine integrierte GPU (Radeon 780M). Auf diesem Rechner wollte ich das momentan sehr beliebte Sprachmodell gpt-oss-20b ausführen. Dieses Sprachmodell ist ca. 11 GiB groß, umfasst 20 Milliarden Parameter in einer etwas exotischen Quantifizierung. (MXFP4 wurde erst 2024 standardisiert und bildet jeden Parameter mit nur 4 Bit ab. Die Besonderheit besteht darin, dass für unterschiedliche Teile des Modells unterschiedliche Skalierungsfaktoren verwendet werden, so dass die Parameter trotz der wenigen möglichen Werte einigermaßen exakt abgebildet werden können.)

Das Sprachmodell wird von der Firma OpenAI kostenlos angeboten. Die Firma gibt an, dass die 20b-Variante ähnlich gute Ergebnisse wie das bis 2024 eingesetzt kommerzielle Modell o3-mini liefert, und auch KI-Experte Simon Willison singt wahre Lobeshymnen auf das Modell.

PS: Ich habe alle Tests unter Fedora 42 durchgeführt.

Warum nicht Ollama?

Für alle, die nicht ganz tief in die lokale Ausführung von Sprachmodellen eintauchen wollen, ist Ollama zumeist die erste Wahl. Egal, ob unter Windows, Linux oder macOS, viele gängige Sprachmodelle können damit unkompliziert ausgeführt werden, in der Regel mit GPU-Unterstützung (macOS, Windows/Linux mit NVIDIA-GPU bzw. mit ausgewählten AMD-GPUs).

Bei meiner Hardware — und ganz allgemein bei Rechnern mit einer AMD-iGPU — ist Ollama aktuell aber NICHT die erste Wahl:

ROCm: Ollama setzt bei NVIDIA-GPUs auf das Framework CUDA (gut), bei AMD-GPUs auf das Framework ROCm (schlecht). Dieses Framework reicht alleine vermutlich als Grund, warum AMD so chancenlos gegen NVIDIA ist. Im konkreten Fall besteht das Problem darin, dass die iGPU 780M (interner ID gfx1103) offiziell nicht unterstützt wird. Die Empfehlung lautet, ROCm per Umgebungsvariable zu überzeugen, dass die eigene GPU kompatibel zu einem anderen Modell ist (HSA_OVERRIDE_GFX_VERSION=11.0.2). Tatsächlich können Sprachmodelle dann ausgeführt werden, aber bei jeder Instabilität (derer es VIELE gibt), stellt sich die Frage, ob nicht genau dieser Hack der Anfang aller Probleme ist.

Speicherverwaltung: Auch mit diesem Hack scheitert Ollama plus ROCm-Framework an der Speicherverwaltung. Bei AMD-iGPUs gibt es zwei Speicherbereiche: fix per BIOS allozierten VRAM sowie dynamisch zwischen CPU + GPU geteiltem GTT-Speicher. (Physikalisch ist der Speicher immer im RAM, den sich CPU und GPU teilen. Es geht hier ausschließlich um die Speicherverwaltung durch den Kernel + Grafiktreiber.)

Ollama alloziert zwar den GTT-Speicher, aber maximal so viel, wie VRAM zur Verfügung steht. Diese (Un)Logik ist am besten anhand von zwei Beispielen zu verstehen. Auf meinem Testrechner habe ich 32 GiB RAM. Standardmäßig reserviert das BIOS 2 GiB VRAM. Der Kernel markiert dann 14 GiB als GTT. (Das kann bei Bedarf mit den Kerneloptionen amdttm.pages_limit und amdttm.page_pool_size verändert werden.) Obwohl mehr als genug Speicher zur Verfügung steht, sieht Ollama eine Grenze von 2 GiB und kann nur winzige LLMs per GPU ausführen.

Nun habe ich im BIOS das VRAM auf 16 GiB erhöht. Ollama verwendet nun 16 GiB als Grenze (gut), nutzt aber nicht das VRAM, sondern den GTT-Speicher (schlecht). Wenn ich nun ein 8 GiB großes LLM mit Ollama ausführen, dann bleiben fast 16 GiB VRAM ungenutzt! Ollama verwendet 8 GiB GTT-Speicher, und für Ihr Linux-System bleiben gerade einmal 8 GiB RAM übrig. Es ist zum aus der Haut fahren! Im Internet gibt es diverse Fehlerberichte zu diesem Problem und sogar einen schon recht alten Pull-Request mit einem Vorschlag zur Behebung des Problems. Eine Lösung ist aber nicht Sicht.

Ich habe mich mehrere Tage mit Ollama geärgert. Schade um die Zeit. (Laut Internet-Berichten gelten die hier beschriebenen Probleme auch für die gehypte Strix-Halo-CPU.)

Next Stop: llama.cpp

Etwas Internet-Recherche liefert den Tipp, anstelle von Ollama das zugrundeliegende Framework llama.cpp eben direkt zu verwenden. Ollama greift zwar selbst auf llama.cpp zurück, aber die direkte Verwendung von llama.cpp bietet andere GPU-Optionen. Dieser Low-Level-Ansatz ist vor allem bei der Modellauswahl etwas umständlicher. Zwei Vorteile können den Zusatzaufwand aber rechtfertigen:

  • Die neuste Version von llama.cpp unterstützt oft ganz neue Modelle, mit denen Ollama noch nicht zurechtkommt.
  • llama.cpp kann die GPU auf vielfältigere Weise nutzen als Ollama. Je nach Hardware und Treiber kann so eventuell eine höhere Geschwindigkeit erzielt bzw. der GPU-Speicher besser genutzt werden, um größere Modelle auszuführen.

Die GitHub-Projektseite beschreibt mehrere Installationsvarianten: Sie können llama.cpp selbst kompilieren, den Paketmanager nix verwenden, als Docker-Container ausführen oder fertige Binärpakete herunterladen (https://github.com/ggml-org/llama.cpp/releases). Ich habe den einfachsten Weg beschritten und mich für die letzte Option entschieden. Der Linux-Download enthält genau die llama.cpp-Variante, die für mich am interessantesten war — jene mit Vulkan-Unterstützung. (Vulkan ist eine 3D-Grafikbibliothek, die von den meisten GPU-Treibern unter Linux durch das Mesa-Projekt gut unterstützt wird.) Die Linux-Version von llama.cpp wird anscheinend unter Ubuntu kompiliert und getestet, dementsprechend heißt der Download-Name llama-<version>-bin-ubuntu-vulkan-x86.zip. Trotz dieser Ubuntu-Affinität ließen sich die Dateien bei meinen Tests aber problemlos unter Fedora 42 verwenden.

Nach dem Download packen Sie die ZIP-Datei aus. Die resultierenden Dateien landen im Unterverzeichnis build/bin. Es bleibt Ihnen überlassen, ob Sie die diversen llama-xxx-Kommandos direkt in diesem Verzeichnis ausführen, das Verzeichnis zu PATH hinzufügen oder seinen Inhalt in ein anderes Verzeichnis kopieren (z.B. nach /usr/local/bin).

cd Downloads
unzip llama-b6409-bin-ubuntu-vulkan-x64.zip
cd build/bin
./llama-cli --version

  loaded RPC backend from ./build/bin/libggml-rpc.so
  ggml_vulkan: Found 1 Vulkan devices:
  ggml_vulkan: 0 = AMD Radeon 780M Graphics (RADV PHOENIX) (radv) ...
  loaded Vulkan backend from ./build/bin/libggml-vulkan.so
  loaded CPU backend from ./build/bin/libggml-cpu-icelake.so
  version: 6409 (d413dca0)
  built with cc (Ubuntu 11.4.0-1ubuntu1~22.04.2) for x86_64-linux-gnu

Für die GPU-Unterstützung ist entscheidend, dass auf Ihrem Rechner die Bibliotheken für die 3D-Bibliothek Vulkan installiert sind. Davon überzeugen Sie sich am einfachsten mit vulkaninfo aus dem Paket vulkan-tools. Das Kommando liefert fast 4000 Zeilen Detailinformationen. Mit einem Blick in die ersten Zeilen stellen Sie fest, ob Ihre GPU unterstützt wird.

vulkaninfo | less

  Vulkan Instance Version: 1.4.313
  Instance Extensions: count = 24
    VK_EXT_acquire_drm_display  : extension revision 1
    VK_EXT_acquire_xlib_display : extension revision 1
    ...
  Layers: count = 1
     VK_LAYER_MESA_device_select
     Devices: count = 2
       GPU id = 0 (AMD Radeon 780M Graphics (RADV PHOENIX))
       GPU id = 1 (llvmpipe (LLVM 20.1.8, 256 bits))
  ...

Erste Tests

Um llama.cpp auszuprobieren, brauchen Sie ein Modell. Bereits für Ollama heruntergeladene Modelle sind leider ungeeignet. llama.cpp erwartet Modelle als GGUF-Dateien (GPT-Generated Unified Format). Um die Ergebnisse mit anderen Tools leicht vergleichen zu können, verwende ich als ersten Testkandidat immer Llama 3. Eine llama-taugliche GGUF-Variante von Llama 3.1 mit 8 Milliarden Parametern finden Sie auf der HuggingFace-Website unter dem Namen bartowski/Meta-Llama-3.1-8B-Instruct-GGUF:Q4_K_M.

Das folgende Kommando lädt das Modell von HuggingFace herunter (Option -hf), speichert es im Verzeichnis .cache/llama.cpp, lädt es, führt den als Parameter -p angegebenen Prompt aus und beendet die Ausführung dann. In diesem und allen weiteren Beispielen gehe ich davon aus, dass sich die llama-Kommandos in einem PATH-Verzeichnis befinden. Alle Ausgaben sind aus Platzgründen stark gekürzt.

llama-cli -hf bartowski/Meta-Llama-3.1-8B-Instruct-GGUF:Q4_K_M \
  -p 'bash/Linux: explain the usage of rsync over ssh'

  ... (diverse Debugging-Ausgaben)
  Running in interactive mode.
  - Press Ctrl+C to interject at any time.
  - Press Return to return control to the AI.
  - To return control without starting a new line, end your input with '/'.
  - If you want to submit another line, end your input with '\'.
  - Not using system message. To change it, set a different value via -sys PROMPT

> bash/Linux: explain the usage of rsync over ssh

  rsync is a powerful command-line utility that enables you to 
  synchronize files and directories between two locations. Here's 
  a breakdown of how to use rsync over ssh: ...

> <Strg>+<D>

         load time =  2231.02 ms
  prompt eval time =   922.83 ms /  43 tokens (46.60 tokens per second)
         eval time = 31458.46 ms / 525 runs   (16.69 tokens per second)

Sie können llama-cli mit diversen Optionen beeinflussen, z.B. um verschiedene Rechenparameter einzustellen, die Länge der Antwort zu limitieren, den Systemprompt zu verändern usw. Eine Referenz gibt llama-cli --help. Deutlich lesefreundlicher ist die folgende Seite:

https://github.com/ggml-org/llama.cpp/discussions/15709

Mit llama-bench können Sie diverse Benchmark-Tests durchführen. Im einfachsten Fall übergeben Sie nur das Modell in der HuggingFace-Notation — dann ermittelt das Kommando die Token-Geschwindigkeit für das Einlesen des Prompts (Prompt Processing = pp) und die Generierung der Antwort (Token Generation = tg). Allerdings kennt llama-bench die Option -hf nicht; vielmehr müssen Sie mit -m den Pfad zur Modelldatei übergeben:

llama-bench -m ~/.cache/llama.cpp/bartowski_Meta-Llama-3.1-8B-Instruct-GGUF_Meta-Llama-3.1-8B-Instruct-Q4_K_M.gguf

  model                         size     test   token/s (Tabelle gekürzt ...)
  -----------------------  ---------  -------  --------
  llama 8B Q4_K - Medium    4.58 GiB    pp512    204.03
  llama 8B Q4_K - Medium    4.58 GiB    tg128     17.04

Auf meinem Rechner erreicht llama.cpp mit Vulkan nahezu eine identische Token-Rate wie Ollama mit ROCm (aber ohne die vielen Nachteile dieser AMD-Bibliothek).

AMD-Optimierung

Bei meinen Tests auf dem schon erwähnten Mini-PC mit AMD 8745H-CPU mit der iGPU 780M und 32 GiB RAM funktionierte llama.cpp mit Vulkan viel unkomplizierter als Ollama mit ROCm. Ich habe die VRAM-Zuordnung der GPU wieder zurück auf den Defaultwert von 2 GiB gestellt. Per Default steht llama.cpp auf meinem Rechner dann ca. der halbe Arbeitsspeicher (2 GiB VRAM plus ca. 14 GiB GTT) zur Verfügung. Vulkan kann diesen Speicher ohne merkwürdige Hacks mit Umgebungsvariablen korrekt allozieren. Das reicht ohne jedes Tuning zur Ausführung des Modells gpt-20b aus (siehe den folgenden Abschnitt). So soll es sein!

Wenn Sie noch mehr Speicher für die LLM-Ausführung reservieren wollen, müssen Sie die Kerneloptionen pages_limit und pages_pool_size des AMDGPU-Treibers verändern. Wenn Sie 20 GiB GGT-Speicher nutzen wollen, müssen Sie für beide Optionen den Wert 5242880 angeben (Anzahl der 4-kByte-Blöcke):

# neue Datei /etc/modprobe.d/amd.conf
# 20 * 1024 * 1024 * 1024 / 4096 = 20 * 1024 * 256 = 5242880
options ttm pages_limit=5242880
options ttm page_pool_size=5242880

Danach aktualisieren Sie die Initrd-Dateien und führen einen Neustart durch:

sudo update-initramfs -u                   # Debian und Ubuntu
sudo dracut --regenerate-all --force       # Fedora, RHEL, SUSE

sudo reboot

sudo dmesg | grep "amdgpu.*memory"

  amdgpu: 2048M of VRAM memory ready   (<-- laut BIOS-Einstellung)
  amdgpu: 20480M of GTT memory ready   (<-- laut /etc/modprobe.d/amd.conf)

Modellauswahl

Mit llama.cpp können Sie grundsätzlich jedes Modell im GPT-Generated Unified Format (GGUF) ausführen. Auf der Website von HuggingFace stehen Tausende Modelle zur Wahl:

https://huggingface.co/models?pipeline_tag=text-generation&library=gguf

Die Herausforderung besteht darin, für die eigenen Zwecke relevante Modelle zu finden. Generell ist es eine gute Idee, besonders populäre Modelle vorzuziehen. Außerdem werden Sie rasch feststellen, welche Modellgrößen für Ihre Hardware passen. Die höhere Qualität großer Modelle bringt nichts, wenn die Geschwindigkeit gegen Null sinkt.

gpt-oss-20b

Eine llama.cpp-kompatible Version finden hat ggml-org auf HuggingFace gespeichert. Sofern ca. 15 GiB freier VRAM zur Verfügung stehen (unter AMD: VRAM + GTT), führt llama.cpp das Modell problemlos und beachtlich schnell aus. Beachten Sie, dass es sich hier um ein »Reasoning-Modell« handelt, das zuerst über das Problem nachdenkt und diesen Denkprozess auch darstellt. Danach wird daraus das deutlich kompaktere Ergebnis präsentiert.

llama-cli -hf ggml-org/gpt-oss-20b-GGUF -p 'bash: explain array usage'

  ...

llama-bench -m ~/.cache/llama.cpp/ggml-org_gpt-oss-20b-GGUF_gpt-oss-20b-mxfp4.gguf

  model                         size     test   token/s
  -----------------------  ---------  -------  --------
  gpt-oss 20B MXFP4 MoE    11.27 GiB    pp512    305.68
  gpt-oss 20B MXFP4 MoE    11.27 GiB    tg128     27.93
radeontop zeigt die aktuelle GPU-Nutzung

Server-Betrieb

Die Kommandos llama-cli und llama-bench dienen in erster Linie zum Testen und Debuggen. Sobald Sie sich einmal überzeugt haben, dass llama.cpp grundsätzlich funktioniert, werden Sie das Programm vermutlich im Server-Betrieb einsetzen. Das entsprechende Kommando lautet llama-server und ist grundsätzlich wie llama-cli aufzurufen. Falls Sie llama-server unter einem anderen Account als llama-cli aufrufen, aber schon heruntergeladene Modelle weiterverwenden wollen, übergeben Sie deren Pfad mit der Option -m:

llama-server -c 0 -fa on --jinja -m /home/kofler/.cache/llama.cpp/ggml-org_gpt-oss-20b-GGUF_gpt-oss-20b-mxfp4.gguf

Sie können nun unter http://localhost:8080 auf einen Webserver zugreifen und das gestartete Modell komfortabel bedienen. Im Unterschied zu Ollama hält llama.cpp das Modell dauerhaft im Arbeitsspeicher. Das Modell kann immer nur eine Anfrage beantworten. Die Verarbeitung mehrere paralleler Prompts erlaubt --parallel <n>.

Die Web-Oberfläche von llama-server

Es ist unmöglich, mit einem Server mehrere Modelle parallel anzubieten. Vielmehr müssen Sie mehrere Instanzen von llama-server ausführen und jedem Dienst mit --port 8081, --port 8082 usw. eine eigene Port-Nummer zuweisen. (Das setzt voraus, dass Sie genug Video-Speicher für alle Modelle zugleich haben!)

Falls auch andere Rechner Server-Zugang erhalten sollen, übergeben Sie mit --host einen Hostnamen oder eine IP-Nummer im lokalen Netzwerk. Mit --api-key oder --api-key-file können Sie den Server-Zugang mit einem Schlüssel absichern. Mehr Details zu den genannten Optionen sowie eine schier endlose Auflistung weiterer Optionen finden Sie hier:

https://github.com/ggml-org/llama.cpp/tree/master/tools/server

Was bringt die GPU? Nicht viel …

Jetzt habe ich drei Tage versucht, gpt-oss per GPU auszuführen. Hat sich das gelohnt? Na ja. Mit -ngl 0 kann die Token Generation (also das Erzeugen der Antwort per Sprachmodell) von der GPU auf die CPU verlagert werden. Das ist natürlich langsamer — aber erstaunlicherweise nur um 25%.

llama-bench -ngl 0 -m ~/.cache/llama.cpp/ggml-org_gpt-oss-20b-GGUF_gpt-oss-20b-mxfp4.gguf

  model                         size     test   token/s
  -----------------------  ---------  -------  --------
  ...
  gpt-oss 20B MXFP4 MoE    11.27 GiB    tg128     21.15

Warum ist der Unterschied nicht größer? Weil die 780M keine besonders mächtige GPU ist und weil die Speicherbandbreite der iGPU viel kleiner ist als bei einer dezidierten GPU mit »echtem« VRAM.

Zur Einordnung noch zwei Vergleichszahlen: MacBook Pro M3: 42 Token/s (mit GPU) versus 39 Token/s (nur CPU)

Quellen/Links

Sprachmodell gpt-oss

Ollama

llama.cpp

Diversifizierung von ETF im Portfolio checken mit Portfolio Performance

Von: Benni
07. September 2025 um 19:21

Spätestens seitdem Neobroker mit hohem Werbebudget den Markt auffrischen, ist für viele Menschen das Thema Geldanlage präsent geworden. Noch vor ein paar Jahren war der Erwerb von Wertpapieren mit solchen großen Hürden verbunden, dass sich viele Menschen nicht auf den Kapitalmarkt trauten. Inzwischen ist es auch für nicht-Finanzgurus wie mich möglich, sich unkompliziert Aktien und andere Anlageformen zuzulegen. Die Apps der Banken und Broker sind inzwischen recht benutzerfreundlich, was die Hürde weiter senkt. Wenn man sich der Sache wieder etwas ernster annähern möchte, kommt man mit den Apps aber schnell an seine Grenzen. Um besser den Überblick über meine Finanzen zu behalten, habe ich mich auf die Suche nach einer Software gemacht, die mich dabei unterstützt. Und ich bin in der Open Source Community fündig geworden.

Meine Fragestellung war folgende: Wie diversifiziert ist mein Portfolio eigentlich? In welchen Regionen und Branchen bin ich wie stark präsent? Welches sind meine Top-Firmen? Wie teilt sich mein Vermögen auf Aktien, ETFs und Cash auf? Wie stark bin ich in Small-Caps investiert? Wann und bei welchen Kurswerten habe ich gekauft und verkauft? Wie viele Dividenden habe ich inzwischen erhalten, usw.? Bisher habe ich das mit Excel lösen können. Die Fact-Sheets der ETF sind im Netz zu finden, dort sind die Verteilungen auf Regionen, Branchen usw. nachzulesen. Mit viel Tipparbeit holt man sich die aktuellen Verteilungen in die Datei, gewichtet sie nach aktuellem Wert im Portfolio und lässt es sich als Diagramm anzeigen. Aber: Das ist sehr aufwendig.

Portfolio Performance: Das mächtige Open Source Finanztool

Portfolio Performance ist hier einfacher. Nach der Installation kann man die PDF-Dateien seiner Bank und Broker importieren. Einfach den Kontoauszug und die Kauf- bzw. Verkaufsnachweise, Dividendenausschüttungen usw. in das Programm laden, und schon hat man den perfekten Überblick. Das Programm läuft lokal, was die Frage nach Datensicherheit vollkommen entschärft. Niemand hat Zugriff darauf, niemand kann sich die Daten ansehen. Meine Daten bleiben bei mir.

Neben dem PDF-Import der Bankdaten gibt es noch etliche weitere Importmöglichkeiten. Am gängigsten ist vermutlich das CSV-Format, das sich über einen tollen Assistenten gut importieren lässt.

Historische Kursdaten sind erstmal nicht vorhanden. Man kann sie sich über mehrere Wege ins Programm holen. Für mich am einfachsten ist der Weg über die Datenbank von Portfolio Performance selbst. Dort muss man ein kostenloses Benutzerkonto anlegen, dann kann man auf die historischen Daten dort zugreifen. Etliche andere Finanzportale sind ebenfalls kompatibel. Am Ende geht hier auch wieder CSV.

ETF- und Portfolio-Diversifikation anzeigen lassen

Über die Diagramme „Berichte → Vermögensaufstellung“ kann man sich anzeigen lassen, über welche Anlageklassen man zu welchen Teilen verfügt. Eine der Hauptfragen meinerseits war jedoch: Wie sieht es mit meiner ETF-Diversifikation aus?. Das geht derzeit noch nicht nativ in Portfolio Performance. Hierfür braucht man einen Drittanbieter.

Glücklicherweise gibt es findige Leute in der sehr aktiven Community, die sich die gleichen Fragen gestellt haben und eine Lösung zur Verfügung stellen. Über ein Skript des Users Alfonso1Qto12 kann man sich beispielsweise die Zusammensetzung der ETF über die Morningstar-API direkt in sein Portfolio Performance schreiben lassen.

Hinweis: Dieses Skript ist nach Aussage des Entwicklers experimentell und sollte nur mit einer Kopie der echten Daten benutzt werden! Stand September 2025 muss man den alternativen Branch wechseln, weil main noch auf eine alte API zugreift.

git clone https://github.com/Alfons1Qto12/pp-portfolio-classifier.git
git checkout new-api-branch
python3 portfolio-classifier.py -top_holdings 50 ./portfolio.xml ./portfolio-classified.xml

Über die Flag top_holdings 50 lasse ich mir aus den ETF die 50 wertvollsten Firmen ausgeben. Empfohlen wird, auf weniger als 100 Firmen zu gehen, um die Performance des Programms nicht zu gefährden.

Mit diesem Skript werden die Wertpapiere ihren Ländern, Regionen, Holdings usw. anteilsweise zugeordnet. Diese Daten werden direkt in die XML-Datei geschrieben und lassen sich anschließend in Portfolio Performance unter den „Klassifizierungen“ betrachten. Es gibt verschiedene Visualisierungsarten, am übersichtlichsten finde ich die Tabelle, das Kreis- und das Flächendiagramm.

Weitere Schritte und Lehren aus den Daten

Mit Portfolio Performance erhält man eine tolle Übersicht über seine Finanzen. Wie der Name schon verrät, kann man sich hier tolle Dashboards bauen, um die Performance im eigenen Portfolio zu überwachen. Alle gängigen Kriterien sind vorhanden und können in Dashboards oder vielfältige Diagramme eingebaut und visualisiert werden.

Die Daten lassen ein Rebalancing zu, dafür gibt es eigens eingebaute Funktionen. Über eine Smartphone-App lassen sich die Daten sogar auf dem Handy anzeigen. Die Synchronisation muss hier über Cloudanbieter durchgeführt werden, also zum Beispiel über die Nextcloud oder Dropbox. Daten einpflegen lassen sich übers Smartphone allerdings nicht.

Zusammengefasst: Wer eine sehr mächtige Open Source Software sucht, mit der man

  • sein Portfolio im Blick behalten kann,
  • das Daten aus vielen Quellen (inkl. PDFs von Banken und Brokern) verarbeiten kann,
  • Hilfestellung beim Rebalancing bietet,
  • auf einer aktiven Community aufbaut,
  • die sensiblen Daten lokal auf dem PC hält,
  • eine Datenaufbereitung fürs Smartphone bietet und
  • viele Hilfestellungen im Netz bereithält,

der ist bei Portfolio Performance gut aufgehoben.

The post Diversifizierung von ETF im Portfolio checken mit Portfolio Performance first appeared on bejonet - Linux | Smart Home | Technik.

Debian 13 »Trixie«

12. August 2025 um 08:42

Debian 13 »Trixie« ist fertig. Mehrere RC-Releases sind bei mir schon ein paar Monate im Einsatz — bislang ohne jedes Problem. Insofern sieht es so aus, als würde Debian seinem Ruf für stabile, ausgereifte Releases einmal mehr gerecht. Dieser Artikel fasst in kompakter Form die wichtigsten Neuerungen zusammen.

Debian mit Gnome-Desktop

Plattformen und Versionsnummern

Debian steht für sieben CPU-Plattformen zur Verfügung:

  • Standard-PCs (x86): nur noch amd64 (i386 nur einzelne Pakete, nicht mehr als vollständige Plattform)
  • ARM: arm64, armhf, armel
  • PowerPC: ppc64el
  • RISC-V: risvc64 (neu!)
  • IBM System z: s390x

MIPS wird nicht mehr unterstützt, armel mit diesem Release zum letzten Mal.

Die folgende Tabelle fasst die Versionen der Kernkomponenten von Debian 13 zusammen:

Basis               Programmierung     Server
---------------     --------------     ---------------
Kernel     6.12     bash       5.2     Apache      2.4
glibc      2.41     gcc       14.2     CUPS        2.4
Wayland    1.23     git       2.47     MariaDB    11.8
Gnome        48     Java     21/25     OpenSSH    10.0
Mesa       25.0     PHP        8.4     PostgreSQL   17
Systemd     257     Podman     5.4     Postfix    3.10
NetworkMan 1.52     Python    3.13     qemu/KVM   10.0
GRUB       2.12     Node.js     20     Samba      4.22

Wenn Sie sich bei der Installation für KDE entscheiden, kommen QT 6.8, das KDE-Framework 6.13, Plasma 6.3.6, sowie KDE Gear 25.04 bzw. 24.12 (für die PIM Suite) zur Anwendung.

Bei Dovecot warnen die Release Notes von Debian, dass sich die Syntax von Version 2.3 zu 2.4 inkompatibel geändert hat, was zu Problemen führen wird, wenn eine vorhandene Konfiguration bei einem Update übernommen werden soll. Hier ist der Link in die Dovecot-Dokumentation zu diesem Thema.

Installation

Am Installationsablauf hat sich — zumindest optisch — nichts verändert. Die teilweise seit Jahrzehnten (!) bewährten Dialoge führen durch die Installation. Das ist nicht so elegant und intuitiv wie bei anderen Systemen, dafür können bei der Partitionierung wirklich alle erdenklichen Sonderwünsche realisiert werden. Im Wildwuchs anderer Systeme betrachte ich das Installationssystem zunehmend als Pluspunkt.

Technische Neuerungen

last-Kommando neu implementiert: Unter Linux können Sie mit last die Liste der zuletzt eingeloggten Personen ermitteln. last reboot verrät, wann der Rechner zuletzt neugestartet wurde.

Das alles funktioniert in Debian auch, aber die Implementierung ist neu. last ist jetzt ein symbolischer Link auf wtmpdb. Diese Neuimplementierung der last-Datenbank verwendet SQLite und wird über das Jahr 2038 hinaus funktionieren (was beim herkömmlichen last-Kommando nicht der Fall ist).

Analog wurde lastlog durch lastlog2 ersetzt. Mehr Details geben die Release Notes.

APT-Repository-Format deb822: Debian unterstützt die neuen *.sources-Dateien zur Beschreibung von Paketquellen. Anstelle von einzeiligen Paketbeschreibungen wie

deb     http://deb.debian.org/debian/ trixie main
deb-src http://deb.debian.org/debian/ trixie main

können die Paketquellen in einem besser lesbaren, mehrzeiligen Format dargestellt werden:

# Datei /etc/apt/sources.list.d/debian.sources
Types:      deb deb-src
URIs:       http://deb.debian.org/debian/
Suites:     trixie
Components: main
Signed-By:  /usr/share/keyrings/debian-archive-keyring.gpg

Anders als ab Ubuntu 24.04 ist das neue Format in Debian 13 nicht per Default aktiv. Alle vorhandenen Paketquellen können aber mit apt modernize-sources umgestellt werden, was bei meinen Tests gut funktioniert hat. Die neuen Repo-Dateien haben die Kennung *.sources anstelle *.list. Wenn gleichnamige Dateien existieren, haben die *.sources-Dateien Vorrang. In die Dateien können auch Signatur-Keys eingebettet werden, was den lästigen Key-Import erspart. Mehr Details liefert man sources.list.

/tmp im RAM: Das /tmp-Verzeichnis wird nun mit dem tmpfs-Dateisystem im RAM abgebildet. Das verspricht höhere Geschwindigkeit beim Umgang mit temporären Dateien, kann aber bei sehr großen Dateien zum Speicherproblemen führen. /tmp darf bis zu 50% des RAMs nutzen. Das Dateisytem wird durch systemd eingerichtet. Der Grenzwert kann mit systemctl edit tmp.mount verändert werden. Dazu bauen Sie im dafür vorgesehen Bereich die folgenden zwei Zeilen ein und verändern die Werte:

[Mount]
Options=mode=1777,strictatime,nosuid,nodev,size=50%%,nr_inodes=1m

Wenn Sie /tmp wie bisher als reguläres Verzeichnis auf der SSD/Festplatte wünschen, führen Sie systemctl mask tmp.mount aus und starten Ihr System neu.

Sicherheit: Debian-Pakete sind gegen ROP- und COP/JOP-Angriffe gehärtet (betrifft die amd64– und arm64-Architektur). Die Pakete sind speziell kompiliert, um Exploits durch Return-Oriented Programming (ROP) bzw. Call/Jump-Oriented Programming (COP/JOP) zu erschweren. Weitere Details und Links finden Sie in den Release Notes.

Geschwindigkeit: Laut einem Test von Phoronix ist Debian 13 rund 13 Prozent schneller als die Vorgängerversion.

Tipps und Tricks

Wenn Sie Debian in einer virtuellen Maschine verwenden und Text und Bilder über die Zwischenablage mit dem Host austauschen wollen, führen Sie apt install spice-vdagent aus und starten die VM neu.

Fazit

Das Debian-Projekt ist 32 Jahre alt (Projektgründung im August 1993, 0.9-Releases 1994 und 1995, Version 1.1 1996). Debian zählt damit zu den ältesten Linux-Distributionen überhaupt — und ist bis heute mehr als nur relevant: Überlegen Sie nur für eine Minute, wie die Linux-Landschaft ohne Debian aussähe! Nicht nur Millionen Debian-Anwender stünden im Regen, auch Ubuntu, Linux Mint, Raspberry Pi OS etc. würde die Basis entzogen.

Für Version 13 gilt: Debian bleibt Debian. Große technische Innovationen finden anderswo statt. Stattdessen gibt es Unterstützung für viele CPU-Plattformen und ein solides, stabiles Fundament für die tägliche Arbeit, sei es am Desktop oder in Server-Anwendungen. Und das alles frei von finanziellen Interessen. Dafür sollte jeder Linux-Fan der Debian-Community unendlich dankbar sein.

Quellen/Links

Andere Tests/Kurzberichte

CachyOS

09. August 2025 um 09:40

CachyOS ist das Kunststück gelungen, die Spitze der distrowatch-Charts zu erklimmen. Über diesen Meilenstein haben zuletzt die meisten IT-Medien berichtet. Das Ranking spiegelt zwar nicht die Anzahl der Installationen wider (diese Zahlen kennt distrowatch nicht), wohl aber das Interesse, das durch Seitenzugriffe gemessen wird. Und das Interesse an CachyOS ist aktuell hoch.

Warum? CachyOS ist eine relativ neue Distribution auf der Basis von Arch Linux. CachyOS verfügt aber über ein verhältnismäßig komfortables grafisches Installationsprogramm, verwendet einen eigenen, auf Geschwindigkeit optimierten Kernel und eigene Paketquellen, deren Programme ebenfalls im Hinblick auf optimale Geschwindigkeit kompiliert sind (mit mehreren Varianten optimiert je nach CPU-Generationen). CachyOS implementiert interessante Features per Default: btrfs-Dateisystem mit komprimierten Subvolumes und Snapper, ufw-Firewall, systemd-boot, fish als Shell etc. Die CachyOS-spezifischen Details sind im Wiki gut dokumentiert.

In Summe ergibt das ein schnelles, modernes und sympathisches Linux, das ganz offensichtlich den Zeitgeist trifft. Höchste Zeit also, dass ich auch in meinem Blog etwas dazu schreibe :-)

CachyOS mit KDE-Desktop

Eckdaten

  • Rolling Release Modell auf Arch-Linux-Basis (aber mit eigenen Paketquellen)
  • x86-only, keine ARM-Variante
  • btrfs als Defaultdateisystem
  • Snapper als Snapshot-Tool (erfordert btrfs)
  • systemd-boot als Default-Boot-Loader
  • fish als Default-Shell
  • ufw als Firewall
  • Unzählige Desktops zur Auswahl (mit einer gewissen Präferenz zu KDE)
  • paru als AUR-Helper
  • CachyOS-spezifische Zusatzprogramme:CachyOS Hello, CachyOS Package Manager, CachyOS Kernel Manager etc.

Die meisten Details sind frei wählbar. Sie haben bei der Installation die Wahl zwischen diversen Boot-Loadern, können die Dateisysteme frei konfigurieren usw. Ich habe mich bemüht, möglichst nahe an den CachyOS-Vorgaben/Vorlieben zu bleiben, inklusive KDE als Desktop.

Installation

Die Installation von CachyOS erfolgt aus einem Live-System heraus mit dem Programm Calamares. (Dieses distributionsunabhängige Framework wird auch von diversen anderen Distributionen verwendet.) Nach einem ersten Test in einer virtuellen Maschine habe ich diese Installation auf einem Lenovo-P1-Notebook durchgeführt. Die 1-TB-SSD war anfänglich leer, ich wollte aber nur ca. 1/5 der SSD nutzen.

Sie müssen UEFI Secure Boot deaktivieren, falls dieses auf Ihrem Rechner aktiv ist. Es ist möglich, Secure Boot nachträglich zu aktivieren.

Die Installation beginnt — ein wenig absurd! — mit einem Auswahldialog zwischen fünf Boot-Loadern. Willkommen in Nerdistan :-) Hier wäre ein Link in das CachyOS-Wiki hilfreich, wo die Vor- und Nachteile der fünf Programme gut zusammengefasst sind. Die Kurzfassung: GRUB funktioniert immer. Das vorgeschlagene systemd-boot ist klein + schnell und mein persönlicher Favorit. Es unterstützt allerdings nicht die Auswahl eines Snapper-Snapshots während des Bootprozesses. Genau das können GRUB und Limine. GRUB kenne ich von ca. 1000 anderen Linux-Installationen, systemd-boot verwende ich unter Arch Linux, also habe ich mich aus Neugier für Limine entschieden. Bei Limine landen alle Boot-Dateien (sowohl EFI als auch Kernel, Initrd etc.) in einer Partition mit vfat-Dateisystem. Calamares hat das in Verwirrung gebracht (siehe unten).

Auswahl des Boot-Loaders

Erst danach startet das eigentliche Installationsprogramm mit Einstellung von Sprache, Region und Tastatur.

Einstellung der Sprache
Einstellung der Region
Einstellung der Tastatur

Wie bei den meisten Distributionen gelingt die Installation am einfachsten und schnellsten, wenn Sie dem Installationsprogramm die Kontrolle über den gesamten Datenträger überlassen und dieses selbst entscheiden kann, welche Partitionen es haben will. Aber wie einleitend erwähnt, wollte ich nur ca. 1/5 der SSD für CachyOS reservieren und habe deswegen eine manuelle Partitionierung durchgeführt. Der Prozess ist in Calamares nur mäßig intuitiv, aber zu schaffen. Ich habe eine 2-GB-Partition für /boot mit FAT32 und eine 180-GB-Partition für / mit btrfs eingerichtet.

Ärgerlicherweise hat Calamares die /-Partitionen vor der /boot-Partition platziert (abweichend von der Darstellung im Partitionseditor und im Zusammenfassungsdialog), was spätere Anpassungen nahezu unmöglich macht :-( Ist das so schwierig?

Manuelle Partitionierung auswählen
Partitionen einrichten

Beim Verlassen des Partitionseditor beklagt sich Calamares, dass die EFI-Partition fehlt. So wie ich das CachyOS-Wiki und die Limine-Dokumentation verstanden habe, ist diese Partition nicht erforderlich. Ich habe dennoch versucht, in Calamares wie gewünscht eine weitere EFI-Partition einzurichten, bin aber gescheitert. Es gibt nirgendwo die Option, das ESP-Flag zu setzen. Zuletzt habe ich entschieden, mich auf die Dokumentation zu verlassen und die Calamares-Empfehlung zu ignorieren und habe die Installation ohne EFI-Partition fortgesetzt. (Spoiler: hat funktioniert …)

In den nächsten Schritten wählen Sie zuerst den Desktop und dann eventuell gewünschte Zusatzpakete aus. Ich habe mich für KDE entschieden und keine weiteren Paket-Änderungen durchgeführt.

Auswahl des Desktops
Auswahl von zusätzlichen Paketen

Im Dialog »Users« müssen Sie entweder einen eigenen root-User einrichten oder die Option »Nutze das gleiche Passwort auf für das Administratorkonto« verwenden. Ich will weder noch: sudo reicht mir, root braucht kein Passwort (wie unter Ubuntu und macOS). Aber es hilft nichts, diesen Fall sieht Calamares nicht vor.

Benutzer einrichten

Calamares zeigt nun eine Zusammenfassung an. Danach beginnt die Installation, die (zumindest bei meinem lahmen Internet) recht lange braucht. Alle erforderlichen Pakete werden frisch heruntergeladen.

Zusammenfassung der Installationseinstellungen

Alles in allem ist die Installation mit etwas Linux-Erfahrung zu schaffen. Wenn Arch Linux die Messlatte ist, gibt es nichts zu meckern. Fedora, openSUSE oder Ubuntu zeigen aber, dass es deutlich intuitiver geht.

Erste Schritte

Immerhin: Nach einem Neustart bootet CachyOS korrekt. Die Distribution ist auf Platz 1 in der EFI-Bootliste, Limine funktioniert wie es soll.

Nach dem Login erscheint das Programm »CachyOS Hello« und hilft bei den ersten Schritten, z.B. bei der Installation weiterer Pakete. Google Chrome ist in der Auswahl nicht enthalten, aber paru -S google-chrome führt zum Ziel.

»CachyOS Hello« hilft bei ersten Schritten und bei der Installation wichtiger Desktop-Programme

In der Folge habe ich ein paar Stunden damit verbracht, CachyOS arbeitstauglich zu machen: Desktop einrichten, Nextcloud installieren, meine wichtigsten git-Repos herunterladen, Emacs und VSCode installieren usw. Merkwürdigerweise lässt sich die Fenstergröße von Emacs nur ganz schwer mit der Maus ändern — wohl ein Problem im Zusammenspiel mit KDE?

Shell

CachyOS verwendet meine Lieblings-Shell fish per Default — großartig. (Zu fish will ich demnächst einen eigenen Blog-Artikel verfassen.) Auch ein paar praktische Tools wie duf und exa sind standardmäßig installiert. Das bringt Farbe und Komfort ins Terminal. Die bash ist ebenso installiert, z.B. um eigene Scripts damit auszuführen.

fish, exa und duf bringen Farbe und Komfort ins Terminal

btrfs und Snapper

CachyOS empfiehlt btrfs als Dateisystem. Wenn Sie sich dafür entscheiden, richtet CachyOS dort einige Subvolumes für /home, /var/cache, /var/tmp etc. ein. In allen Subvolumes ist die Komprimierfunktion aktiv.

# /etc/fstab
# <file system>   <mount point>  <type>  <options>  <dump>  <pass>
UUID=36C7-65AA    /boot          vfat    defaults,umask=0077 0 2
UUID=6d011...     /              btrfs   subvol=/@,defaults,noatime,compress=zstd,commit=120 0 0
UUID=6d011...     /home          btrfs   subvol=/@home,defaults,noatime,compress=zstd,commit=120 0 0
UUID=6d011...     /root          btrfs   subvol=/@root,defaults,noatime,compress=zstd,commit=120 0 0
UUID=6d011...     /srv           btrfs   subvol=/@srv,defaults,noatime,compress=zstd,commit=120 0 0
UUID=6d011...     /var/cache     btrfs   subvol=/@cache,defaults,noatime,compress=zstd,commit=120 0 0
UUID=6d011...     /var/tmp       btrfs   subvol=/@tmp,defaults,noatime,compress=zstd,commit=120 0 0
UUID=6d011...     /var/log       btrfs   subvol=/@log,defaults,noatime,compress=zstd,commit=120 0 0
tmpfs             /tmp           tmpfs   defaults,noatime,mode=1777 0 0

compress=zstd bringt im Root-Dateisystem relativ viel. In den restlichen Subvolumes ist der Nutzen — zumindest bei meinen Daten — sehr überschaubar.

sudo compsize -x /

  Processed 264495 files, 143727 regular extents (144574 refs), 152617 inline.
  Type       Perc     Disk Usage   Uncompressed Referenced  
  TOTAL       59%      6.5G          11G          11G       
  none       100%      4.3G         4.3G         4.3G       
  zstd        33%      2.2G         6.7G         6.7G       
  prealloc   100%      1.2M         1.2M          15M       

sudo compsize -x /home

  Processed 16181 files, 18299 regular extents (18888 refs), 6961 inline.
  Type       Perc     Disk Usage   Uncompressed Referenced  
  TOTAL       95%       10G          10G          10G       
  none       100%      9.9G         9.9G         9.8G       
  zstd        25%      180M         715M         711M       
  prealloc   100%      2.5M         2.5M          44M       

sudo compsize -x /var/cache/

  Processed 2489 files, 1855 regular extents (1855 refs), 1219 inline.
  Type       Perc     Disk Usage   Uncompressed Referenced  
  TOTAL       99%      3.7G         3.7G         3.7G       
  none       100%      3.7G         3.7G         3.7G       
  zstd        27%      2.0M         7.5M         7.1M       

sudo compsize -x /var/log

  Processed 11 files, 99 regular extents (129 refs), 0 inline.
  Type       Perc     Disk Usage   Uncompressed Referenced  
  TOTAL       83%       13M          16M          16M       
  none       100%       12M          12M         3.0M       
  zstd        25%      956K         3.7M         3.7M 

In CachyOS ist das von SUSE entwickelte Programm Snapper installiert. Es erstellt vor und nach jeder Paketinstallation bzw. jedem Update Snapshots. Sollte etwas schiefgehen, kann das Root-Dateisystem beim Neustart in einen früheren Zustand zurückversetzt werden. (Den folgenden Limine-Screenshot habe ich in einer virtuellen Maschine erstellt.)

Auswahl eines Snapshots in Limine

Eine Liste aller Snapshots erstellen Sie mit sudo snapper list. Noch bequemer gelingt die Snapper-Administration mit dem vorinstallierten btrfs-assistant. Snapper ist so vorkonfiguriert, dass maximal 50 Snapshots gespeichert werden. Danach werden alte Snapshots automatisch gelöscht.

btrfs-assistant hilft bei der btrfs- und Snapper-Administration

Persönlich habe ich Snapper noch nie benötigt. (Ich kenne das Programm schon seit einigen Jahren von openSUSE.) Man kann argumentieren, dass es ein Hilfsmittel für den Notfall ist, mit nur minimalen störenden Nebenwirkungen. Der Speicherbedarf für die Snapshots ist relativ klein. Wenn Sie die mit Snapper einhergehende Komplexität stört, deinstallieren sie einfach das gleichnamige Paket.

Limine

Wie gesagt, Sie haben bei CachyOS die Wahl zwischen vielen Boot-Loadern. Mich hat Limine interessiert, weil ich das Programm bisher noch nie verwendet habe. Kurz die Eckdaten: x86 + ARM, BIOS + EFI, aber kein Secure Boot.

Unter CachyOS landen die Dateien für Limine und EFI normalerweise in einem FAT32-Dateisystem:

sudo tree /boot

├── 83267ffa7c0b4bf08a12eaa512f27972
│   ├── limine_history
│   │   ├── initramfs-linux-cachyos_sha256_60497733c69906ce771ecb34ce15abf118bd774e9f02526191cb54b5fcbd7fd4
│   │   ├── snapshots.json
│   │   ├── snapshots.json.old
│   │   └── vmlinuz-linux-cachyos_sha256_8705f3a6f237fcedd807f687e2e3a8d3d5fb97eaa1edf6b8f3c88bcc8635753d
│   └── linux-cachyos
│       ├── initramfs-linux-cachyos
│       └── vmlinuz-linux-cachyos
├── EFI
│   ├── boot
│   │   └── BOOTX64.EFI
│   └── Limine
│       ├── limine_x64.bak
│       └── limine_x64.efi
├── initramfs-linux-cachyos.img
├── intel-ucode.img
├── limine.conf
├── limine.conf.old
├── limine-splash.png
└── vmlinuz-linux-cachyos

Die gesamte Konfiguration befindet sich in der Textdatei /boot/limine.conf. Im folgenden Listing habe ich die vielen dort befindlichen UUIDs durch xxx ersetzt, damit die Struktur der Datei besser erkenntlich ist.

timeout: 5
default_entry: 2
remember_last_entry: yes

# CachyOS Limine theme
# Author: diegons490 (https://github.com/diegons490/cachyos-limine-theme)
term_palette: 1e1e2e;f38ba8;a6e3a1;f9e2af;89b4fa;f5c2e7;94e2d5;cdd6f4
term_palette_bright: 585b70;f38ba8;a6e3a1;f9e2af;89b4fa;f5c2e7;94e2d5;cdd6f4
term_background: ffffffff
term_foreground: cdd6f4
term_background_bright: ffffffff
term_foreground_bright: cdd6f4
interface_branding:
wallpaper: boot():/limine-splash.png

/+CachyOS
  //linux-cachyos
  comment: 6.16.0-5-cachyos
  protocol: linux
  module_path: boot():/xxx/linux-cachyos/initramfs-linux-cachyos#xxx
  kernel_path: boot():/xxx/linux-cachyos/vmlinuz-linux-cachyos#xxx
  kernel_cmdline: quiet nowatchdog splash rw rootflags=subvol=/@ root=UUID=xxx

     //Snapshots
     comment: Selecting any snapshot to boot into it.
     ///25 │ 2025-08-09 11:33:41
     comment: tree
     ////linux-cachyos
     comment: 6.16.0-5-cachyos
     protocol: linux
     module_path: boot():/xxx/limine_history/initramfs-linux-cachyos_sha256_xxx
     kernel_path: boot():/xxx/limine_history/vmlinuz-linux-cachyos_sha256_xxx
     kernel_cmdline: quiet nowatchdog splash rw rootflags=subvol=/@/.snapshots/25/snapshot root=UUID=xxx
     ...

Um die für Snapper erforderlichen Konfigurationsänderungen kümmert sich das Paket limine-snapper-sync. Das Paket stellt einige systemd-Units zur Verfügung. Die Konfiguration übernimmt /etc/limine-snapper-sync.conf.

Geschwindigkeit

CachyOS stellt eine Menge Kernel zur Auswahl und gibt Ihnen unkompliziert die Möglichkeit, den Scheduler zu beeinflussen. (Der Scheduler steuert, wie viel Rechenzeit welcher Prozess bekommt.) Die für CachyOS kompilierten Kernel sind besonders im Hinblick auf die Geschwindigkeit optimiert. Details können Sie hier, hier und hier nachlesen.

Linux-Freaks haben die Wahl zwischen verschiedenen Kerneln und Schedulern

Darüber hinaus betreibt CachyOS mehrere Repositories mit Paketen, die für unterschiedliche CPU-Generationen optimiert sind. Anstatt also ein Paket anzubieten, das auf jeder noch so alten CPU läuft, gibt es mehrere Pakete, die die Features Ihrer CPU optimal nutzt. Installationen auf Rechner mit einer modernen CPU verwenden automatisch die v3-Repos. Details finden Sie wieder im CachyOS-Wiki.

# Datei /etc/pacman.conf
...
[cachyos-v3]
Include = /etc/pacman.d/cachyos-v3-mirrorlist
[cachyos-core-v3]
Include = /etc/pacman.d/cachyos-v3-mirrorlist
[cachyos-extra-v3]
Include = /etc/pacman.d/cachyos-v3-mirrorlist
[cachyos]
Include = /etc/pacman.d/cachyos-mirrorlist

Was bringen all diese Maßnahmen? Subjektiv nicht viel. Mein Notebook fühlt sich mit CachyOS nicht spürbar schneller an als mit anderen Distributionen. (Die meiste Zeit verwende ich mein Notebook unter Arch Linux, insofern ist das meine Referenz. Und die meiste Zeit erledige ich Dinge, die nicht CPU-intensiv sind — Texte verfassen, Code entwickeln etc.) Andererseits: Wenn Sie viele performance-intensive Programme ausführen (Compiler, lokale KI-Tools, Spiele), dann sind die Optimierungen von CachyOS absolut wertvoll.

Phoronix hat im Mai 2025 umfangreiche Benchmarktests durchgeführt, in denen CachyOS hinter Clear Linux (mittlerweile eingestellt) auf Platz 2 landete, knapp vor Debian 13 RC. Aber die Unterschiede zwischen den Testkandidaten waren überwiegend minimal, im einstelligen Prozentbereich. Schneller ist natürlich immer besser, aber Wunder kann auch CachyOS nicht vollbringen.

CachyOS verwendet standardmäßig ZRAM-Swap und benötigt normalerweise keine zusätzliche Swap-Partition oder Datei. ZRAM-Swap verwendet den Arbeitsspeicher als Auslagerungsort und komprimiert die dort gespeicherten Blöcke. Dieses auch bei Fedora übliche Feature funktioniert normalerweise sehr gut (außer Sie haben wirklich deutlich zu wenig RAM). Der Swap-Speicher wird von systemd eingerichtet (siehe auch zram-generator).

zramctl 

  NAME       ALGORITHM DISKSIZE  DATA COMPR TOTAL STREAMS MOUNTPOINT
  /dev/zram0 zstd         30,8G  1,2M 84,7K  840K         [SWAP]

Auch das Verzeichnis /tmp ist via tmpfs im Arbeitsspeicher abgebildet (siehe /etc/fstab). All diese Maßnahmen führen dazu, dass das (hoffentlich ausreichend verfügbare) RAM unter CachyOS möglichst gut im Sinne einer optimalen Geschwindigkeit genutzt wird.

Hardware-Erkennung und Treiber-Installation

CachyOS hat mit chwd ein eigenes Tool zur Hardware-Erkennung. Es wird bei der Installation verwendet, um alle notwendigen Treiber zu installieren. Im späteren Betrieb liefert chwd --list einen Überblick über die installierten Treiber. chwd --autoconfigure wiederholt die Treiberkonfiguration, z.B. um Treiber für später eingebaute Komponenten zu installieren.

sudo chwd --list

> 0000:00:02.0 (0300:8086:3e9b) VGA compatible controller Intel Corporation:

╭──────────┬───────────╮
│ Name     ┆ Priorität │
╞══════════╪═══════════╡
│ intel    ┆ 4         │
├╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┤
│ fallback ┆ 3         │
╰──────────┴───────────╯

> 0000:01:00.0 (0300:10de:1cbb) VGA compatible controller NVIDIA Corporation:

╭──────────────────┬───────────╮
│ Name             ┆ Priorität │
╞══════════════════╪═══════════╡
│ nvidia-dkms      ┆ 12        │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┤
│ nvidia-open-dkms ┆ 10        │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌┤
│ fallback         ┆ 3         │
╰──────────────────┴───────────╯

Firewall

Unter CachyOS läuft per Default die von Ubuntu stammende Firewall ufw. Von außen kommende Verbindungen werden für alle Ports (auch 22/SSH) blockiert. Wenn Sie einen SSH- oder Webserver installieren und von außen sichtbar machen möchten, müssen Sie den entsprechenden Port öffnen, z.B. so:

sudo systemctl enable --now sshd

sudo ufw allow ssh

sudo ufw status

  Status: active

  To                         Action      From
  --                         ------      ----
  22                         ALLOW       Anywhere                  
  22 (v6)                    ALLOW       Anywhere (v6)             

Fazit

CachyOS ist eine sympathische, in vielen Details originelle, gut funktionierende neue Linux-Distribution. Es macht Spaß damit zu arbeiten, und man merkt, wie viel Mühe in die Entwicklung geflossen ist.

Ich habe schon viele Distributionen kommen und gehen gesehen. Hinter CachyOS steht ein verhältnismäßig kleines Team ohne die finanzielle Unterstützung großer Sponsoren. Wird es CachyOS also nächstes oder übernächstes Jahr noch geben? Ich weiß es nicht. Das Risiko, plötzlich eine nicht mehr gewartete Distribution zu nutzen, ist aber überschaubar: Zur Not sollte durch einen Wechsel der Paketquellen der Umstieg auf das ursprüngliche Arch Linux gelingen.

Es gehört zu meinem Beruf, dass ich viele Linux-Distributionen ausprobiere. Einen Wechsel meiner »Hauptinstallation« auf meinem Arbeits-Notebook mache ich aber nur ganz selten, das ist einfach zu viel Mühe. Dort läuft seit ca. drei Jahren Arch Linux und ich bin damit zufrieden.

CachyOS macht vieles richtig. Wenn ich mein Notebook heute neu aufsetzen bzw. ein neues Notebook einrichten müsste, würde ich vermutlich CachyOS eine Chance geben. Dafür gibt es aktuell aber keine Notwendigkeit, und so werde ich bis auf weiteres Arch Linux treu bleiben. So groß sind die Unterschiede zu CachyOS dann auch wieder nicht.

Quellen/Links

Snapper

News/Tests

Flatpak und Snap — Statusbericht

01. August 2025 um 09:50

Auf meinen privaten Linux-Installationen gehe ich Flatpak- und Snap-Paketen meistens aus dem Weg. Aber damit mir keiner vorwirft, ich sei zu altmodisch, mache ich hin und wieder doch die Probe auf Exempel: Wie gut funktionieren die neuen Paketsysteme? Meine Testkandidaten waren diesmal Fedora 42 sowie zwei Ubuntu-Installationen (25.04 und 25.10 daily), jeweils auf x86_64-Rechnern.

Fedora + Flatpak

Red Hat setzt bekanntermaßen auf Flatpak als sekundäres Paketformat für Desktop-Pakete. Es gibt zwei Motiviationsgründe: Einerseits will Red Hat den Aufwand für die Wartung großer Pakete (LibreOffice, Gimp etc.) längerfristig reduzieren; andererseits soll die Software-Installation für Anwender einfacher werden, insbesondere für Programme, die nicht in den klassischen Paketquellen verfügbar sind.

In Fedora 42 sind Flatpaks optional. Per Default ist kein einziges Flatpak-Paket installiert. Die Flatpak-Infrastruktur ist aber vorkonfiguriert, inklusive zweier Paketquellen (flathub und fedora). Mit dem Gnome-Programm Software können Sie nach Desktop-Programmen suchen. Manche Programme stehen in mehreren Paketformaten zur Auswahl (z.B. Gimp wahlweise als RPM- oder Flatpak-Paket) — dann haben Sie die Wahl, welches Format Sie verwenden möchten. Außerhalb des Linux-Universums entwickelte Apps wie Google Chrome, IntelliJ, Postman, Spotify oder VSCode gibt es hingegen nur als Flatpaks.

Mit dem Gnome-Programm »Software« können Desktop-Programme als herkömmliche Pakete oder als Flatpaks installiert werden. Die Kritierien für die »Editor’s Choice« sind aber nur schwer nachzuvollziehen. Nach den populären Programmen müssen Sie selbst suchen.

Bei RHEL 10 ist die Ausgangssituation ähnlich wie bei Fedora: Die Infrastruktur ist da, aber es sind keine Flatpaks installiert. Falls Sie RHEL als Desktop-System verwenden möchten, ist der Druck hin zu Flatpak aber stärker. Beispielsweise bietet Red Hat LibreOffice nicht mehr als RPM-Paket, sondern nur als Flatpak an. (Für Fedora gilt dies noch nicht, d.h., Sie können LibreOffice weiterhin als RPM installieren. Schauen wir, wie lange das noch so bleibt …)

Mein »Referenztest« ist die Installation von Spotify in einem bisher leeren System (also ohne andere vorher installierte Flatpaks bzw. Snaps). Sie können die Installation in Software oder per Kommando durchführen. Ich ziehe zweiteres oft vor, damit ich sehe, was vor sich geht (Listing gekürzt):

sudo flatpak install flathub com.spotify.Client

  Required runtime for com.spotify.Client/x86_64/stable found in remote
  flathub. Do you want to install it? [Y/n]: y
  ...
  org.freedesktop.Platform.GL.default    24.08       155 MB
  org.freedesktop.Platform.GL.default    24.08extra  155 MB
  org.freedesktop.Platform.Locale        24.08       382 MB (partial)
  org.freedesktop.Platform.openh264      2.5.1         1 MB
  org.freedesktop.Platform               24.08       261 MB
  com.spotify.Client                     stable      208 MB

Für die Installation von Spotify ist ein Download von 1,6 GiB und Platz auf dem Datenträger im Umfang von 1,9 GiB erforderlich. Das ist einfach verrückt.

Einen Überblick über alle installierte Flatpaks samt Größenangaben erhalten Sie mit flatpak list -d. Das folgende Listing ist aus Platzgründen stark gekürzt. Irritierend ist, dass die Paketgrößen in keiner Weise mit den Angaben während der Installation übereinstimmen (siehe das vorige Listing).

flatpak list -d

  com.spotify.Client                   1.2.63.394  stable       14 MB 
  org.freedesktop.Platform             24.08.22    24.08       672 MB 
  org.freedesktop.Platform.GL.default  25.1.3      24.08       464 MB 
  org.freedesktop.Platform.GL.default  25.1.3      24.08extra  464 MB 
  org.freedesktop.Platform.openh264    2.5.1       2.5.1         1 MB 

Flatpak-Installationen landen im Verzeichnis /var/lib/flatpak. Die unzähligen dort angelegten Verzeichnisse und Dateien verwenden UUIDs und hexadezimale Codes als Namen. Für die Installation von Spotify auf einem zuvor leeren Flatpak-System werden mehr als 46.000 Verzeichnisse, Dateien und Links mit einem Platzbedarf von 1,9 GiB eingerichtet. Es ist nicht lange her, da reichte das für eine ganze Linux-Distribution aus!

sudo du -h -d 0 /var/lib/flatpak/

  1,9G  /var/lib/flatpak/

sudo find /var/lib/flatpak | wc -l

  46241

Immerhin teilen weitere Flatpaks die nun etablierte Infrastruktur von Bibliotheken und Basispakete, so dass der Platzbedarf bei der Installation weitere Flatpaks etwas langsamer steigt.

Beim Start beansprucht Spotify »nur« ca. 400 MiB im Arbeitsspeicher (gemessen mit free -m vor und nach dem Start des Audio-Players). Von den vielen installierten Bibliotheken wird also nur ein Bruchteil tatsächlich genutzt. Wenn Sie mit Ihren Ressourcen sparsamer umgehen wollen/müssen, führen Sie Spotify am einfachsten in einem Webbrowser aus :-)

Ubuntu und Snap

Canonical hat Snap-Pakete bereits tief in der Ubuntu-Infrastruktur verankert. Bei Ubuntu 25.10 (daily 2025-07-31) sind
mehrere wichtige Desktop-Programme als Snap-Pakete vorinstalliert: Firefox, das App-Zentrum, der Firmware-Aktualisierer sowie ein relativ neues Security Center zur Verwaltung von Snap-Zugriffsrechten. Dazu kommen die dafür erforderlichen Basispakete. Immerhin ist der Platzbedarf auf der SSD mit 1,1 GByte spürbar geringer als bei vergleichbaren Flatpaks. Ein wenig frech erscheint mir, dass apt install thunderbird mittlerweile ungefragt zur Installation des entsprechenden Snap-Pakets führt.

Im Unterschied zu Flatpaks, die rein für Desktop-Installationen gedacht sind, bietet Canonical auch eine Menge Snap-Pakete für den Server-Einsatz an: https://snapcraft.io/store?categories=server

Zur Installation von Desktop-Snaps verwenden Sie das App-Zentrum. Als einzige Paketquelle ist https://snapcraft.io/store vorgesehen. Weil schon einige Basispakete vorinstalliert sind, ist die Installation eines weiteren Pakets nicht mit so riesigen Downloads wie beim konkurrierenden Flatpak-System verbunden.

Ubuntus »App-Zentrum« ist einzig zur Installation von Snap-Paketen gedacht.

Im Terminal administrieren Sie Snap durch das gleichnamige Kommando. Mit snap install installieren Sie ein neues Paket. snap list zählt alle installierten Snap-Anwendungen auf. snap run startet eine Anwendung, snap refresh aktualisiert alle Snap-Pakete, snap remove name löscht ein Paket.

Mein Referenztest ist wieder die Spotify-Installation. Zusammen mit spotify werden auch die Pakete core20 und gnome-3-38 heruntergeladen. Der Platzbedarf für alle drei Pakete beträgt ca. 600 MiB. (Der Vergleich hinkt aber, weil ja schon diverse Snap-Basispakete installiert sind.) Nach dem Start von Spotify sind ca. 320 MiB zusätzlich im RAM belegt.

sudo snap install spotify

  spotify 1.2.63.394.g126b0d89 from Spotify installed

Die interne Verwaltung von Snaps erfolgt ganz anders als bei Flatpak. Snap-Anwendungen werden in Form von komprimierten *.snap-Dateien in /var/lib/snapd/snaps gespeichert:

ls -lh /var/lib/snapd/snaps

  ...   4,0K  ... bare_5.snap
  ...    64M  ... core20_2599.snap
  ...    74M  ... core22_2045.snap
  ...    13M  ... desktop-security-center_83.snap
  ...   246M  ... firefox_6565.snap
  ...    12M  ... firmware-updater_167.snap
  ...   350M  ... gnome-3-38-2004_143.snap
  ...   517M  ... gnome-42-2204_202.snap
  ...    92M  ... gtk-common-themes_1535.snap
  ...   4,0K  ... partial
  ...    15M  ... prompting-client_104.snap
  ...    51M  ... snapd_25227.snap
  ...    51M  ... snapd_25241.snap
  ...   576K  ... snapd-desktop-integration_315.snap
  ...    11M  ... snap-store_1270.snap
  ...   190M  ... spotify_88.snap

Der im Hintergrund laufende Snap-Dämon snapd bindet diese Dateien als squashfs-Dateisysteme an der Stelle /snap/xxx in den Verzeichnisbaum ein und macht die Anwendungen so zugänglich (alle Größenangaben in MiB):

sudo du -mcs /snap/*

   210    /snap/core20
   248    /snap/core22
    30    /snap/desktop-security-center
   644    /snap/firefox
    35    /snap/firmware-updater
   903    /snap/gnome-3-38-2004
  1294    /snap/gnome-42-2204
   360    /snap/gtk-common-themes
   417    /snap/spotify
   ...
Unzählige squashfs-Dateisysteme machen das findmnt-Ergebnis ziemlich unübersichtlich

Im Vergleich zu Flatpak sparen die komprimierten Flat-Images zwar Platz auf dem Datenträger. Allerdings speichert
Snap standardmäßig von jedem installierten Paket ein Backup mit der vorigen Version. Im Laufe der Zeit verdoppelt das den von Snap beanspruchten Speicherplatz! Um nicht mehr benötigte Pakete zu löschen, verfassen Sie das folgende Mini-Script. export LANG= stellt dabei die Spracheinstellungen zurück, damit die Ausgaben von snap in englischer Sprache erfolgen. Das Script entfernt alle Snap-Pakete, deren Status disabled ist.

#!/bin/bash
# Datei ~/bin/delete-snap-crap.sh
# Idee: https://superuser.com/questions/1310825
export LANG=
snap list --all | awk '/disabled/{print $1, $3}' |
    while read snapname revision; do
        snap remove "$snapname" --revision="$revision"
    done

Dieses Script führen Sie mit root-Rechten aus:

sudo bash delete-snap-crap.sh

Auf einem Testsystem mit diversen Snap-Paketen (Firefox, Gimp, LibreOffice, Nextcloud Client, VSCode) sank mit der Ausführung dieses Scripts der Platzbedarf in /var/lib/snapd/snaps von 7,6 auf 4,0 GiB.

Spotify als DEB-Paket

Spotify bietet seinen Client auch als Paket für Debian/Ubuntu an: https://www.spotify.com/us/download/linux/

Also habe ich einen Vergleich gemacht.

Download: ca. 150 MB
Platzbedarf auf der SSD: ca. 340 MB
RAM-Bedarf: ca. 350 MB

Fazit: RAM-Bedarf ist bei allen drei Varianten ähnlich, aber die RPM-Variante braucht weniger Platz am Datenträger.

Fazit

Ich sehe die Probleme, die herkömmliche Paketformate verursachen.

Ich verstehe auch den Wunsch nach einem universellem Paketformat, das für alle Distributionen funktioniert, das aus Anwendersicht einfach zu nutzen und das für den Software-Anbieter mit überschaubarem Wartungsaufwand verbunden ist.

Aus meiner Sicht bieten allerdings weder Flatpak noch Snap eine optimale Lösung für diese Probleme/Wünsche. Diese Erkenntnis ist nicht neu, ich habe sie in diesem Blog schon mehrfach formuliert. Die Weiterentwicklung beider Formate in den letzten Jahren hat diesbezüglich leider keine spürbaren Verbesserungen mit sich gebracht.

Bei Flatpak sind die Paketgrößen einfach absurd. Bei Snap sind sie auch zu groß, aber es ist nicht ganz so schlimm — zumindest, wenn alle Doppelgänger regelmäßig entfernt werden. Allerdings ist der Snap Store (also die Paketquelle) Closed Source, was die ohnedies schon geringe Akzeptanz nicht verbessert. Das Software-Angebot im Snap Store ist zwar größer als das auf Flathub, aber ich sehe dennoch die Gefahr, dass das Snap-Format eine Insellösung bleibt und Canonical auch mit dieser Eigenentwicklung Schiffbruch erleidet (ich sage nur Upstart Init System, Unity Desktop, Mir Display Server). Während Flatpaks außerhalb der Red-Hat-Welt zumindest als Option genutzt werden, scheint keine Distribution außer Ubuntu etwas mit Snaps zu tun haben wollen.

Letztlich ist meine Meinung natürlich irrelevant. Ubuntu ist aus meiner Sicht nach wie vor eine attraktive Distribution, sowohl am Desktop als auch am Server. Wer Ubuntu verwenden will, muss eben in den Snap-Apfel beißen. Auf einem Rechner mit einer ausreichend großen SSD und genug RAM funktioniert das gut.

Es ist unklar, ob Red Hat sein Flatpak-Format genauso vehement durchsetzen wird. Bis jetzt sieht es nicht so aus, aber es würde mich nicht überraschen, wenn auch Red Hat irgendwann keine Lust mehr hat, eigene RPM-Pakete für Firefox, Thunderbird, Gimp, Libreoffice usw. zu pflegen und parallel für diverse Distributionen (aktuell: RHEL 8/9/10, Fedora 40/41/42/Rawhide etc.) zu warten.

Vielleicht wir man sich / werde ich mic an den verrückten Ressourcenbedarf neuer Paketsysteme gewöhnen. Auf einem Rechner mit 32 GB RAM und 1 TB SSD — keine ungewöhnlichen Eckdaten heutzutage — spielen 10 GB mehr oder weniger für ein paar Flatpaks oder Snap-Pakete ja keine große Rolle … Mir widerspricht es trotzdem: Wenn es möglich ist, ein Auto zu bauen, das mit 5 Liter Treibstoff pro 100 km auskommt, warum dann eines verwenden, das 8 Liter braucht?

Quellen/Links

Flatpaks

Snap

Diskussion auf mastadon

Wie dnf.8.gz in den Container kam

25. Juli 2025 um 06:42

Die folgende Geschichte soll mir zur Erinnerung und euch zur Unterhaltung dienen. Sie handelt von CentOS Stream 10, Containern und der Manpage dnf(8). Aber lest selbst.

Es war einmal ein Systemadministrator, der beim Training einige Subkommandos von dnf updateinfo kennenlernte, von deren Existenz er bislang nichts wusste. Und diese Subkommandos heißen list, info und summary. Neugierig schaute er in die Manpage dnf(8), doch zu seinem Erstaunen schwieg sich diese zu diesen Subkommandos aus.

Wut stieg in unserem Sysadmin auf. Wieder einmal haben sich die Entwickler keine Mühe gegeben, die Funktionalität ihrer Anwendung vernünftig zu dokumentieren. Die Qualitätssicherung hat geschlafen. So kann man doch nicht arbeiten. Doch nach dem ersten Wutanfall beschloss der Sysadmin, der Sache in Ruhe auf den Grund zu gehen, bevor er diesen Misstand anprangern würde.

Die Distribution des Sysadmins ist dafür bekannt, dass unter bestimmten Umständen Funktionalität von Upstream zurückportiert wird. Vielleicht hatte sich hier eine Diskrepanz eingeschlichen. Vielleicht war dieser Fehler in einer neueren Version ausgemerzt. Um dies schnell zu überprüfen, wollte unser Sysadmin einen Blick in dnf(8) in Centos 10 Stream werfen. Dazu führte er folgende Befehle in einer Kommandozeile aus:

$ podman run --rm -it centos:stream10
[root@01ede4521839 /]# man 8 dnf
bash: man: command not found
[root@01ede4521839 /]#

Mit einem Augenrollen erinnerte sich unser Sysadmin daran, dass Container-Images nur das absolut Notwendige enthalten, um möglichst wenig Speicherplatz auf der Festplatte zu belegen. Darüber, was absolut notwendig ist, werden seit anbeginn des Containerzeitalters philosophische Streitgespräche geführt. Also prüfte unser Sysadmin, ob es einen vertrauten Paketmanager gab, um die Manpages nachzuinstallieren:

[root@01ede4521839 /]# dnf in man-db man-pages
CentOS Stream 10 - BaseOS                       2.6 MB/s | 6.2 MB     00:02    
CentOS Stream 10 - AppStream                    1.5 MB/s | 2.4 MB     00:01    
CentOS Stream 10 - Extras packages              3.3 kB/s | 3.5 kB     00:01    
Dependencies resolved.
================================================================================
 Package             Architecture   Version                Repository      Size
================================================================================
Installing:
 man-db              x86_64         2.12.0-8.el10          baseos         1.3 M
 man-pages           noarch         6.06-3.el10            baseos         3.7 M
Installing dependencies:
 groff-base          x86_64         1.23.0-10.el10         baseos         1.1 M
 less                x86_64         661-3.el10             baseos         191 k
 libpipeline         x86_64         1.5.7-7.el10           baseos          53 k

Transaction Summary
================================================================================
Install  5 Packages

Total download size: 6.4 M
Installed size: 9.9 M
Is this ok [y/N]:
…
Installed:
  groff-base-1.23.0-10.el10.x86_64          less-661-3.el10.x86_64              
  libpipeline-1.5.7-7.el10.x86_64           man-db-2.12.0-8.el10.x86_64         
  man-pages-6.06-3.el10.noarch             

Complete!
[root@01ede4521839 /]# mandb
Processing manual pages under /usr/share/man...
Updating index cache for path `/usr/share/man/man7'. Wait...mandb: can't resolve man7/groff_man.7
mandb: warning: /usr/share/man/man7/man.7.gz: bad symlink or ROFF `.so' request
mandb: can't resolve man7/groff_man.7
mandb: warning: /usr/share/man/man7/man.man-pages.7.gz: bad symlink or ROFF `.so' request
Updating index cache for path `/usr/share/man/man3type'. Wait...done.
Checking for stray cats under /usr/share/man...
Checking for stray cats under /var/cache/man...
Processing manual pages under /usr/local/share/man...
Updating index cache for path `/usr/local/share/man/mann'. Wait...done.
Checking for stray cats under /usr/local/share/man...
Checking for stray cats under /var/cache/man/local...
45 man subdirectories contained newer manual pages.
2701 manual pages were added.
0 stray cats were added.
0 old database entries were purged.
[root@01ede4521839 /]# man 8 dnf
No manual entry for dnf in section 8

Resultat: Kein which-Befehl verfügbar. Diese Container-Image-Kuratöre sparten aber wirklich an allem. Doch der obige Codeblock enthüllt noch mehr. Zwar war der Paketmanager dnf installiert, auch die Manpages waren nun vorhanden, nur die Manpage dnf(8) fehlte immer noch. Und so bemühte der Sysadmin wieder die Tastatur, um zu prüfen, ob die entsprechende Datei tatsächlich fehlt, welches Paket sie bereitstellt und um das Problem zu lösen. Sehet und staunet:

[root@01ede4521839 /]# stat /usr/share/man/man8/dnf.8.gz
stat: cannot statx '/usr/share/man/man8/dnf.8.gz': No such file or directory
[root@01ede4521839 /]# dnf provides /usr/share/man/man8/dnf.8.gz
…    
dnf-4.20.0-9.el10.noarch : Package manager
Repo        : baseos
Matched from:
Filename    : /usr/share/man/man8/dnf.8.gz
[root@01ede4521839 /]# dnf reinstall dnf
Last metadata expiration check: 0:01:01 ago on Wed Jan  1 14:31:37 2025.
Dependencies resolved.
================================================================================
 Package       Architecture     Version                  Repository        Size
================================================================================
Reinstalling:
 dnf           noarch           4.20.0-9.el10            baseos           478 k

Transaction Summary
================================================================================

Total download size: 478 k
Installed size: 2.5 M
Is this ok [y/N]:y
…
Reinstalled:
  dnf-4.20.0-9.el10.noarch                                                      

Complete!
[root@01ede4521839 /]# stat /usr/share/man/man8/dnf.8.gz
  File: /usr/share/man/man8/dnf.8.gz -> dnf4.8.gz
  Size: 9         	Blocks: 8          IO Block: 4096   symbolic link
Device: 0,111	Inode: 6118189     Links: 1
Access: (0777/lrwxrwxrwx)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2024-10-28 20:00:00.000000000 -0400
Modify: 2024-10-28 20:00:00.000000000 -0400
Change: 2025-01-01 14:32:59.692356995 -0500
 Birth: 2025-01-01 14:32:59.691356987 -0500

Überzeugt, dass der Spuk nun ein Ende habe, versuchte es unser Sysadmin erneut:

[root@01ede4521839 /]# man 8 dnf
No manual entry for dnf in section 8

Moment! Die Datei ist da, die Manpage jedoch nicht? Sind hier dunkle Mächte am Werke? Nein, denn wie die folgenden Befehle offenbarten, lag die Ursache lediglich in kaputten Symlinks und fehlenden Paketen:

[root@01ede4521839 /]# ls -l /usr/share/man/man8/dnf.8.gz
lrwxrwxrwx. 1 root root 9 Oct 28 20:00 /usr/share/man/man8/dnf.8.gz -> dnf4.8.gz
[root@01ede4521839 /]# ls -l /usr/share/man/man8/dnf4.8.gz
ls: cannot access '/usr/share/man/man8/dnf4.8.gz': No such file or directory
[root@01ede4521839 /]# dnf provides /usr/share/man/man8/dnf4.8.gz
Last metadata expiration check: 0:05:59 ago on Wed Jan  1 14:31:37 2025.
…
python3-dnf-4.20.0-9.el10.noarch : Python 3 interface to DNF
Repo        : baseos
Matched from:
Filename    : /usr/share/man/man8/dnf4.8.gz

[root@01ede4521839 /]# dnf list python3-dnf
Last metadata expiration check: 0:06:16 ago on Wed Jan  1 14:31:37 2025.
Installed Packages
python3-dnf.noarch                     4.20.0-9.el10                     @System

Getrieben von Ungeduld und etwas Frust installierte unser Sysadmin nun auch das Paket python3-dnf.noarch neu, in einem letzten, verzweifelten Versuch, endlich die lang ersehnte Manpage zu erhalten.

[root@01ede4521839 /]# dnf reinstall python3-dnf.noarch
…
Reinstalled:
  python3-dnf-4.20.0-9.el10.noarch                                              

Complete!
[root@01ede4521839 /]# man 8 dnf
DNF4(8)                               DNF                              DNF4(8)

NAME
       dnf4 - DNF Command Reference

SYNOPSIS
       dnf [options] <command> [<args>...]

DESCRIPTION
       DNF  is  the  next upcoming major version of YUM, a package manager for
       RPM-based Linux distributions. It roughly maintains  CLI  compatibility
       with YUM and defines a strict API for extensions and plugins.

Na endlich! Da war sie, die so lang ersehnte und schmerzlich vermisste Manpage. Und die Mühe unseres Sysadmins wurde mit der Erkenntnis belohnt, dass die gesuchte Information auch in dieser Version von dnf(8) nicht enthalten war. Zufrieden wandte sich der Sysadmin nun dem Ticketsystem zu, um zu erfragen, warum die gesuchten Informationen nicht vorhanden sind und um eine Ergänzung anzuregen.

Und wenn er nicht gestorben ist, wartet er noch immer auf eine Antwort.

Und die Moral von der Geschichte?

Erwarte nicht Manpages in Container-Images zu finden. Unser Sysadmin wäre deutlich schneller am ZIel angelangt, hätte er direkt in den Quelltext geschaut: https://github.com/rpm-software-management/dnf/blob/master/doc/command_ref.rst

Nextcloud-Kontakte in Thunderbird einbinden

18. Juli 2025 um 04:00

Im Artikel „Nextcloud-Kalender in Thunderbird einbinden“ habe ich erklärt, wie man seine Nextcloud-Termine im Mail-Client über die CalDAV-Schnittstelle integrieren kann. Das Gleiche funktioniert auch problemlos via CardDAV mit den Kontakten. Wie das geht, beschreibe ich in diesem Artikel.

Vorbereitung in der Nextcloud

Zuerst meldet man sich über die Weboberfläche der Nexcloud an. Dort navigiert man zu den Kontakten und weiter unten links zu den Kontakte-Einstellungen.

Nextcloud – Kontakte-Einstellungen
Nextcloud – Kontakte-Einstellungen

Von hier wählt man das entsprechende Adressbuch und kopiert den Link.

Nextcloud – Adressbücher
Nextcloud – Adressbücher
Nextcloud – CardDAV-Adresse kopieren
Nextcloud – CardDAV-Adresse kopieren

Vorbereitung in Thunderbird

In Thunderbird wählt man Neues Adressbuch anlegen und im Anschluss CardDAV-Adressbuch hinzufügen.

Thunderbird – Neues Adressbuch anlegen
Thunderbird – Neues Adressbuch anlegen
Thunderbird – CardDAV-Adressbuch hinzufügen
Thunderbird – CardDAV-Adressbuch hinzufügen

Im sich öffnenden Fenster Neues CardDAV-Adressbuch gibt man nun den Benutzernamen des Nextcloud-Accounts und den zuvor kopierten Link der CardDAV-Adresse ein.

Thunderbird – Neues CardDAV-Adressbuch
Thunderbird – Neues CardDAV-Adressbuch

Diesen Vorgang bestätigt man nun mit dem Passwort des Nextcloud-Accounts und OK

Thunderbird – Authentifizierung
Thunderbird – Authentifizierung

und schließt die Einrichtung nach der Auswahl der Verfügbaren Adressbücher mit Weiter ab.

Thunderbird – Neues CardDAV-Adressbuch
Thunderbird – Neues CardDAV-Adressbuch
Thunderbird – Kontakte
Thunderbird – Kontakte

Die Kontakte werden nun wie gewünscht in Thunderbird angezeigt (siehe Screenshot).

Der Beitrag Nextcloud-Kontakte in Thunderbird einbinden erschien zuerst auf intux.de.

Digitale Selbstbestimmung mit Open Source

16. Juli 2025 um 16:00

In einer zunehmend digitalisierten Welt gewinnt das Thema Freie Software immer mehr an Bedeutung. Projekte wie Linux, WordPress und Nextcloud zeigen eindrucksvoll, wie leistungsfähig und benutzerfreundlich quelloffene Alternativen zu proprietärer Software sein können. Der Blog intux.de widmet sich seit Jahren genau diesen Themen – praxisnah, verständlich und immer nah an der Community.

Raspberry Pi: Der Einstieg in die Welt der freien Software

Besonders spannend ist der Einsatz eines Raspberry Pi. Der kleine Einplatinenrechner eignet sich hervorragend als Einstieg in die Welt von Open Source. Egal ob als lokaler Webserver für WordPress, als private Cloud mit Nextcloud oder als Linux-Desktop mit Tux als Maskottchen – die Möglichkeiten sind nahezu unbegrenzt.

Mehr Kontrolle dank quelloffener Systeme

Gerade im privaten Bereich bietet freie Software nicht nur Kostenvorteile, sondern auch ein hohes Maß an Selbstbestimmung. Wer Linux nutzt, hat die volle Kontrolle über sein System. Keine versteckten Updates, keine Telemetrie – nur der Code, der sichtbar und nachvollziehbar ist.

intux.de: Erfahrungsberichte und Tipps aus der Community

Der Blog intux.de beleuchtet regelmäßig neue Entwicklungen rund um Linux und andere Open-Source-Projekte. Die Artikel zeichnen sich durch persönliche Erfahrungen, hilfreiche Tipps und einen klaren Fokus auf quelloffene Software aus. So wird die digitale Souveränität für jedermann zugänglich.

Open Source: Eine Bewegung mit Zukunft

Ob als Werkzeug für den Alltag, als Plattform für kreative Projekte oder als Lernobjekt für IT-Interessierte – Open Source ist längst mehr als nur ein Nischenthema. Es ist eine Bewegung, die täglich wächst – und dank Seiten wie intux.de für viele Menschen greifbar und verständlich wird.

Fazit

Freie und quelloffene Software ist längst mehr als nur ein Hobby für Technik-Enthusiasten. Mit Linux, dem Raspberry Pi, WordPress oder Nextcloud stehen leistungsstarke Werkzeuge zur Verfügung, die Unabhängigkeit, Transparenz und Kontrolle über die eigene digitale Umgebung ermöglichen. Projekte wie intux.de zeigen, wie praxisnah und alltagstauglich der Einsatz von Open Source sein kann – ganz ohne Kompromisse bei Funktionalität oder Komfort. Wer bereit ist, sich ein wenig einzuarbeiten, wird mit einem System belohnt, das Freiheit und Technik sinnvoll vereint.

Der Beitrag Digitale Selbstbestimmung mit Open Source erschien zuerst auf intux.de.

Plattformübergreifend arbeiten

14. Juli 2025 um 16:00

Im digitalen Arbeitsumfeld sind heterogene IT-Strukturen längst zur Realität geworden. Man arbeitet heute in Teams, die Geräte mit unterschiedlichen Betriebssystemen nutzen – Windows, Linux und macOS koexistieren zunehmend selbstverständlich. Dabei stellt sich weniger die Frage, welches System das beste ist, sondern vielmehr, wie man plattformübergreifend sichere Arbeitsbedingungen schafft. Denn jedes Betriebssystem bringt eigene Stärken mit, aber auch spezifische Schwachstellen. Besonders im Kontext verteilter Arbeitsplätze, hybrider Teams und cloudbasierter Prozesse ist es entscheidend, Sicherheitsmaßnahmen nicht isoliert, sondern systemübergreifend zu denken. Nur wenn man versteht, wie die jeweiligen Architekturen funktionieren und wie sie auf technischer wie organisatorischer Ebene zusammenspielen, kann man Risiken minimieren. Der Zugriff auf sensible Daten, Authentifizierungsmethoden oder der Einsatz von Monitoring-Tools – all diese Bereiche müssen strategisch aufeinander abgestimmt werden.

Unterschiedliche Sicherheitsmodelle verstehen – wie man systembedingte Schwächen ausgleicht

Jedes Betriebssystem folgt einer eigenen Sicherheitsphilosophie. Um ein sicheres Zusammenspiel zu gewährleisten, muss man diese zunächst durchdringen. Windows setzt traditionell auf eine zentrale Benutzerverwaltung über Active Directory und nutzt Gruppenrichtlinien zur Durchsetzung von Sicherheitsvorgaben. macOS orientiert sich stark am UNIX-Prinzip der Benutzertrennung und bringt mit Gatekeeper und System Integrity Protection eigene Schutzmechanismen mit. Linux hingegen ist durch seine Offenheit und Modularität geprägt, was eine hohe Anpassbarkeit ermöglicht – aber auch eine größere Verantwortung beim Anwender voraussetzt.

Man darf sich nicht auf die scheinbare „Stärke“ eines Systems verlassen, sondern muss die jeweiligen Lücken kennen. Während Windows anfällig für Malware über unsichere Dienste sein kann, sind bei Linux-Konfigurationen oft Fehlbedienungen ein Einfallstor. macOS wiederum schützt zuverlässig gegen viele Schadprogramme, ist aber nicht gegen Zero-Day-Exploits immun. Die Lösung liegt in der wechselseitigen Kompensation: Man etabliert Prozesse, die die Schwächen eines Systems durch die Stärken eines anderen abfedern. Etwa durch zentrale Netzwerksegmentierung oder rollenbasierte Zugriffskonzepte. Auch einfache Maßnahmen – wie das sichere Hinterlegen und regelmäßige Erneuern eines Windows 11 Keys – tragen ihren Teil dazu bei, potenzielle Angriffsflächen zu minimieren. Wer das Sicherheitsprofil jedes Systems im Detail kennt, kann systemübergreifend robuste Schutzmechanismen implementieren.

Gemeinsame Standards etablieren – wie man durchrichtlinienübergreifende Policies implementiert

In einer Umgebung mit mehreren Betriebssystemen stößt man schnell auf ein Problem: Sicherheitseinstellungen greifen oft nur innerhalb ihrer nativen Plattform. Um dennoch einheitliche Schutzkonzepte umzusetzen, ist es erforderlich, Richtlinienbetrieb systemübergreifend zu denken. Hier kommen sogenannte Cross-Platform-Policies ins Spiel. Diese Sicherheitsrichtlinien sind nicht an ein bestimmtes Betriebssystem gebunden, sondern basieren auf übergeordneten Prinzipien wie Zero Trust, Least Privilege oder Multi-Faktor-Authentifizierung.

Man beginnt mit einer Analyse aller eingesetzten Systeme und deren zentraler Sicherheitsfunktionen. Anschließend definiert man Kernanforderungen – etwa zur Passwortsicherheit, zum Patch-Zyklus oder zur Verschlüsselung von Daten – und setzt diese mithilfe von Tools wie Microsoft Intune, Jamf oder Open Source-Pendants auf allen Plattformen durch. Dabei ist darauf zu achten, dass die Auslegung der Richtlinien nicht zu rigide erfolgt, da gerade bei Linux-Systemen individuelle Konfigurationen notwendig sein können.

Ein praktisches Beispiel ist der Umgang mit Administratorrechten. Unter Windows nutzt man Gruppenrichtlinien, unter Linux sudo-Berechtigungen, unter macOS rollenbasierte Nutzerprofile. Einheitliche Richtlinien sorgen dafür, dass man die Kontrolle über Rechtevergabe und Systemzugriffe auch bei gemischten Umgebungen nicht verliert. Selbst die Lizenzverwaltung, etwa die Zuweisung eines Windows 11 Keys, kann zentral über Plattform-Managementlösungen erfolgen – sicher, nachvollziehbar und auditierbar.

Authentifizierung, Verschlüsselung, Rechtevergabe – worauf man in gemischten Umgebungen achten muss

Die Authentifizierung bildet die erste Sicherheitsbarriere jedes Systems – unabhängig vom Betriebssystem. In einem plattformübergreifenden Setup muss man sicherstellen, dass alle eingesetzten Mechanismen ein gleich hohes Sicherheitsniveau bieten. Single Sign-On (SSO) über Identity Provider wie Azure AD oder Okta hilft, zentrale Identitäten zu verwalten und Systemzugriffe nachvollziehbar zu gestalten. Entscheidend ist, dass man auch Geräte außerhalb der Windows-Welt – etwa unter Linux oder macOS – nahtlos einbindet.

Verschlüsselung ist der zweite Eckpfeiler. Während Windows mit BitLocker arbeitet, setzen viele Linux-Distributionen auf LUKS, und macOS verwendet FileVault. Diese Tools unterscheiden sich in Funktion und Konfiguration, verfolgen jedoch dasselbe Ziel: die Integrität sensibler Daten auf Systemebene zu gewährleisten. Ein ganzheitliches Verschlüsselungskonzept stellt sicher, dass Daten unabhängig vom Endgerät geschützt sind – selbst wenn der physische Zugriff durch Dritte erfolgt.

Rechtevergabe schließlich muss nicht nur sicher, sondern auch nachvollziehbar sein. Unter Windows spielt das Active Directory eine Schlüsselrolle, unter Linux helfen Access Control Lists (ACL), während macOS ebenfalls fein abgestufte Rollenmodelle erlaubt. Die Herausforderung liegt darin, diese Mechanismen so zu verzahnen, dass keine Lücken entstehen.

Endpoint Management und Monitoring – wie man mit zentralen Tools die Kontrolle behält

In modernen Arbeitsumgebungen verlässt man sich nicht mehr auf stationäre IT-Strukturen. Notebooks, Tablets und mobile Geräte bewegen sich außerhalb klassischer Unternehmensnetzwerke. Das macht effektives Endpoint Management zur unverzichtbaren Sicherheitskomponente. Dabei steht man vor der Aufgabe, unterschiedliche Betriebssysteme gleichzeitig zu verwalten – ohne dass die Kontrolle über Konfiguration, Updates oder Zugriffsrechte verloren geht.

Man setzt auf zentrale Managementlösungen wie Microsoft Endpoint Manager, VMware Workspace ONE oder plattformunabhängige Open-Source-Ansätze wie Munki oder Ansible. Diese Tools ermöglichen es, Sicherheitsrichtlinien über Systemgrenzen hinweg auszurollen, Patches zeitnah zu verteilen und Geräte bei Auffälligkeiten sofort zu isolieren. Auch das Monitoring wird damit skalierbar und konsistent. Man erkennt unautorisierte Zugriffe, veraltete Softwarestände oder kritische Konfigurationsabweichungen – unabhängig davon, ob es sich um ein Windows-Notebook, ein Linux-Server-Device oder ein macOS-Arbeitsgerät handelt.

Ein strukturierter Lifecycle-Ansatz gehört ebenfalls dazu. Vom ersten Boot bis zum Offboarding eines Geräts muss nachvollziehbar dokumentiert werden, welche Zugriffe gewährt, welche Daten gespeichert und welche Updates durchgeführt wurden. Selbst administrative Elemente wie das Einpflegen eines Windows 11 Keys lassen sich über diese Plattformen verwalten – revisionssicher, automatisiert und zuverlässig. So wahrt man in komplexen IT-Landschaften jederzeit die Übersicht und bleibt handlungsfähig.

Der Beitrag Plattformübergreifend arbeiten erschien zuerst auf intux.de.

Thinkpad T450s ACPI Error unter Debian GNU/Linux

10. Juli 2025 um 13:08

Was bei mir so vor der Eingabe des LUKs Passwortes und dem Starten von Debian vorbeihuschte, hatte mich dann doch einmal interessiert: Kurz und knapp, es ist ein Fehler im BIOS, welcher schon seit 2013 besteht und vom T440 bis an den T460 weitergereicht wurde.Lenovo behebt den Fehler, welcher bekannt ist nicht.Jemand hat den zugehörigen ... Weiterlesen

Der Beitrag Thinkpad T450s ACPI Error unter Debian GNU/Linux erschien zuerst auf Got tty.

dnsHome bevorzugt IPv6

27. Juni 2025 um 04:00

Wenn es um den Raspberry Pi und DynDNS geht, empfehle ich gerne, wie im Artikel „Nextcloud auf dem RasPi – Teil 4“ beschrieben, als DynDNS-Anbieter den Dienst dnsHome.de. Privatanwender kommen hier in den Genuss, eine kostenlose DynDNS für kleinere Projekte nutzen zu können. Dieser Dienst arbeitet einwandfrei und sorgt dafür, dass u. a. eigene Cloud-Server nach der Zwangstrennung des Internetanbieters stets erreichbar bleiben. Durch den ständigen Abruf der öffentlichen IP und der Übermittlung bei Änderung dieser an den DynDNS-Anbieter wird sichergestellt, dass der Server über eine Subdomain immer erreichbar bleibt.

Darstellung DynDNS
Darstellung DynDNS. Quelle: Wikipedia

Nun kam es aber bei einer von mir aufgesetzten Installation in einem Telekom-Netz vor, dass die von dnsHome empfohlene Konfiguration

# Configuration file for ddclient generated by debconf
#
# /etc/ddclient.conf
 
protocol=dyndns2
ssl=yes # Erst ab ddclient Version 3.7 möglich, bitte prüfen
daemon=3600
use=web, web=ip.dnshome.de
server=www.dnshome.de
login=SUBDOMAIN.DOMAIN.TLD
password=PASSWORT
SUBDOMAIN.DOMAIN.TLD

des ddclients nicht funktionierte. Wo lag das Problem? Der Eintrag

web=ip.dnshome.de

ermittelt in diesem Netz nicht wie gewünscht die IPv4-, sondern die IPv6-Adresse und leitet diese an dnsHome weiter. Somit wurde die Verbindung der Subdomain zum Server gestört. Natürlich gibt es auch hierfür eine einfache Lösung. Durch den Austausch des zuvor erwähnten Eintrags durch

web=ip4.dnshome.de

wird das Problem behoben.

Der Beitrag dnsHome bevorzugt IPv6 erschien zuerst auf intux.de.

Upgrade von Alma Linux 9 auf Version 10

09. Juni 2025 um 08:08

Wenn Sie meinen vorigen Blogbeitrag über Hetzner-Cloud-Benchmarks gelesen haben, ist Ihnen vielleicht aufgefallen, dass ich Alma Linux 10 in einer Hetzner-Cloud-Instanz ausgeführt habe, um dort Geekbench-Tests auszuführen. Das war nicht so einfach: Hetzner bietet Alma Linux 10 noch nicht als Installations-Image an. (Update 3.7.2025: mittlerweile schon, sowohl AlmaLinux 10 als auch Rocky Linux 10)

Also habe ich eine neue Instanz zuerst mit Alma Linux 9 eingerichtet und danach mit Elevate ein Update auf Version 10 durchgeführt. Das ist erstaunlich unkompliziert gelungen, obwohl Version-10-Updates eigentlich noch im Beta-Test sind.

Update 10.7.2025: Version-10-Updates werden jetzt offiziell unterstützt (Quelle)

Was ist LEAPP, was ist Elevate?

RHEL und alle Klone durchlaufen über reguläre Updates alle Minor-Releases. Wenn Sie also Alma Linux 9.0 installiert haben, erhalten Sie durch die regelmäßige Installation von Updates nach und nach die Versionen 9.1, 9.2 usw. Ein Update auf die nächste Major-Version ist aber nicht vorgesehen.

Mit LEAPP hat Red Hat ein Framework geschaffen, um Major-Version-Updates für RHEL durchzuführen. LEAPP wurde sehr allgemeingültig konzipiert und kümmert sich um Pre-Upgrade-Kontrollen, Paketabhängigkeiten, den Workflow zwischen verschiedenen Stadien des Upgrades usw.

Elevate ist eine Community-Erweiterung zu LEAPP, die über das eigentliche Upgrade hinaus in manchen Fällen auch einen Wechsel der Paketquellen zwischen Alma Linux, CentOS, Oracle Linux und RockyLinux durchführen kann. Sie können mit Elevate beispielsweise zuerst von CentOS 7 zu RockyLinux 8 migrieren und dann weiter zu Rocky Linux 9 upgraden.

Mögliche Migrationspfade für »Elevate« (Stand: Juni 2026, Bildquelle: https://wiki.almalinux.org/elevate/ELevate-quickstart-guide.html)

Vorbereitungsarbeiten

Bevor Sie Elevate anwenden, müssen Sie ein vollständiges Backup durchführen und Ihren Rechner bzw. Ihre virtuelle Maschine neu starten:

dnf update
reboot

Danach richten Sie eine Paketquelle für Elevate ein und installieren das für Sie relevante Upgrade-Modul (für das Beispiel in diesem Artikel mit der Zieldistribution Alma Linux also leapp-data-almalinux).

dnf install -y http://repo.almalinux.org/elevate/elevate-release-latest-el$(rpm --eval %rhel).noarch.rpm

# für AlmaLinux
dnf install leapp-upgrade leapp-data-almalinux

# alternativ für Rocky Linux (etc.)
dnf install leapp-upgrade leapp-data-rocky

Als nächstes folgt ein Test, ob das gewünschte Upgrade (plus gegebenenfalls eine Migration zu einer anderen Distribution, hier nicht relevant) überhaupt möglich ist:

leapp preupgrade

leapp preupgrade erzeugt zwei Dateien: Einen umfassenden Bericht, der alle möglichen Probleme aufzählt, und eine answer-Datei, in die Sie gegebenenfalls Optionen eintragen müssen (z.B. mit leapp answer --section check_vdo.confirm=True). In meinem Fall — Upgrade einer Minimalinstallation von Alma Linux 9 auf 10, hat leapp preupgrade auf die folgenden Probleme hingewiesen, aber keine answer-Einträge verlangt.

  • High: veraltete Netzwerkkonfiguration in /etc/sysconfig/network-scripts
  • High: unbekannte Systemdateien (»Aktoren«)
  • High: unbekannte Pakete (hc-utils)
  • Medium: Berkeley DB (libdb) ist installiert, wird in RHEL 10 nicht mehr unterstützt
  • Low: unbekannten Paket-Repositories
cat /var/log/leapp/leapp-report.txt

  Risk Factor: high (inhibitor)
  Title: Legacy network configuration found
  Summary: Network configuration files in legacy "ifcfg" format are present ...
      - /etc/sysconfig/network-scripts/ifcfg-eth0
  Related links:
      - How to migrate the connection from ifcfg to NetworkManager keyfile plugin?:
        https://access.redhat.com/solutions/7083803
      - nmcli(1) manual, describes "connection migrate" sub-command.:
        https://networkmanager.dev/docs/api/latest/nmcli.html
      ...
  Remediation: [hint] Convert the configuration into NetworkManager native "keyfile" format.

  ----------------------------------------
  Risk Factor: high 
  Title: Detected custom leapp actors or files.
  Summary: We have detected installed custom actors or files on the system. 
    These can be provided e.g. by third party vendors ... This is allowed 
    and appreciated. However Red Hat is not responsible for any issues caused 
    by these custom leapp actors ...
  The list of custom leapp actors and files:
    - /usr/share/leapp-repository/repositories/system_upgrade/\
       common/files/distro/almalinux/rpm-gpg/10/RPM-GPG-KEY-AlmaLinux-10
    - /usr/share/leapp-repository/repositories/system_upgrade/\
      common/files/rpm-gpg/10/RPM-GPG-KEY-AlmaLinux-10

  ...

Den vollständigen Report können Sie sich hier durchlesen.

Migration der Netzwerkkonfiguration

Wirklich kritisch war aus meiner Sicht nur die Netzwerkkonfiguration; die restlichen Hinweise und Empfehlungen habe ich ignoriert. Das Paket hc-utils (Hetzner Cloud Utilities) ist nur für Funktionen relevant, die in meinem Fall ohnedies nicht genutzt werden (siehe hier).

Auch die veraltete Netzwerkkonfiguration stammt vom Hetzner-Image für Alma Linux 9. Eine Umstellung auf eine *.nmconnection-Datei für den NetworkManager gelingt erstaunlich unkompliziert mit einem einzigen Kommando:

nmcli connection migrate /etc/sysconfig/network-scripts/ifcfg-eth0

Mit einem weiteren Reboot habe ich sichergestellt, dass die Umstellung auch funktioniert.

Das Upgrade

leapp upgrade initiiert nun das Upgrade auf Alma Linux 10. Dabei werden seitenweise Logging-Ausgaben produziert (siehe den kompletten Output mit ca. 3150 Zeilen):

leapp upgrade

  ==> Processing phase `configuration_phase` ...
  ==> Processing phase `FactsCollection` ...
  ...
  ==> Processing phase `TargetTransactionFactsCollection`
      Create custom repofile containing information about 
      repositories found in target OS installation ISO, if used.
      Initializes a directory to be populated as a minimal environment
      to run binaries from the target system.

      AlmaLinux 10.0 - BaseOS                         5.9 MB/s | 2.8 MB     00:00    
      AlmaLinux 10.0 - AppStream                       11 MB/s | 5.6 MB     00:00    
      AlmaLinux 10.0 - CRB                            5.0 MB/s | 2.2 MB     00:00    
      AlmaLinux 10.0 - HighAvailability               161 kB/s |  69 kB     00:00    
      AlmaLinux 10.0 - Extras                          28 kB/s |  12 kB     00:00    
      AlmaLinux 10.0 - SAP                            8.3 kB/s | 3.5 kB     00:00    
      AlmaLinux 10.0 - SAPHANA                         35 kB/s |  15 kB     00:00    
      AlmaLinux 10.0 - RT                             2.8 MB/s | 1.1 MB     00:00    
      AlmaLinux 10.0 - NFV                            2.8 MB/s | 1.1 MB     00:00    
      Dependencies resolved.

      ...
      Transaction Summary: Install  153 Packages
      ...
      Complete!

  ==> Processing phase `TargetTransactionCheck`
  ...
  Transaction Summary
  Install     63 Packages
  Upgrade    389 Packages
  Remove      18 Packages
  Downgrade    3 Packages
  Transaction test succeeded.
  Complete!

  ====> add_upgrade_boot_entry
        Add new boot entry for Leapp provided initramfs.

  A reboot is required to continue. Please reboot your system.

  Debug output written to /var/log/leapp/leapp-upgrade.log

  ============================================================
                        REPORT OVERVIEW                       
  ============================================================

  HIGH and MEDIUM severity reports:
      1. Packages not signed by Red Hat found on the system
      2. Detected custom leapp actors or files.
      3. Berkeley DB (libdb) has been detected on your system

  Reports summary:
      Errors:                      0
      Inhibitors:                  0
      HIGH severity reports:       2
      MEDIUM severity reports:     1
      LOW severity reports:        2
      INFO severity reports:       1

  Before continuing, review the full report below for details about discovered 
  problems and possible remediation instructions:

      A report has been generated at /var/log/leapp/leapp-report.txt
      A report has been generated at /var/log/leapp/leapp-report.json

  ============================================================
                     END OF REPORT OVERVIEW                   
  ============================================================

  Answerfile has been generated at /var/log/leapp/answerfile
  Reboot the system to continue with the upgrade. This might take a while 
  depending on the system configuration.
  Make sure you have console access to view the actual upgrade process.

Jetzt wird es unheimlich: Mit reboot starten Sie die nächste Phase des Upgrade-Prozesses, der im Blindflug erfolgt. Der Rechner bzw. die virtuelle Maschine wird während dieser Phase noch einmal neu gestartet. Wenn Sie nicht vor dem Rechner sitzen, sehen Sie weder, was passiert, noch haben Sie über eine SSH-Verbindung die Möglichkeit, einzugreifen.

reboot

Wenn alles gut geht, können Sie sich nach ein paar Minuten wieder einloggen. Bei mir hat es funktioniert:

ssh root@1.2.3.4

cat /etc/os-release

  NAME="AlmaLinux"
  VERSION="10.0 (Purple Lion)"
  ID="almalinux"
  ID_LIKE="rhel centos fedora"
  VERSION_ID="10.0"
  PLATFORM_ID="platform:el10"
  PRETTY_NAME="AlmaLinux 10.0 (Purple Lion)"
  ANSI_COLOR="0;34"
  LOGO="fedora-logo-icon"
  CPE_NAME="cpe:/o:almalinux:almalinux:10::baseos"
  HOME_URL="https://almalinux.org/"
  DOCUMENTATION_URL="https://wiki.almalinux.org/"
  VENDOR_NAME="AlmaLinux"
  VENDOR_URL="https://almalinux.org/"
  BUG_REPORT_URL="https://bugs.almalinux.org/"

  ALMALINUX_MANTISBT_PROJECT="AlmaLinux-10"
  ALMALINUX_MANTISBT_PROJECT_VERSION="10.0"
  REDHAT_SUPPORT_PRODUCT="AlmaLinux"
  REDHAT_SUPPORT_PRODUCT_VERSION="10.0"
  SUPPORT_END=2035-06-01

Anmerkungen und Einschränkungen

Ich habe mit diesem Experiment erreicht, was ich haben wollte: eine funktionierende, minimale Alma-Linux-10-Installation in einer im Internet erreichbaren virtuellen Maschine. Ich kann damit experimentieren. Vermutlich wird Hetzner in ein paar Wochen Alma Linux 10 als reguläres Cloud-Installations-Image anbieten. Dann werde ich diese Installation vermutlich wieder abschalten.

In der Vergangenheit habe ich Elevate auch schon auf lokale virtuelle Maschinen mit (nicht besonders wichtigen) Testumgebungen angewendet, ebenfalls zu meiner Zufriedenheit.

Aber ich würde mich niemals trauen, für ein produktiv wichtiges System auf diese Weise ein Upgrade oder womöglich eine Migration auf eine andere Distribution durchzuführen — und schon gar nicht, wenn ich keinen physischen Zugriff auf die Installation habe. Es kann dabei so viel schief gehen! Es ist unklar, ob danach überhaupt eine Reparatur möglich ist, und wenn ja, wie lange diese dauern würde.

Vergessen Sie zuletzt nicht, dass das Upgrade von Alma Linux 9 auf Version 10 aktuell noch im Beta-Test ist. Bei meinem Minimalsystem hat es funktioniert, aber das ist keine Garantie, dass das bei Ihnen auch klappt!

Kurz und gut: Die Kombination aus LEAPP und Elevate bietet eine großartige Möglichkeit, Major Upgrades für RHEL und seine Klone durchzuführen. Das ist ideal für Entwicklungs- und Testsysteme. Aber wie bei jedem Linux-Distributions-Upgrade kann dabei viel schief gehen. Der sichere Weg für produktiv wichtige Installationen ist immer eine Neuinstallation! Sie können dann in aller Ruhe sämtliche Funktionen testen, zum Schluss die Daten migrieren und mit minimaler Downtime eine Umstellung durchführen.

Quellen/Links

Hetzner Cloud Mini-Benchmark

08. Juni 2025 um 17:16

Die zwei günstigsten Angebote in der Hetzner-Cloud sind Instanzen mit zwei CPU-Cores, 4 GB RAM und 40 GB Diskspace: Einmal mit virtuellen ARM-CPU-Cores (»CAX11«), einmal mit virtuellen x86-Cores (»CX22«). Der Preis ist identisch: 3,95 EUR/Monat inkl. USt (für D) plus ein Aufpreis von 0,50 EUR/Monat für eine IPv4-Adresse. Die naheliegende Frage ist: Welches Angebot gibt mehr Rechenleistung? Dieser Frage bin ich an einem verregneten Pfingstsonntag auf den Grund gegangen.

Ein »virtueller CPU-Core« heißt in diesem Zusammenhang, dass auf einem Server mehrere/viele virtuelle Maschinen laufen. Je nach Auslastung kann es sein, dass die für eine virtuelle Maschine vorgesehen CPU-Cores nicht vollständig verfügbar sind. Es gibt auch virtuelle Maschinen mit dezidierten Cores, die immer zur Verfügung stehen — aber die sind natürlich teurer.

Auswahl verschiedener Cloud-Instanzen

Testbedingungen

Für meine Tests habe ich zwei Cloud-Instanzen mit Alma Linux 9 eingerichtet, einmal mit zwei ARM-CPU-Cores (CAX11), einmal mit zwei x86-CPU-Cores (CX11). Außer tar und Geekbench habe ich keine weitere Software installiert. /proc/cpuinfo lieferte die folgenden Ergebnisse:

cat /proc/cpuinfo    # CX11 / x86

processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 85
model name      : Intel Xeon Processor (Skylake, IBRS, no TSX)
stepping        : 4
microcode       : 0x1
cpu MHz         : 2099.984
cache size      : 16384 KB
physical id     : 0
siblings        : 2
core id         : 0
cpu cores       : 2
apicid          : 0
initial apicid  : 0
fpu             : yes
fpu_exception   : yes
cpuid level     : 13
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology cpuid tsc_known_freq pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch cpuid_fault pti ssbd ibrs ibpb fsgsbase bmi1 avx2 smep bmi2 erms invpcid avx512f avx512dq rdseed adx smap clwb avx512cd avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves arat pku ospke md_clear
bugs            : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs itlb_multihit mmio_stale_data retbleed gds bhi
bogomips        : 4199.96
clflush size    : 64
cache_alignment : 64
address sizes   : 40 bits physical, 48 bits virtual
power management:

processor       : 1
...
cat /proc/cpuinfo   # CAX11 / ARM (Ampere)

processor   : 0
BogoMIPS    : 50.00
Features    : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm lrcpc dcpop asimddp
CPU implementer : 0x41
CPU architecture: 8
CPU variant : 0x3
CPU part    : 0xd0c
CPU revision    : 1

processor   : 1
...

Geekbench-Ergebnisse

In beiden virtuellen Maschinen habe ich mit wget Geekbench heruntergeladen, mit tar xzf ausgepackt und dann dreimal ausgeführt. Die Ergebnisse:

CX11 / x86 / Alma Linux 9

Single   Multi Core
------  -----------
   698         1203
   692         1207
   642         1205

--------------------------

CAX11 / ARM / Alma Linux 9

Single   Multi Core
------  -----------
  1082         1979
  1084         1982
  1079         1965

Zuletzt wollte ich noch wissen, ob Alma Linux 10 bei gleicher Hardware mehr Speed liefert (schnellerer Kernel, bessere Optimierung/Kompilierung der Programme etc.). Diese Tests habe ich nur auf der ARM-Instanz durchgeführt.

CAX11 / ARM / Alma Linux 10

Single   Multi Core
------  -----------
  1078         1971
  1069         1963
  1077         1974

Zusammenfassung: Bei meinen Tests boten die CAX11-Instanzen bei gleichen Kosten fast 50% mehr Leistung. Alma Linux 9 versus 10 ergibt dagegen keinen messbaren Unterschied.

PS: Geekbench ist noch nicht im IPv6-Zeitalter angekommen. Ist ja auch wirklich eine ganz neue Technologie … Wenn Sie selbst Tests durchführen wollen, müssen Sie die Instanz mit einer IPv4-Adresse konfigurieren. Weder gelingt der Download (das lässt sich umgehen), noch kann ./geekbench6 danach die Ergebnisse hochladen.

Einschränkungen

Bitte überbewerten Sie die Ergebnisse nicht! Die Hetzner-Cloud-Seite gibt keinerlei Informationen darüber, auf welchem Server bzw. auf welcher CPU Ihre virtuellen Maschinen laufen werden. Hetzner hat mehrere Rechenzentren mit unzähligen Server, mit Glück oder Pech landet Ihre virtuelle Maschine auf einem anderen, besser oder schlechter ausgestatteten Server. Das hier präsentierte Ergebnis ist nur eine Momentaufnahme, kein professionell über Wochen durchgeführter Test!

Es erscheint mir unwahrscheinlich, dass zum Testzeitpunkt (Sonntag nachmittag) die Cloud-Server besonders stark ausgelastet waren, aber es ist natürlich denkbar, dass das Ergebnis durch die Aktivität anderer virtueller Maschinen beeinflusst wurde.

Geekbench ist definitiv nicht das Maß der Dinge für Server-Benchmarks. Aber Geekbench lässt sich leicht installieren und ausführen, außerdem sind die Ergebnisse mit Desktop-Hardware vergleichbar. Sagen wir so: Um die CPU-Performance zu vergleichen, sind die Tests aus meiner Sicht gut genug.

Zu guter Letzt habe ich ausschließlich die billigsten Cloud-Angebote verglichen (die bei meinen Anwendungen aber oft ausreichen). Es gibt viele weitere Varianten, z.B. »CPX11« (2 AMD-Cores, nur 2 GB RAM, 40 GB Disk).

Kurz und gut: Dieser Test besagt NICHT, dass ARM immer mehr Leistung als x86 bietet. Zum Zeitpunkt meiner Tests und bei den von mir gewählten Randbedingungen erscheint es aber so, also würden Sie bei preisgünstige Cloud-Instanzen mit ARM-CPUs aktuell mehr Leistung bekommen als bei Instanzen zum gleichen Preis mit x86-Hardware.

Quellen/Links

AlmaLinux 10

29. Mai 2025 um 08:36

Seit einigen Jahren ist CentOS kein produktionstauglicher RHEL-Klon mehr. Wer RHEL produktiv nutzen will, aber nicht dafür bezahlen kann, hat die Qual der Wahl: zwischen AlmaLinux, CentOS Stream (nicht für Langzeitnutzung), Oracle Linux, RHEL via Developer Subscription und Rocky Linux. Ich bin ein wenig zufällig im AlmaLinux-Lager gelandet und habe damit über mehrere Jahre, vor allem im Unterricht, ausgezeichnete Erfahrungen gemacht.

Nach diversen Tests mit der Beta-Version läuft AlmaLinux 10 jetzt nativ auf meinem Mini-PC (AMD 8745H), außerdem die aarch64-Variante in einer virtuellen Maschine auf meinem Mac. Dieser Artikel stellt die neue Version AlmaLinux 10 vor, die am 27. Mai 2025 freigegeben wurde, genau eine Woche nach dem Release von RHEL 10. Die meisten Informationen in diesem Artikel gelten auch für RHEL 10 sowie für die restlichen Klone. Oft beziehe ich mich daher im Text auf RHEL (Red Hat Enterprise Linux), also das zugrundeliegende Original. Es gibt aber auch ein paar feine Unterschiede zwischen dem Original und seinen Klonen.

AlmaLinux 10 mit Gnome Desktop

Ich habe vor, diesen Artikel in den nächsten Wochen zu aktualisieren, wenn ich mehr Erfahrungen mit AlmaLinux 10 gemacht habe und es zu Rocky Linux 10 und Oracle Linux 10 weitere Informationen gibt.

Update 8.6.2025: Der MySQL-Server ist per Default weiterhin offen wie ein Scheunentor.

Update 16.6.2025: Zu Rocky Linux 10 gibt es jetzt auch Release Notes.

Update 16.6.2025: Postfix und BDB vs LMDB

Update 27.6.2025: Oracle Linux 10 ist auch verfügbar, ich habe am Ende des Artikels Links zum Oracle-Blog und zu den Release Notes eingebaut

Update 3.7.2025: Im Hetzner-Cloud-Konfigurator können Sie jetzt auch AlmaLinux 10 und Rocky Linux 10 auswählen. Die Netzwerkkonfiguration erfolgt durch /etc/NetworkManager/system-connections/cloud-init-eth0.nmconnection (nicht mehr durch die veralteten Dateien in /etc/syconfig/network-scripts).

Versionsnummern und Paketverwaltung

Basis               Programmierung     Server
---------------     --------------     ---------------
Kernel     6.12     bash       5.2     Apache      2.4
glibc      2.39     gcc       14.2     CUPS        2.4
Wayland    1.23     git       2.47     MySQL       8.4
Gnome        47     Java        21     MariaDB   11.11
Mesa       24.2     PHP        8.3     OpenSSH     9.9
Systemd     257     Podman     5.4     PostgreSQL 16.8
NetworkMan 1.52     Python    3.12     Postfix     3.8
GRUB       2.12     Node.js     22     qemu/KVM    9.1
                                       Samba      4.21

Red Hat hat mit RHEL 10 den X.org-Server aus den Paketquellen entfernt. RHEL setzt damit voll auf Wayland. (Mit XWayland gibt es für X-Client-Programme eine Kompatibilitätsschicht.) Weil RHEL und seine Klone zumeist im Server-Betrieb und ohne grafische Benutzeroberfläche laufen, ist der Abschied von X.org selten ein großes Problem. Einschränkungen können sich aber im Desktop-Betrieb ergeben, vor allem wenn statt Gnome ein anderes Desktop-System eingesetzt werden soll.

Eine Menge wichtiger Desktop-Programme sind aus den regulären Paketquellen verschwunden, unter anderem Gimp und LibreOffice. RHEL empfiehlt, die Programme bei Bedarf aus Flathub zu installieren. Davon abgesehen ist aber kein Wechsel hin zu Flatpaks zu bemerken. flatpak list ist nach einer Desktop-Installation leer.

In der Vergangenheit haben RHEL & Co. von wichtigen Software-Produkten parallel unterschiedliche Versionen ausgeliefert. Dabei setzte RHEL auf das Kommando dnf module. Beispielsweise stellte RHEL 9 Mitte 2025 die PHP-Versionen 8.1, 8.2 und 8.3 zur Auswahl (siehe dnf module list php).

Anscheinend sollen auch in RHEL 10 unterschiedliche Versionen (»AppStreams«) angeboten werden — allerdings nicht mehr in Form von dnf-Modulen. Wie der neue Mechanismus aussieht, habe ich nach dem Studium der Release Notes allerdings nicht verstanden.

Administration und Logging

Wie schon in den vergangenen Versionen setzt RHEL zur Administration auf Cockpit. Die Weboberfläche ist per Default aktiv, nicht durch eine Firewall geschützt und über Port 9090 erreichbar.

Zur Webadministration ist »Cockpit« auf Port 9090 vorgesehen

Bei einer Desktop-Installation sind standardmäßig rsyslog und das Journal installiert. rsyslog protokolliert wie eh und je in Textdateien in /var/log. Das Journal führt dagegen keine persistente Speicherung durch. Die Logging-Dateien landen in einem temporären Dateisystem in /run/log/journal und verschwinden mit jedem Reboot wieder. Wenn Sie ein dauerhaftes Journal wünschen, führen Sie die folgenden Kommandos aus:

mkdir /var/log/journal

systemctl restart systemd-journald
systemctl restart systemd-journal-flush
systemctl restart systemd-journald.socket

MySQL

Unbegreiflicherweise ist MySQL — jetzt in Version 8.4 — auch in RHEL 10 per Default so konfiguriert, dass jeder Benutzer mit mysql -u root ohne Passwort volle MySQL-Administrationsrechte erhält. Bei Ubuntu erhält per Default nur sudo mysql Admin-Rechte, und bei MariaDB (egal, ob unter Debian, Fedora, RHEL oder Ubuntu) gilt die gleiche Regel. Warum also nicht auch bei RHEL und MySQL?

Wie dem auch sei, das Problem ist nicht neu. Führen Sie also unmittelbar nach der Installation von mysql-server das Kommando mysql_secure_installation aus! Entscheidend ist dabei die Einstellung einen root-Passworts für MySQL.

sudo mysql_secure_installation

  Would you like to setup VALIDATE PASSWORD component? y
  There are three levels of password validation policy:
    LOW    Length >= 8
    MEDIUM Length >= 8, numeric, mixed case, and special characters
    STRONG Length >= 8, numeric, mixed case, special characters, 
           dictionary file
    Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 1
  Please set the password for root here.
    New password: ************
    Re-enter new password: ************
  Disallow root login remotely? y
  Remove test database and access to it? y
  Reload privilege tables now? y

Postfix und BDB versus LMDB

RHEL 10 liefert den Mail-Server Postfix in der Version 3.8 aus. Bei früheren RHEL-Versionen hat Postfix Berkeley Datenbanken (BDB) zur Speicherung von Konfigurationstabellen verwendet. Mit RHEL 10 wird allerdings die libdbd-Bibliotheken aufgrund von Lizenzproblemen nicht mehr mitgeliefert. Postfix verwendet jetzt per Default LMDB-Datenbanken:

grep lmdb /etc/postfix/main.cf

  alias_maps = lmdb:/etc/aliases
  alias_database = lmdb:/etc/aliases
  default_database_type = lmdb

So weit, so gut. Ich bin beim Versuch, einen Postfix-Server einzurichten, allerdings über die Datei /etc/aliases gestolpert. Bisher was es notwendig, nach jeder Änderung in dieser Datei die entsprechende BDB-Datenbank aliases.db mit dem Kommando newaliases neu zu generieren. Genau dieser Hinweis steht auch in der von RHEL ausgelieferten Beispieldatei /etc/aliases. Und erstaunlicherweise funktioniert das Kommando auch unter RHEL 10. newaliases ist über fünf Links mit /usr/sbin/smtpctl aus dem Paket opensmtpd verbunden und scheint weiterhin BDB-Funktionen zu enthalten, Lizenzsorgen hin oder her.

Das Problem ist allerdings, dass Postfix /etc/aliases.db ignoriert und sich stattdessen darüber beklagt, dass es /etc/aliases.lmdb nicht gibt.

journalctl -u postfix

  ... postfix/smtpd[56492]: error: open database /etc/aliases.lmdb: No such file or directory

Ich habe eine Weile gebraucht, bis ich einen Weg gefunden habe, aliases.lmdb zu erzeugen. Das richtige Kommando, das newaliases ersetzt, sieht jetzt so aus:

postalias /etc/aliases

Virtualisierung

Red Hat enthält die üblichen qemu/kvm-Pakete als Basis für den Betrieb virtueller Maschinen. Die Steuerung kann wahlweise auf Kommandoebene (virsh) oder mit der Weboberfläche Cockpit erfolgen.

Das wesentlich komfortablere Programm virt-manager hat Red Hat schon vor Jahren als obsolet bezeichnet, und ich hatte Angst, das Programm wäre mit Version 10 endgültig verschwunden. Aber überraschenderweise gibt es das Paket weiterhin im CodeReady-Builder-Repository:

crb enable
dnf install virt-manager

virt-manager ist aus meiner Sicht die einfachste Oberfläche, um virtuelle Maschinen auf der Basis von QEMU/KVM zu verwalten. Red Hat empfiehlt stattdessen Cockpit (dnf install cockpit-machines), aber dieses Zusatzmodul zur Weboberfläche Cockpit hat mich bisher nicht überzeugen können. Für die Enterprise-Virtualisierung gibt es natürlich auch OpenShift und OpenStack, aber für kleine Lösungen schießen diese Angebote über das Ziel hinaus.

Bereits in RHEL 9 hat Red Hat die Unterstützung für Spice (Simple Protocol for Independent Computing Environments) eingestellt (siehe auch dieses Bugzilla-Ticket). Spice wurde/wird von virt-manager als bevorzugtes Protokoll zur Übertragung des grafischen Desktops verwendet. Die Alternative ist VNC.

Abweichend von RHEL wird Spice von AlmaLinux weiter unterstützt (siehe Release Notes).

EPEL (Extra Packages for Enterprise Linux)

Zu den ersten Aktionen in RHEL 10 oder einem Klon gehört die Aktivierung der EPEL-Paketquelle. In AlmaLinux gelingt das einfach mit dnf install epel-release. Es wird empfohlen, zusammen mit EPEL auch die gerade erwähnte CRB-Paketquelle zu aktivieren.

Die EPEL-10-Paketquelle ist mit schon gut gefüllt. dnf repository-packages epel list | wc -l meldet über 17.000 Pakete! Ein paar Pakete habe ich dennoch vermisst:

  • google-authenticator fehlt noch, ist aber in EPEL 10.1 für Fedora schon enthalten, wird also hoffentlich auch für RHEL10 & Klone bald verfügbar sein.
  • joe fehlt ebenfalls nicht mehr (Stand 3.7.2025). Ich installiere dieses Editor-Paket gerne, weil es jmacs zur Verfügung stellt, eine minimale Emacs-Variante. Ich bin vorerst auf mg umgestiegen, es entspricht meinen Ansprüchen ebenfalls. (Ich bin kein vi-Fan, und nano ist mir ein bisschen zu minimalistisch. Den »richtigen« Emacs brauche ich aber auch nicht, um zwei Zeilen in /etc/hosts zu ändern.)

AlmaLinux in der Hetzner-Cloud

Hetzner bietet mittlerweile vorkonfigurierte Cloud-Instanzen für AlmaLinux 10 und RockyLinux 10 an. Die einzige wesentliche Neuerung, die mir aufgefallen ist, betrifft die Netzwerkkonfiguration. Während Hetzner bis Version 9 auf die eigentlich dort schon veralteten Dateien in /etc/sysconfig/network-scripts gesetzt hat, kümmert sich jetzt eine NetworkManager-Datei um die Konfiguration. Beispiel:

cat /etc/NetworkManager/system-connections/cloud-init-eth0.nmconnection

# Generated by cloud-init. Changes will be lost.
[connection]
id=cloud-init eth0
uuid=1dd9a779-d327-56e1-8454-c65e2556c12c
autoconnect-priority=120
type=ethernet

[user]
org.freedesktop.NetworkManager.origin=cloud-init

[ethernet]
mac-address=96:00:04:6E:A0:A0

[ipv4]
method=auto
may-fail=false

[ipv6]
method=manual
may-fail=false
address1=2a01:4f8:1c17:53db::1/64
gateway=fe80::1
dns=2a01:4ff:ff00::add:1;2a01:4ff:ff00::add:2;

AlmaLinux versus Original (RHEL)

Im Wesentlichen verwendet AlmaLinux den gleichen Quellcode wie RHEL und ist zu diesem vollständig kompatibel. Es gibt aber ein paar feine Unterschiede:

  • Seit RHEL den Zugang zum Quellcodes für die Updates erschwert hat (siehe Ärger für Red-Hat-Klone und Red Hat und die Parasiten), greift AlmaLinux auch auf den Upstream-Quellcode einzelner Projekte zu, führt Bugfixes/Sicherheits-Updates zum Teil früher durch als RHEL und besteht nicht mehr auf eine vollständige Bit-für-Bit- und Bug-für-Bug-Kompatibilität. Im Detail ist diese Strategie und das Ausmaß der Kompatibilität hier dokumentiert.
  • Red Hat hat RHEL 10 für x86_v3 kompiliert, unterstützt damit nur relativ moderne Intel- und AMD-CPUs. Deswegen läuft RHEL 10 auf älteren Computern nicht mehr! Alma Linux macht es ebenso, bietet aber darüber hinaus eine v2-Variante an und unterstützt damit auch ältere Hardware. Die Mikroarchitektur-Unterschiede zwischen v2 und v3 sind z.B. in der Wikipedia sowie auf infotechys.com beschrieben. Das v2-Angebot umfasst auch die EPEL-Paketquelle.

  • Der Verzicht auf Bit-für-Bit-Kompatibilität gibt AlmaLinux die Möglichkeit, sich in einigen Details vom Original abzuheben. Das betrifft unter anderem die Unterstützung von Frame Pointers als Debugging-Hilfe sowie die fortgesetzte Unterstützung des Protokolls Spice,

AlmaLinux vs RockyLinux und Oracle Linux

In der Vergangenheit waren alle Klone praktisch gleich. Nun gut, Oracle hat immer einen eigenen »unbreakable« Kernel angeboten, aber davon abgesehen war das gesamte Paketangebot Bit für Bit kompatibel zum Original, kompiliert aus den gleichen Quellen. Die Extrapakete aus der EPEL-Quelle sind sowieso für das Original und seine Klone ident.

Seit Red Hat 2023 den Zugriff auf den Source-Code aller Updates eingeschränkt bzw. deutlich weniger unbequemer gemacht hat, haben sich AlmaLinux auf der einen und Rocky Linux und Oracle Linux auf der anderen Seite ein wenig auseinander entwickelt. AlmaLinux hat den Anspruch auf Bit-für-Bit-Kompatibilität aufgegeben (siehe oben). Rocky Linux und Oracle Linux beziehen den Quellcode für Updates hingegen nun aus anderen öffentlichen Quellen, unter anderem aus Cloud- und Container-Systemen (Quelle).

RHEL Developer

Für Entwickler macht Red Hat mit dem Red Hat Developer eigentlich ein attraktives Angebot. Nach einer Registrierung gibt es 16 freie Lizenzen für Tests und Entwicklungsarbeit. Ich habe einen entsprechenden Account, habe RHEL 10 installiert und registriert, bin aber dennoch nicht in der Lage, die Paketquellen zu aktivieren. Vielleicht bin ich zu blöd, vielleicht wird RHEL 10 noch nicht unterstützt (diesbezüglich fehlt klare Dokumentation) — ich weiß es nicht. Ich habe es ein paar Stunden probiert, und ich werde es in ein paar Wochen wieder versuchen. Vorerst fehlt mir dazu aber die Zeit und der Nerv.

Quellen und Links

AlmaLinux Release Notes und Dokumentation

Rocky Linux Release Notes

Red Hat Release Notes und Dokumentation

Oracle Linux Release Notes

Berkeley Databases (BDB)

Andere Test- und News-Berichte

Frühere eigene Blog-Artikel

Sonstiges

acme.sh für eine REST-API

26. Mai 2025 um 07:36

Seit vielen Jahren verwende ich Let’s Encrypt-Zertifikate für meine Webserver. Zum Ausstellen der Zertifikate habe ich in den Anfangszeiten das Kommando certbot genutzt. Weil die Installation dieses Python-Scripts aber oft Probleme bereitete, bin ich schon vor vielen Jahren auf das Shell-Script acme.sh umgestiegen (siehe https://github.com/acmesh-official/acme.sh).

Kürzlich bin ich auf einen Sonderfall gestoßen, bei dem acme.sh nicht auf Anhieb funktioniert. Die Kurzfassung: Ich verwende Apache als Proxy für eine REST-API, die in einem Docker-Container läuft. Bei der Zertifikatausstellung/-erneuerung ist Apache (der auf dem Rechner auch als regulärer Webserver läuft) im Weg; die REST-API liefert wiederum keine statischen Dateien aus. Die Domain-Verifizierung scheitert. Abhilfe schafft eine etwas umständliche Apache-Konfiguration.

Ausgangspunkt

Ausgangspunkt ist also ein »gewöhnlicher« Apache-Webserver. Dieser soll nun zusätzlich eine REST-API ausliefern, die in einem Docker-Container läuft (localhost:8880). Die erste Konfiguration sah ziemlich simpel aus:

# zusätzliche Apache-Proxy-Konfigurationsdatei 
# für einen Docker-Container 
<VirtualHost *:443>
    ServerName api.example.com

    # SSL
    SSLEngine on
    SSLCertificateFile    /etc/acme-letsencrypt/api.example.com.pem
    SSLCertificateKeyFile /etc/acme-letsencrypt/api.example.com.key

    # Proxy: localhost:8880 <-> https://api.example.com
    ProxyPreserveHost On
    ProxyPass         / http://localhost:8880/
    ProxyPassReverse  / http://localhost:8880/

    # Logging Konfiguration ...
</VirtualHost>


#  HTTP -> HTTPS
<VirtualHost *:80>
    ServerName api.example.com
    Redirect permanent / https://api.example.com
</VirtualHost>

Das Problem

Das Problem besteht darin, dass acme.sh zwar diverse Domain-Verifizierungsverfahren kennt, aber keines so richtig zu meiner Konfiguration passt:

  • acme.sh ... --webroot scheitert, weil die API eine reine API ist und keine statischen Dateien ausliefert.
  • acme.sh ... --standalone scheitert, weil der bereits laufende Webserver Port 80 blockiert.
  • acme.sh ... --apache scheitert mit could not resolve api.example.com.well-known.

Die Lösung

Die Lösung besteht darin, die Apache-Proxy-Konfiguration dahingehend zu ändern, dass zusätzlich in einem Verzeichnis statische Dateien ausgeliefert werden dürfen. Dazu habe ich das neue Verzeichnis /var/www/acme-challenge eingerichtet:

mkdir /var/www/acme-challenge
chown www-data:www-data /var/www/acme-challenge/

Danach habe ich die Konfigurationsdatei für Apache umgebaut, so dass Anfragen an api.example.com/.well-known/acme-challenge mit statischen Dateien aus dem Verzeichnis /var/www/acme-challenge/.well-known/acme-challenge bedient werden:

# Apache-Konfiguration wie bisher
<VirtualHost *:443>
    ServerName api.example.com

    # SSL
    SSLEngine on
    SSLCertificateFile    /etc/acme-letsencrypt/api.example.com.pem
    SSLCertificateKeyFile /etc/acme-letsencrypt/api.example.com.key

    # Proxy: localhost:8880 <-> api.example.com
    ProxyPreserveHost On
    ProxyPass         / http://localhost:8880/
    ProxyPassReverse  / http://localhost:8880/

    # Logging Konfiguration ...
</VirtualHost>

# geändert: HTTP auf HTTPS umleiten, aber nicht
# für well-known-Verzeichnis
<VirtualHost *:80>
    ServerName api.example.com

    # Handle ACME challenges locally
    Alias /.well-known/acme-challenge /var/www/acme-challenge/.well-known/acme-challenge
    <Directory /var/www/acme-challenge/.well-known/acme-challenge>
        Require all granted
    </Directory>

    # Redirect everything EXCEPT ACME challenges to HTTPS
    RewriteEngine On
    RewriteCond %{REQUEST_URI} !^/.well-known/acme-challenge/
    RewriteRule ^(.*)$ https://api.example.com$1 [R=301,L]
</VirtualHost>

Nach diesen Vorbereitungsarbeiten und mit systemctl reload apache2 gelingt nun endlich das Zertifikaterstellen und -erneuern mit dem --webroot-Verfahren. Dabei richtet acme.sh vorübergehend die Datei /var/www/acme-challenge/.well-known/acme-challenge/xxx ein und testet dann via HTTP (Port 80), ob die Datei gelesen werden kann.

# Zertifikat erstmalig erstellen
acme.sh --issue --server letsencrypt -d api.example.com --webroot /var/www/acme-challenge

# Zertifikat installieren und Renew-Prozess einrichten
acme.sh --install-cert -d api.example.com \
  --key-file /etc/acme-letsencrypt/api.example.com.key \
  --fullchain-file /etc/acme-letsencrypt/api.example.com.pem \
  --reloadcmd "service apache2 reload"

# Renew-Prozess testen
acme.sh --renew -d api.example.com --force

Traefik

Eine noch elegantere Lösung besteht darin, den Docker-Container mit Traefik zu kombinieren (siehe https://traefik.io/traefik/). Bei korrekter Konfiguration kümmert sich Traefik um alles, nicht nur um die Proxy-Funktionen sondern sogar um das Zertifikatsmanagment. Aber diese Lösung kommt nur in Frage, wenn auf dem Host nicht schon (wie in meinem Fall) ein Webserver läuft, der die Ports 80 und 443 blockiert.

Links / Quellen

Linux-Server mit oder ohne Swap-Partition bereitstellen?

26. Mai 2025 um 05:00

Wir schreiben das Jahr 2025. Die Frage, ob man Linux-Server mit oder ohne Swap-Partition betreiben sollte, spaltet die Linux-Gemeinschaft in einer Weise, wie wir es seit dem Editor War nicht mehr gesehen haben…

So könnte ein spannender Film für Sysadmins anfangen, oder? Ich möchte aber keinen Streit vom Zaun brechen, sondern bin an euren Erfahrungen und Gedanken interessiert. Daher freue ich mich, wenn ihr euch die Zeit nehmt, folgende Fragen in den Kommentaren zu diesem Beitrag oder in einem eigenen Blogpost zu beantworten.

  • Stellt ihr Linux-Server mit Swap-Partition bereit und wie begründet ihr eure Entscheidung?
  • Hat euch die Swap-Partition bei sehr hoher Speicherlast schon mal die Haut bzw. Daten gerettet?
  • War der Server während des Swapping noch administrierbar? Falls ja, welche Hardware wurde für die Swap-Partition genutzt?

Eine kleine Mastodon-Umfrage lieferte bisher folgendes Bild:

Schaue ich mir meine eigenen Server an, so ergibt sich ein gemischtes Bild:

  • Debian mit LAMP-Stack und Containern: 16 GB RAM & kein Swap
  • RHEL-KVM-Hypervisor 1: 32 GB RAM & 4 GB Swap
  • RHEL-KVM-Hypervisor 2: 128 GB RAM & kein Swap
  • RHEL-Container-Host (VM): 4 GB RAM & 4 GB Swap

Bis auf den Container-Host handelt es sich um Bare-Metal-Server.

Ich kann mich nicht daran erinnern, dass jemals einem dieser Systeme der Hauptspeicher ausgegangen ist oder der Swapspeicher genutzt worden wäre. Ich erinnere mich, zweimal Swapping auf Kunden-Servern beobachtet zu haben. Die Auswirkungen waren wie folgt.

Im ersten Fall kamen noch SCSI-Festplatten im RAID zum Einsatz. Die Leistung des Gesamtsystems verschlechterte sich durch das Swapping so stark, dass bereitgestellten Dienste praktisch nicht mehr verfügbar waren. Nutzer erhielten Zeitüberschreitungen ihrer Anfragen, Sitzungen brachen ab und das System war nicht mehr administrierbar. Am Ende wurde der Reset-Schalter gedrückt. Das Problem wurde schlussendlich durch eine Vergrößerung des Hauptspeichers gelöst.

Im zweiten Fall, an den ich mich erinnere, führte ein für die Nacht geplanter Task zu einem erhöhten Speicherverbrauch. Hier hat Swapping zunächst geholfen. Tasks liefen zwar länger, wurden aber erfolgreich beendet und verwendeter Hauptspeicher wurde anschließend wieder freigegeben. Hier entstand erst ein Problem, als der Speicherbedarf größer wurde und die Swap-Partition zu klein war. So kam es zum Auftritt des Out-of-Memory-Killer, der mit einer faszinierenden Genauigkeit immer genau den Prozess abgeräumt hat, den man als Sysadmin gern behalten hätte. Auch hier wurde das Problem letztendlich durch eine Erweiterung des Hauptspeichers gelöst.

Ich erinnere mich auch noch an die ein oder andere Anwendung mit einem Speicherleck. Hier hat vorhandener Swap-Speicher das Leid jedoch lediglich kurz verzögert. Das Problem wurde entweder durch einen Bugfix oder den Wechsel der Anwendung behoben.

Nun bin ich auf eure Antworten und Erfahrungsberichte gespannt.

❌