Dieser Artikel beschreibt die Schritte, die ich durchgeführt habe, um meinen Server arthur.barton.de von Debian 9 „Stretch auf Debian 10 „Buster zu aktualisieren.

Ausgangslage

Diese Anleitung ist natürlich nicht zwingend universell anzuwenden, da sich das Upgrade je nach installierten Paketen natürlich unterschiedlich verhalten kann und unterschiedliche Nacharbeiten erforderlich macht.

Auf Arthur laufen unter anderem die folgenden Dienste:

  • AMaViS
  • Apache 2
  • AutoFS
  • Bind 9
  • Dovecot
  • Fail2Ban
  • Fetchmail
  • ISC DHCPd
  • Mailman 2
  • MariaDB
  • NFS
  • ngIRCd
  • NIS
  • Postfix
  • rsyncd
  • Samba
  • Transmission
  • Zabbix

Das System ist schon lange so konfiguriert, dass möglichst viel über systemd abgedeckt wird (systemd-journald, systemd-networkd, systemd-resolved, systemd-timesyncd, …) und auch „merged /usr“ ist aktiv.

Zudem sind durchaus Paketquellen von Drittanbietern (Keybase, Resilio Sync, Zabbix, …) sowie die Debian „Backports-Repository“ aktiviert, und alle Pakete auf die dort verfügbaren Versionen aktualisiert – auch das kann eine große Rolle auf den Verlauf des Updates haben, da auf Arthur eben nicht mehr ein reines Debian 9 System läuft.

Grundlage dieses Artikels ist das Kapitel 4 „Upgrade von Debian 9 (Stretch)“ aus den Debian 10 Release Notes für AMD64.

Vorbereitungen

Nicht mehr unterstützte Pakete entfernen

Im Kapitel 5 „Dinge, die Sie über Buster wissen sollten“ sind einige Punkte gelistet, die in Debian 10 „Buster“ nicht mehr oder anders unterstützt werden. Unbedingt lesen!

Die folgenden Pakete habe ich daher bereits vor dem Upgrade auf Arthur entfernt:

Status der installierten Pakete prüfen

Sind Pakete nur halb installiert? Oder werden gezielt zurückgehalten?

dpkg --audit
dpkg --get-selections | grep 'hold$'
aptitude search "~ahold"

Wenn hier Pakete genannt werden, sollte deren Status vor dem Upgrade auf jeden Fall geprüft und ggf. bereinigt werden!

Paketquellen für Debian 10 „Buster“ aktualisieren

Zunächst habe ich das Release in allen Paketquellen – siehe sources.list(5) – für APT von „stretch“ auf „buster“ geändert (so in der jeweiligen Datei das Release in dieser Form vorhanden ist):

