Apt-Pinning
Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:
Dieser Artikel ist größtenteils für alle Ubuntu-Versionen gültig.
Artikel für fortgeschrittene Anwender
Dieser Artikel erfordert mehr Erfahrung im Umgang mit Linux und ist daher nur für fortgeschrittene Benutzer gedacht.
Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:
"Apt-Pinning" nennt man eine Technik, bei der bestimmte Paketquellen bevorzugt behandelt werden. So kann man z.B. bei einer LTS-Version bleiben, aber gezielt Pakete von einer neueren Version oder einer anderen inoffiziellen Quelle beziehen. Oder man kann an einem Paket in einer bestimmten Version festhalten und somit dessen Aktualisierung oder Deinstallation verhindern.
Das Pinning erfolgte früher traditionell in der Datei /etc/apt/preferences. Seit Ubuntu 10.04 sollte man den Ordner /etc/apt/preferences.d/ nutzen, in dem man eine neue Datei mit einem beliebigen Namen anlegt. Idealerweise enthält der Dateiname dann einen Hinweis auf die jeweilige Paketquelle. Diese Datei darf entweder die Dateiendung .pref oder aber keine Endung besitzen (z.B. xenial.pin würde ignoriert werden).
Unabhängig vom Speicherort muss das Anlegen und die Bearbeitung mit einem Editor [1] mit Root-Rechten [2] erfolgen. Im weiteren Verlauf folgen verschiedene Beispiele, wie man die jeweiligen Package-Informationen des gewünschten Pakets formuliert.
Regeln für das Pinning¶
Hinweis:
Das Folgende ist lediglich ein Beispiel, wie Pinning verwendet werden kann. Die konkreten Gewichtungen sind auf keinen Fall als Empfehlung zu verstehen.
Die Beispieldatei /etc/apt/sources.list soll hier als Beispiel wie folgt aussehen:
1 2 3 4 5 | ## Offizielle Quellen deb http://archive.ubuntu.com/ubuntu/ xenial main restricted universe multiverse deb-src http://archive.ubuntu.com/ubuntu/ xenial main restricted universe multiverse ## Inoffizielle Quelle deb http://peters-ubuntupakete.example.org/ubuntu/ xenial main restricted universe multiverse |
Pinning per Release¶
Hinweis:
Grundsätzlich definiert eine Leerzeile einen neuen Abschnitt für einen weiteren Eintrag. Leerzeilen zwischen Package
, Pin
und Pin-Priority
sind nicht erlaubt!
Als Beispiel soll die Datei /etc/apt/preferences.d/xenial dienen:
1 2 3 | Package: * Pin: release v=16.04, l=Ubuntu Pin-Priority: 1000 |
Von nun an haben alle Pakete aus offiziellen Paketquellen für die Version 16.04 und dem Distributionsnamen (Label) Ubuntu
Vorrang, selbst wenn es in anderen Quellen neuere Pakete gibt. Eine Formulierung wie Pin: release a=xenial
hätte nicht ausgereicht, da es ja auch Paketquellen von Ubuntu 16.04 gibt, die xenial-security
, xenial-updates
etc. heißen. Erst wenn es Pakete dort nicht gibt, werden diese (soweit verfügbar) aus anderen Quellen installiert. Die verschiedenen Parameter für Pin: release
werden im Abschnitt Parameter für Pinning per Release weiter unten erläutert.
Pinning nach Ursprung¶
Für dieses Beispiel soll die Datei /etc/apt/preferences.d/peters-ubuntupakete dienen:
1 2 3 | Package: * Pin: origin peters-ubuntupakete.example.org Pin-Priority: 300 |
Dieser Fall setzt die Priorität für eine bestimmte Internetadresse (origin
). Die genaue Bedeutung der Pin-Priority
wird im Abschnitt Werte für Pin-Priority weiter unten erläutert.
Pinning per Version¶
Der Dateiname für eine bestimmte Programmversion lautet z.B. /etc/apt/preferences.d/hello:
1 2 3 | Package: hello Pin: version 2.1.1* Pin-Priority: 1000 |
Dieses Beispiel verhindert die Installation des Paketes hello in einer neueren Version als 2.1.1, aber auch die unbeabsichtigte „automatische“ Deinstallation aufgrund von Konflikten.
Parameter für Pinning per Release¶
Folgende Parameter können für das Pinnen mittels release
verwendet werden:
a (archive)
- Der Name eines Repositories, z.B.xenial
oderxenial-backports
c (components)
- Der Bereich eines Repositories, z.B. universev (version)
- Version des Repositories bzw. der Veröffentlichung, z.B.16.04
für xenialo (origin)
- Die "Erzeuger" des Repositories z.B.Ubuntu
oderLP-PPA-eclipse-team
. Nicht zu Verwechseln mitorigin
als Quelle (Domainname).l (label)
- Name der Distribution, z.B.Ubuntu
Die genauen Werte können mittels des Befehls apt policy
nachgeschlagen werden. Hier ein Ausschnitt aus der Ausgabe dieses Kommandos:
25 http://packages.medibuntu.org bionic/free Packages release v=18.04,o=Medibuntu,a=bionic,l=Medibuntu,c=free origin packages.medibuntu.org 500 http://ppa.launchpad.net/mozillateam/ppa/ubuntu bionic/main Packages release v=18.04,o=LP-PPA-mozillateam,a=bionic,n=bionic,l=Firefox ESR and Thunderbird stable builds,c=main origin ppa.launchpad.net 500 http://de.archive.ubuntu.com bionic/main Packages release v=18.04,o=Ubuntu,a=bionic,l=Ubuntu,c=main origin de.archive.ubuntu.com [.....] Mit Pinning verwaltete Pakete: firefox-esr-locale-de -> 52.9.0esr+build2-0ubuntu0.18.04.1 mit Priorität 1000 firefox-esr -> 52.9.0esr+build2-0ubuntu0.18.04.1 mit Priorität 1000 [.....]
Die Werte aus den release-Zeilen können ganz oder teilweise zum Pinning übernommen werden.
Werte für Pin-Priority¶
Die Werte für Pin-Priority
in der Datei /etc/apt/preferences müssen positive oder negative ganze Zahlen sein. Sie werden wie folgt interpretiert:
größer 999
: Version wird in jedem Fall installiert, auch wenn das einen Downgrade des Paketes nach sich ziehtvon 990 bis 999
- Version wird installiert, auch wenn sie nicht zum Release gehört, es sei denn ein aktuelleres Pakete ist bereits installiertvon 500 bis 989
- Version wird installiert, es sei denn, es gibt eine Version, die zum Release gehört oder eine aktuellere Version ist bereits installiertvon 100 bis 499
- Version wird installiert, es sei denn, es gibt eine aktuellere die nicht zum Release gehört oder die bereits installierte Version ist aktuellervon 1 bis 99
- Version wird nur dann installiert, wenn es keine bereits installierte gibtnegativer Wert
- Version wird nicht installiert
Das Paket mit der höchsten Punktzahl wird immer bevorzugt.
Überprüfung¶
Die Wirkung des Apt-Pinnings auf bestimmte Pakete kann mit folgendem Befehl überprüft werden:
apt policy PAKET(E)
Gezielte Umgehung mit apt-get¶
Im Terminal [2] kann man mit apt-get gesetzte Prioritäten aber auch gezielt umgehen. Folgender Aufruf installiert z.B. das Programm MPlayer aus dem Paketbereich xenial
(Ubuntu 16.04). Dabei werden Abhängigkeiten nach der Priorität erfüllt.
sudo apt-get -t xenial install mplayer-custom
Paketstatus mit apt-mark¶
apt-mark ist das Werkzeug zum Anzeigen und Ändern des Status' eines Pakets.
Beispielsweise setzt man eine derzeit installierte Paketversion mit
sudo apt-mark hold firefox
auf hold, d.h., kommende aktuellere Versionen werden nicht installiert. Beim Aktualisieren über apt in einem Terminal werden auf hold gesetzte Pakete aufgeführt. Sollen Updates wieder berücksichtigt werden, ist
sudo apt-mark unhold firefox
auszuführen.
Beispiele¶
Von proposed-Quellen downgraden¶
Mit Pinning gibt es eine vergleichsweise einfache Möglichkeit, ungewollte Upgrades auf Pakete aus den proposed
-Quellen rückgängig zu machen, sprich auf die herkömmlichen und i.d.R. gut getesteten Pakete bzgl. Installationsroutine und Systemintegration downzugraden. Zuerst deaktiviert man die proposed
-Quellen [3] und aktualisiert die Paketindexdateien. Dann legt man die Datei /etc/apt/preferences/no-proposed an:
1 2 3 | Package: * Pin: release a=ARCHIV* Pin-Priority: 1001 |
Dabei ist ARCHIV
durch den Codenamen der jeweiligen Ubuntu-Version zu ersetzen. Codenamen sind beispielsweise trusty
, xenial
usw. Nach dem Codenamen sollte ein Stern *
gesetzt werden, damit auch Pakete aus den Quellen ARCHIV-updates
und ARCHIV-security
berücksichtigt werden.
Anschließend kann ein Upgrade bzw. Downgrade der Pakete durchgeführt werden:
sudo apt-get dist-upgrade
Nachdem die Paketversionen korrigiert wurden, sollte die Pinning-Datei wieder entfernt werden, damit irgendwann in Zukunft ein Upgrade auf eine neuere Ubuntu-Version ohne Probleme möglich ist.
Einzelne Pakete aus älterer/neuerer Ubuntu-Version installieren¶
Mitunter möchte man eine aktuellere Version eines Pakets aus der nächsten Ubuntu-Version nutzen, ist aber nicht bereit, ein komplettes Upgrade zu machen. Oder aber man hat ein Upgrade hinter sich, die neue Version eines Programms macht jedoch Probleme und man würde lieber für dieses eine Paket zur früheren Version zurückkehren. Die Methode mit Apt-Pinning entspricht im Prinzip dem manuellen Herunterladen und Installieren der entsprechenden Pakete von http://packages.ubuntu.com
, ist aber deutlich bequemer, besonders wenn verschiedene Abhängigkeiten ebenfalls einen Up- bzw. Downgrade erfordern.
Achtung!
Die Verwendung von Paketen aus anderen Ubuntu-Versionen kann im Einzelfall eine pragmatische Lösung sein, in der Regel ist aber davon abzuraten. Besonders bei einer großen Zahl an Abhängigkeiten sind Probleme vorprogrammiert.
Beispiel: Das Paket subversion (siehe SVN) liegt für Ubuntu 16.04 (xenial
) in der Version 1.6.17 und für Ubuntu 17.04.10 (zesty
) in der Version 1.7.5 vor. Nach einem Upgrade auf Ubuntu 17.04 möchte man zur Version 1.6 des Pakets zurückkehren. Dazu fügt man den Paketquellen folgende Zeile hinzu [3]:
1 2 3 4 | deb http://archive.ubuntu.com/ubuntu xenial main deb-src http://archive.ubuntu.com/ xenial main deb http://archive.ubuntu.com/ xenial-updates main deb http://archive.ubuntu.com/ xenial-security main |
Nun wird in der Datei /etc/apt/preferences folgender Inhalt ergänzt (bzw. die Datei neu angelegt):
1 2 3 4 5 6 7 | Package: subversion Pin: version 1.6* Pin-Priority: 1001 Package: * Pin: release v=16.04, l=Ubuntu Pin-Priority: -1 |
Nun kann nach Aktualisieren der Paketlisten mit apt-get update das Paket subversion aus den Quellen von Ubuntu 16.04 installiert werden [4]. Wurde es bereits installiert, wird mit apt-get dist-upgrade automatisch die ältere Version installiert.
Unter Umständen müssen je nach Komplexität der Abhängigkeiten noch weitere Pinning-Einträge hinzugefügt werden.
Einzelne Pakete aus einem Sammel-PPA installieren¶
Bei der Verwendung eines Personal Packages Archiv (PPA) tritt immer wieder das Problem auf, dass nach dem Einbinden und Aktualisieren nicht nur das gewünschte Programm, sondern - je nach PPA - eine ganze Reihe weiterer Programme in den Paketquellen auftaucht, die u.U. mit den Versionen aus den offiziellen Paketquellen kollidieren können. Die Nutzung dieser Sammel-PPAs kann deutlich vereinfacht werden, in dem man nur das oder die gewünschten Pakete aus einem PPA zulässt (und allen anderen blockiert). Zwingende Voraussetzung: das Paket hat keine speziellen Abhängigkeiten, die ebenfalls aus dem PPA stammen müssen.
Dazu legt man - vor dem Installieren des Pakets - eine Datei /etc/apt/preferences.d/LP-BENUTZER-PPA-NAME mit Root-Rechten und folgendem Inhalt an (LP-BENUTZER-PPA-NAME
und Paketnamen bitte anpassen):
1 2 3 4 5 6 7 8 9 10 11 | Package: * Pin: release o=LP-PPA-LP-BENUTZER-PPA-NAME Pin-Priority: -1 Package: foo Pin: release o=LP-PPA-LP-BENUTZER-PPA-NAME Pin-Priority: 500 Package: bar Pin: release o=LP-PPA-LP-BENUTZER-PPA-NAME Pin-Priority: 500 |
Während der erste Abschnitt die Nutzung des PPAs praktisch untersagt, gilt dies nicht für die gewünschten Pakete foo und bar.
Links¶
PinningHowto 🇬🇧
APT Übersichtsseite zum Paketmanagement mit APT