(Fehlerhafte) pacman Paketupdates unter Arch Linux rückgängig machen

(Fehlerhafte) pacman Paketupdates unter Arch Linux rückgängig machen

Arch Linux ist dank Rolling Release immer auf dem neusten Stand. Manchmal werden jedoch auch fehlerhafte Updates verteilt. In diesem Fall kann es zumindest als temporärer Workaround hilfreich sein, die Vorversion des betroffenen Paketes zu installieren. So kann man dies weiter nutzen, bis ein entsprechender Fix verfügbar ist.

Beispiel: Docker-Compose

Aktuell wurde das Pyhon-SDK von Docker-Compose auf Version 3.0.1 aktualisiert. Dies ist jedoch nicht vollständig mit Docker-Compose kompatibel: Möchte man einen Container aus Docker-Compose neu bauen, wird folgender Fehler ausgegeben:

[daniel@antergos account-boerse]$ docker-compose up --build
Building ab
Traceback (most recent call last):
  File "/usr/bin/docker-compose", line 11, in <module>
    load_entry_point('docker-compose==1.19.0', 'console_scripts', 'docker-compose')()
  [...]
  File "/usr/lib/python3.6/site-packages/compose/service.py", line 989, in build
    'memory': parse_bytes(memory) if memory else None
TypeError: build() got an unexpected keyword argument 'stream'

Da es sich um ein recht neues Update handelt, gibt es bislang noch keine saubere Lösung. Um mit Docker-Compose weiterarbeiten zu können, soll als Workaround daher wieder die vorherige Python 2.7 Version installiert werden.

1. Exakte Version ermitteln

In der Regel wird man die exakten Versionsnummern nicht mehr im Kopf haben. Daher suchen wir in der Logdatei von Pacman nach dem letzten Update des betroffenen Paketes, hier python-docker:

[daniel@antergos ~]$ cat /var/log/pacman.log | grep python-docker | tail -1
[2018-02-17 12:27] [ALPM] upgraded python-docker (2.7.0-1 => 3.0.1-1)

Hier wurde also von 2.7.0-1 auf 3.0.1-1 aktualisiert, wir wollen also auf 2.7.0-1 zurück. Ein Vorteil von Pacman ist, dass er alte Pakete nach Updates in seinem Cache behält. So kann problemlos eine ältere Version installiert werden, ohne diese nachladen zu müssen.

 
[daniel@antergos ~]$ ls /var/cache/pacman/pkg/ | grep python-docker | grep 2.7.0-1 
python-docker-2.7.0-1-any.pkg.tar.xz 

Das gewünschte Installationsarchiv liegt also im Pfad /var/cache/pacman/pkg/python-docker-2.7.0-1-any.pkg.tar.xz.

2. Alte Version installieren

Durch folgenden Befehl wird das derzeit installierte Paket durch die angegebene Version installiert. Abhängigkeiten löst Pacman entsprechend auf. Allerdings werden keine Versionskonflikte mit anderen Paketen beachtet! Hier muss man ggf. eigenständig weitere Downgrades durchführen.

sudo pacman -U /var/cache/pacman/pkg/python-docker-2.7.0-1-any.pkg.tar.xz 

Nun ist das Downgrade abgeschlossen und die alte Version kann genutzt werden.

3. Paket ignorieren

Allerdings wird Pacman das Paket beim nächsten Update erneut als veraltet erkennen und versuchen, es zu aktualisieren:

Dieses Paket darf natürlich vorerst nicht aktualisiert werden, bis das Problem gefixt wurde. Es empfiehlt sich daher, das betroffene Paket von Pacman auszuschließen.

Dazu öffnet man die Datei /etc/pacman.conf und setzt bzw. erweitert IgnorePkg mit dem Namen des Paketes:

IgnorePkg = python-docker

Nun wird Pacman das Paket nicht mehr als Update anbieten, warnt aber weiterhin, dass es ignorierte Aktualisierungen gibt:

Dadurch wird sichergestellt, dass man seine Ausnahmeregeln nicht vergisst und regelmäßig prüft, ob ein Fix verfügbar ist.

Leave a Reply