8.41. Pakete downgraden

Allgemein gesprochen, steht der Begriff Downgrade für einen Niedergang, eine Abwertung oder einen Rückschritt. Bezogen auf die Verwaltung von Softwarepaketen umfasst es das Einspielen oder Zurückgehen zu einer vorherigen Paketversion. Es stellt damit das Gegenstück zu einer Aktualisierung mittels apt-get upgrade dar (siehe dazu Abschnitt 8.40, „Pakete aktualisieren“).

Ein Downgrade ist in Betracht zu ziehen, wenn die derzeit installierte Version eines Softwarepakets nicht das leistet, was sie verspricht, bspw. dabei Fehler auftreten oder Inkompatibilitäten mit anderen Softwarepaketen deren Benutzung unmöglich machen. Häufig fallen in letztere Kategorie geänderte Schnittstellen, die noch nicht auf allen nachfolgenden Ebenen konsequent umgesetzt wurden.

Ein Downgrade wird vom Release-Team von Debian GNU/Linux offiziell nicht unterstützt. Alle Mechanismen zur Paketverwaltung und Aktualisierung sind auf das Einspielen einer neueren Version ausgerichtet. Daher verfügt auch keines der hier im Buch vorgestellten Werkzeuge zur Paketverwaltung bislang über einen spezifischen Schalter, um ein Downgrade explizit anzustoßen. Es bleibt daher nur ein Vorgehen über andere Wege. Glücklicherweise setzen diese jedoch auf den bereits zuvor beschriebenen Mechanismen auf.

8.41.1. Hintergrund und Fragen zum Downgrade

Das Einspielen einer neueren Version ist vom prinzipiellen Ablauf her nicht anders als die Aktualisierung — es laufen die gleichen Mechanismen ab und es kommen die gleichen Werkzeuge zum Einsatz. Der Unterschied ist jedoch die Komplexität, die hier deutlich höher ist.

Vergleichbar ist der Vorgang wie das Bewegen entgegen der Fahrtrichtung in einer Einbahnstraße — es geht so lange gut, wie Ihnen keiner entgegenkommt. Schwierigkeiten können Ihnen nämlich die Maintainerskripte (siehe „Binärpakete“ in Abschnitt 4.2.3, „Binärpakete“) bereiten, die das Downgrade im Normalfall nicht unterstützen. Eventuell ist der Mechanismus, der sie aufruft, auch nicht darauf vorbereitet. Kritisch sind insbesondere die Fälle, wo eine konzeptuelle Änderung im Paket in der Rückrichtung nicht umgebaut werden kann (siehe dazu bspw. den Debian-Bug 764503 [apt-get-update-bug-764503]).

Ein Downgrade ist mit einer Aktualisierung gleichzusetzen. Hierbei benennen Sie jedoch explizit eine ältere Paketversion, die Sie entweder über einen Parameter — „target release“ oder Versionsnummer — beim Aufruf von dpkg bzw. apt-get angeben oder in der Textoberfläche von Aptitude auswählen. Berechnet die Paketverwaltung nun die Abhängigkeiten zu den übrigen Paketen, kann am Ende dieses Vorgangs auch eine großflächige Änderung am Restbestand der Pakete stehen. Dieser Fall ist nicht ungewöhnlich, denn er kann ebenso bei einer Aktualisierung vorkommen. Die Wahrscheinlichkeit, daß die Änderungen erheblich sind, ist sehr groß.

Wie oben schon benannt, sind diese Änderungen nicht immer rückwärtskompatibel und lösen Verwicklungen aus (Aktualisierungen sind eigentlich bereits hinreichend komplex). Wir empfehlen Ihnen daher, ein Downgrade nur bei dem tatsächlichen Bedarf dafür durchzuführen. Prüfen Sie bitte vorher, ob das Mischen von Veröffentlichungen mittels apt-pinning (siehe dazu Kapitel 20, Veröffentlichungen mischen) oder das Übersetzen des Pakets aus den Quellen und das nachfolgende Einspielen des eigenen Binärpakets risikoärmer ist.

8.41.2. Ablauf und Durchführung

Bestehende Paketversionen klären

Als Schritt eins bringen Sie in Erfahrung, welche Paketversionen überhaupt installiert und darüberhinaus aus dem Repository ihrer genutzten Veröffentlichung verfügbar sind. Dabei helfen ihnen bspw. die Werkzeuge apt-cache, aptitude, rmadison und apt-show-versions weiter (siehe „Paketstatus erfragen“ in Abschnitt 8.4.4, „apt-cache showpkg Paketname, „Verfügbare Paketversionen ermitteln“ in Abschnitt 8.14.3, „Verfügbare Paketversionen ermitteln“ und „Aus welchem Repo kommen die Pakete“ in Abschnitt 8.14, „Aus welchem Repo kommen die Pakete“). Im Aufruf benötigen alle Programme zusätzlich den Namen des gewünschten Pakets und listen in der Ausgabe die letzte Version auf, ggf. noch spezifiziert für die jeweilige Veröffentlichung. Die nachfolgende Ausgabe nutzt apt-show-versions und zeigt das anhand des Paketes openvpn aus der Veröffentlichung von Debian 8 Jessie.