sudo sed -i'' -e 's/stretch/buster/g' \
  /etc/apt/sources.list \
  /etc/apt/sources.list.d/*.list

Dann habe ich alle Paketquellen aktualisiert um zu testen, dass diese korrekt heruntergeladen werden können:

sudo apt update

Der eigentliche Download der Paketlisten hat erfolgreich funktioniert, allerdings wurde mir noch folgender Fehler präsentiert:

E: Der Wert »stretch-backports« ist für APT::Default-Release ungültig, da solch eine Veröffentlichung in den Paketquellen nicht verfügbar ist.

APT (Advanced Packaging Tool) anpassen

APT Konfiguration: /etc/apt/apt.conf.d/ prüfen

Obiger Fehler ergibt in sofern Sinn, als dass ich in der Datei /etc/apt/apt.conf.d/99local bisher als Ziel-Release eben „stretch-backports“ angegeben hatte; das muss für Debian 10 „Buster“ dann natürlich angepasst werden: da ich wieder gleich auch die Pakete aus den Backports verwenden will, konfiguriere ich somit den Wert „buster-backports“ für die Variable APT::Default-Release.

Meine gesamte lokale APT-Konfiguration – die regelt, wie APT und die verwandten Tools arbeiten, siehe apt.conf(5) – sieht wie folgt aus:

// /etc/apt/apt.conf.d/99local
// 2019-08-04, alex@barton.de

APT::Default-Release "buster-backports";

APT::Install-Recommends "0";
APT::Install-Suggests "0";

APT::Get::Show-Versions "true";
Aptitude::CmdLine::Show-Versions "true";
Aptitude::CmdLine::Show-Deps "true";

// Required for "/tmp is noexec" configurations:
APT::ExtractTemplates::TempDir "/var/cache/apt/tmp";

// Apt Periodic
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Download-Upgradeable-Packages "1";
APT::Periodic::Unattended-Upgrade "1";
APT::Periodic::AutocleanInterval "7";
APT::Periodic::Verbose "1";

// Unattended Upgrades
Unattended-Upgrade::Mail "logcheck";

APT Preferences: /etc/apt/preferences.d/ prüfen

In den „APT preferences“ – siehe apt_preferences(5) – wird konfiguriert, nach welchen Regeln APT verschiedene Versionen ein und desselben Pakets gegeneinander bevorzugt.

Meine (recht umfangreiche, aber für mich universell einsatzbare) Konfiguration in /etc/apt/preferences.d/pinning sieht wie folgt aus:

Package: *
Pin: release l=Alex-Lenny
Pin-Priority: 995

Package: *
Pin: release l=zabbix
Pin-Priority: 991

Package: *
Pin: release a=squeeze-backports
Pin-Priority: 606

Package: *
Pin: release a=wheezy-backports
Pin-Priority: 607

Package: *
Pin: release a=jessie-backports
Pin-Priority: 608

Package: *
Pin: release a=stretch-backports
Pin-Priority: 609

Package: *
Pin: release a=buster-backports
Pin-Priority: 610

Package: *
Pin: release a=testing
Pin-Priority: 3

Package: *
Pin: release a=unstable
Pin-Priority: 2

Package: *
Pin: release a=experimental
Pin-Priority: 1

Partitionen schreibbar (read-write) einbinden

Für das Upgrade müssen alle (System-) Dateisysteme beschreibbar sein! Auf Arthur ist normalerweise /boot nur zum lesen (read-only) eingebunden. Das ändere ich vor dem Upgrade daher wie folgt:

sudo mount -o remount,rw /boot

Testlauf …

Mit folgendem Befahl kann man das Upgrade ähnlich wie in den Release Notes empfohlen simulieren, und so beispielsweise den Speicherbedarf prüfen:

sudo apt -o APT::Get::Trivial-Only=true full-upgrade 2>&1 | less

Upgrade durchführen

Das Upgrade habe ich – ebenfalls wie in den Release Notes empfohlen – in zwei Schritten durchgeführt. Einem „minimalen Upgrade“ und dem eigentlichen „System-Upgrade“.

Während dem Upgrade wird Apt einige Fragen stellen und dazu auffordern, Konfigurationsdateien zu aktualisieren. Meine Strategie ist in der Regel, so wenig Änderungen an den Konfigurationsdateien durchzuführen, die mit den Paketen kommen, sondern wenn immer möglich sogenannte „Drop-in-Verzeichnisse“ und lokale „Override Files“ zu verwenden: so kann ich hier sehr oft einfach die neue Version des Paketbetreuers installieren, ohne meine lokalen Änderungen zu verlieren.

Leider ist das nicht in allen Fällen möglich, und somit musste ich auch einige Konflikte lösen, wobei vimdiff (Cheat Sheet) ein nützliches Tool ist 🙂

Minimales Upgrade

Das „minimale Upgrade“, bei welchem zunächst keine Pakete entfernt werden, wird mit folgendem Befehl angestoßen:

sudo apt-get upgrade

System-Upgrade auf Debian 10 „Buster“

Debian empfiehlt mit folgendem Befehl das gesamte System auf Debian 10 „Buster“ zu aktualisieren:

sudo apt full-upgrade

Mögliche Probleme, die während dem Upgrade auftreten können, sind ebenfalls in den Release Notes bei Debian beschrieben.

System neu starten

Jetzt noch sicherstellen, dass nach wie vor ein Linux Kernel installiert und die „initial RAM disk“ sowie der GRUB-Bootloader aktuell sind …

sudo apt install linux-image-amd64
sudo update-initramfs -u
sudo update-grub

… und den System-Neustart auslösen:

sudo reboot

Jetzt ist ein wenig Daumen-Drücken angesagt! 🙂

Aber wenn alles gut geht – was bei mit mit Arthur und Hurzel der Fall war – sollte spätestens nach ein paar Minuten das System wieder über das Netzwerk erreichbar sein und eine neue SSH-Verbindung zulassen.

Aufräumarbeiten

Im Kapitel 5 der Release Notes, „Dinge, die Sie über Buster wissen sollten„, sind einige Punkte aufgeführt, die nach dem Upgrade geprüft werden sollen:

Da ich auf Arthur voll auf systemd setze, brauche ich beispielsweise SysV-rc und dazugehörige Pakete nun nicht mehr (siehe den Abschnitt 5.1.12) und stelle sicher, dass sie vom System entfernt sind:

sudo apt purge initscripts sysv-rc insserv startpar

Auch ist es eine gute Idee zu prüfen, ob und welche Pakete mit nur eingeschränkter Unterstützung durch das Security Team auf dem System installiert sind (Abschnitt 5.2):

check-support-status

Obsolete Pakete aufräumen

Eine Liste der „obsoleten“ Pakete, also Pakete, die in keiner Paketquelle mehr verfügbar aber auf dem lokalen System installiert sind, listet der folgende Befehl auf:

aptitude search '~o'

Diese Pakete sollte man prüfen und nach Möglichkeit entfernen bzw. passende Paketquellen hinzufügen.

Unnötige Pakete entfernen

Mit folgendem Befehl werden alle Pakete entfernt, die als Abhängigkeit eines anderen Pakets installiert wurden, nun aber nicht mehr benötigt werden:

sudo apt autoremove

Konfigurationsdateien aufräumen

Einige Pakete wurden deinstalliert. Hierbei kann es sein, dass Konfigurationsdateien auf dem System belassen wurden. Solche Pakete können mit folgendem Befehl komplett entfernt werden, inklusive der Konfigurationsdateien:

sudo aptitude purge '~c'

Zudem erzeugen dpkg und andere Tools Backups von erneuerten Konfigurationsdateien oder legen neuere Konfigurationsdateien zusätzlich zu den bestehenden an. Solche Dateien habe ich zunächst mit diesem Befehl auflisten lassen:

sudo find /etc \( \
     -name '*.dpkg-*' \
     -o -name '*.ucf-*' \
     -o -iname '*.old' \
     -o -iname '*.orig' \
     -o -name '*~' \
  \) -print

Um sie einzeln zu prüfen, gegebenenfalls mit meinen aktiven Konfigurationsdateien zusammenzuführen – und dann zu löschen. Letzteres, indem ich an obigen Befehl einfach noch ein -delete angehängt habe (hinter das -print).

Logs prüfen

Um auszuschließen, dass irgend etwas im Hintergrund schön schief geht, habe ich mir mit folgendem Befehl alle Warn- und Fehlermeldungen seit dem Systemstart angesehen:

journalctl -b -p warning

Zum Glück war eigentlich nichts Relevantes dabei, das Upgrade hat wirklich hervorragend funktioniert und sehr wenig manuelle Nacharbeit erforderlich gemacht.

Fertig!

Und nun?

Na über das aktuelle System freuen! 🥳


Alex

Alexander Barton, Freiburg, Deutschland

1 Kommentar

Alex · 7. September 2019 um 23:51

Ich habe mal noch im Abschnitt „Aufräumen“ ein paar Befehle ergänzt, um obsolete und unnötige Pakete zu deinstallieren.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.