Ein Server läuft jahrelang gut, und genau das ist das Problem: Irgendwann fällt die Distribution aus dem Support, die Sicherheitsquelle liefert nichts mehr, und die automatischen Updates aus dem Sicherheitsupdate-Beitrag laufen ins Leere, ohne Fehlermeldung.
Solange die Version im Support ist, ist ein Sprung Planungssache. Ab dem Tag, an dem der Sicherheitssupport endet, wird daraus kritisch: Die Maschine sammelt dann ungepatchte Lücken, und niemand meldet es. Der Übergang ist ein Datum, das man kennen sollte.
Wo stehe ich, und wie lange noch?#
. /etc/os-release && echo "$PRETTY_NAME"
cat /etc/debian_version 2>/dev/null
# Bekommt die Sicherheitsquelle überhaupt noch etwas?
grep -r security /etc/apt/sources.list /etc/apt/sources.list.d/
sudo apt update 2>&1 | grep -i 'security\|404\|nicht mehr'
Ein 404 auf die Sicherheitsquelle ist die deutlichste Antwort: Der Support ist vorbei. Bei Debian ist der reguläre Sicherheitssupport rund drei Jahre nach Erscheinen einer Hauptversion zu Ende, danach übernimmt für begrenzte Zeit das LTS-Team mit eingeschränktem Umfang. Bei Ubuntu LTS sind es fünf Jahre für die Hauptkomponenten. Die genauen Daten stehen bei der jeweiligen Distribution, sie gehören ins Kalender, nicht ins Gedächtnis.
Vorbereitung#
# 1. Vollständiges Backup, außerhalb der Maschine.
# Bei einem Distributionssprung ist das keine Formalie.
# 2. Aktueller Stand der alten Version
sudo apt update && sudo apt full-upgrade -y
sudo apt autoremove --purge -y
# 3. Was hängt an Fremdquellen? Das bricht am häufigsten.
grep -rl . /etc/apt/sources.list.d/ | xargs -r grep -H '^deb'
# 4. Was ist von Hand installiert, außerhalb der Paketverwaltung?
ls -la /usr/local/bin /opt
# 5. Zurückgehaltene Pakete auflösen
apt-mark showhold
Punkt 3 ist der wichtigste. Fremdquellen (Docker, Node, PostgreSQL, Proxmox) haben eigene Namen pro Distributionsversion. Bleiben sie auf dem alten Namen stehen, bricht der Sprung mittendrin.
Ein Distributionssprung startet den SSH-Dienst neu und tauscht dabei Bibliotheken. Bricht die Verbindung mitten im Vorgang ab, bleibt die Paketverwaltung in einem halben Zustand zurück. Zwei Vorkehrungen: den Vorgang in tmux oder screen laufen lassen, damit er ohne dich weiterläuft und den Konsolenzugang des Anbieters bereitliegen haben.
sudo apt install -y tmux
tmux new -s upgrade
# Bei Verbindungsabbruch: erneut anmelden und "tmux attach -t upgrade"
Der Sprung#
Bei Debian, exemplarisch von einer Version auf die nächste:
# Quellen umschreiben — Namen der Zielversion einsetzen
sudo sed -i 's/bookworm/trixie/g' /etc/apt/sources.list
sudo sed -i 's/bookworm/trixie/g' /etc/apt/sources.list.d/*.list 2>/dev/null
sudo apt update
sudo apt upgrade --without-new-pkgs # erst der kleine Schritt
sudo apt full-upgrade # dann der vollständige
Der zweigeteilte Weg ist Absicht: upgrade --without-new-pkgs erneuert, was ohne neue Abhängigkeiten geht, und verkleinert damit den Schritt, in dem etwas schiefgehen kann.
Während des Vorgangs kommen Rückfragen zu geänderten Konfigurationsdateien. Die richtige Antwort ist fast immer „die eigene behalten“ und danach die Unterschiede nachsehen:
# Wo weichen eigene Dateien von den Paketvorgaben ab?
sudo apt install -y debsums
sudo find /etc -name '*.dpkg-dist' -o -name '*.ucf-dist' | head -20
Danach: was erfahrungsgemäß kaputt ist#
# Fehlgeschlagene Dienste
systemctl --failed
# Dienste, die neu gestartet werden müssten
sudo apt install -y needrestart && sudo needrestart -r l
# Reste der alten Version
grep -r 'bookworm' /etc/apt/ 2>/dev/null
# Nicht mehr benötigte Pakete
sudo apt autoremove --purge
Die vier Stellen, an denen es typischerweise hakt:
| Bereich | Was passiert | Fix |
|---|---|---|
| Datenbank | neue Hauptversion parallel installiert, alte hält die Daten | pg_upgradecluster, dann alte entfernen |
| PHP / Node | Version gewechselt, Anwendung erwartet die alte | Version festnageln oder Anwendung anpassen |
| Konfigurationsformate | Optionen entfallen (z. B. bei nginx, sshd) | nginx -t, sshd -t, beide melden es |
| Fremdquellen | Repository für die neue Version fehlt | Quelle aktualisieren, Paket neu installieren |
sshd -t unbedingt vor dem nächsten Neustart des Dienstes ausführen. Entfallene Optionen lassen den Dienst sonst nicht mehr starten und der Zugang ist weg.
Wann Neuaufsetzen ehrlicher ist#
Ein Upgrade lohnt sich, wenn die Maschine gepflegt ist und wenig Handarbeit enthält. Für Neuaufsetzen spricht:
- Zwei oder mehr Hauptversionen Rückstand. Kettensprünge sammeln Altlasten.
- Viel von Hand installiertes unter
/usr/localund/opt, dessen Herkunft unklar ist. - Die Maschine ist historisch gewachsen und niemand weiß mehr, warum bestimmte Dateien so aussehen.
- Es gibt ohnehin ein Automatisierungsskript oder ein Container-Setup, mit dem der Aufbau schnell geht.
Der ehrliche Vergleich ist nicht „Upgrade dauert zwei Stunden, Neuaufbau einen Tag“, sondern: Nach dem Neuaufbau weißt du, was auf der Maschine ist. Nach dem Upgrade weißt du es bei einer gewachsenen Maschine oft nicht.
In beiden Fällen gilt derselbe Vorlauf wie in Wartungsfenster und der Weg zurück und danach ein Blick auf die Grundhärtung, weil eine frische Installation sie nicht mitbringt: Passwort-Login abschalten, eingehend dichtmachen.
Geschrieben aus dem laufenden Betrieb: MRMedia betreibt eigene Hosts, Kundendienste und deren Härtung in der EU. Eine veraltete Anleitung ist hier ein Sicherheitsproblem, kein Schönheitsfehler. Korrekturen bitte über Discord.