Auflistung der verfügbaren Versionen zum Paket openvpn

$ apt-show-versions openvpn
openvpn:amd64/jessie 2.3.4-5+deb8u1 uptodate
$

Die oben benannten Werkzeuge können Ihnen jedoch nicht darstellen, welche vorherigen Versionen eines Pakets existieren und noch verfügbar sind. Aus obiger Ausgabe von apt-show-versions wird nur ersichtlich, daß derzeit die Version 2.3.4-5+deb8u1 installiert ist und es sich dabei um das derzeit aktuellste Paket handelt. Das Suffix deb8u1 deutet auf eine (Sicherheits-)Aktualisierung der Vorgängerversion 2.3.4-5 hin.

Um diese Version aufzuspüren, kann ein Blick in den Paketcache bereits zum Erfolg führen:

Recherche im Paketcache. 

$ ls /var/cache/apt/archives/openvpn*
/var/cache/apt/archives/openvpn_2.3.4-5_amd64.deb
/var/cache/apt/archives/openvpn_2.3.4-5+deb8u1_amd64.deb
$

Sie sehen, dass das Paket mit der Version 2.3.4-5 noch lokal herumliegt. Dieses Paket benutzen Sie nachfolgend zum Downgrade.

Sollte obiger Schritt jedoch nicht (mehr) von Erfolg gekrönt sein — weil Sie bspw. den Paketcache schon aufgeräumt haben — benötigen Sie einen Plan B. Eine Recherche im Paketarchiv unter Debian Snapshots [Debian-Snapshots] (siehe Abbildung 8.28, „Das Debian-Paketarchiv“) ist ein solcher Plan.

Abbildung 8.28. Das Debian-Paketarchiv

werkzeuge/paketoperationen/snapshots.png

Dieses Archiv beinhaltet den Zugriff auf alle Varianten eines Pakets, welche jemals Bestandteil einer Veröffentlichung von Debian waren. Über diese Webseite stöbern Sie veröffentlichungsbezogen oder anhand des Paketnamens für das Quell- bzw. Binärpaket. Abbildung 8.29, „Suchergebnis nach dem Paket openvpn im Paketarchiv“ zeigt das Suchergebnis für das Paket openvpn. Mit einem Klick auf die gesuchte Version aus der Liste beziehen das benötigte Paket aus dem Archiv und speichern es lokal im Paketcache unter /var/cache/apt/archives ab.

Abbildung 8.29. Suchergebnis nach dem Paket openvpn im Paketarchiv

werkzeuge/paketoperationen/snapshots-openvpn.png

Paket austauschen

Im sich nun anschließenden Schritt zwei ersetzen Sie das aktuelle Paket durch dessen Vorgänger. Dieser Schritt ist unkompliziert, sofern keine größeren Paketabhängigkeiten bestehen und repariert werden müssen. Im vorliegenden Fall genügt dazu folgendes:

  • Entfernen des derzeit installierten openvpn-Pakets mittels apt-get remove openvpn
  • Einspielen des älteren openvpn-Pakets mittels dpkg -ihv /var/cache/apt/archives/openvpn_2.3.4-5_amd64.deb.

Bei dieser Vorgehensweise bleiben alle Konfigurationsdateien unverändert erhalten. Es kann jedoch passieren, dass nicht alle Abhängigkeiten erhalten bleiben und andere Pakete ebenfalls ausgetauscht werden müssen. Das erreichen Sie mit Hilfe des nachfolgenden Aufrufs apt-get install -f. Der Schalter -f kürzt --fix-broken ab.

Paket über die Angabe der Versionsnummer austauschen

APT akzeptiert als Parameter auch die explizite Angabe der Versionsnummer des Pakets. Falls das Paket noch nicht installiert ist, hilft dieser Aufruf:

apt-get install <package-name>=<package-version-number>

Ist das Paket jedoch schon installiert, gelingt dieser Aufruf:

apt-get install --reinstall <package-name>=<package-version-number>

In beiden Fällen ersetzen Sie <package-name> durch den tatsächlichen Namen des Paketes und <package-version-number> durch die gewünschte Versionsnummer. Für die Version 2.3.4-5 des Paketes openvpn sieht der Aufruf wie folgt aus:

Paket mit konkreter Versionsangabe (neu) installieren. 

# apt-get install --reinstall openvpn=2.3.4-5

Paket über die Angabe der Veröffentlichung austauschen

APT ist flexibel und erlaubt ebenfalls die Referenzierung eines Paketes über die explizite Angabe der Veröffentlichung. Dazu kommt der Schalter -t (Langform: --target-release) zum Einsatz:

apt-get -t=<target release> install <package-name>

Die Angabe <target release> benennt die Veröffentlichung, also bspw. stable oder unstable, aber auch den Namen wie Buster oder Bullseye. Für den Wert <package-name> geben Sie den tatsächlichen Namen des Paketes an. Für das Paket openvpn aus der vorherigen, stabilen Veröffentlichung (genannt oldstable) sieht der Aufruf dann wie folgt aus:

Paket mit Angabe der Veröffentlichung installieren. 

# apt-get -t=oldstable install openvpn