PPAs können eine schöne Sache sein, aber manchmal kann die Verwendung von PPAs auch ganz schön nerven. Zum Beispiel wenn in zwei PPAs die man verwenden möchte unter anderem die selben Pakete enthalten sind. Natürlich in unterschiedlichen Versionen oder Builds, aber apt wird immer die höchste Version installieren.
Zum Glück kann man aber apt mit preferences (Präferenzen) sagen welche Pakete aus welchem PPA installiert werden sollen. Eigentlich sind die preferences dazu gedacht bei einer bestimmten Version zu bleiben, aber man kann damit auch für bestimmte Pakete ein PPA bevorzugen.
Um in apt preferences zu verwenden wird eine Datei in /etc/apt/preferences.d angelegt. Jede Datei kann mehrere Einträge enthalten. Ein Eintrag besteht immer aus drei Zeilen. Die erste ist der Paket Name „Package“. Dort funktionieren auch Wildcards wie *. Die zweite Zeile ist „Pin“, dort wird fest gelegt von wo das Paket kommen soll, welche Version bevorzugt wird oder ähnliches. Die letzte Zeile besteht aus der „Pin-Priority“. Dort wird über Zahlenwerte die Wichtigkeit des Eintrags festgelegt. Ich wollte wirklich immer mein PPA bevorzugen. Auch sollten schon installierte Pakete ersetzt werden. Deshalb habe ich den Wert 1001 genommen. Eine Bevorzugung würde aber auch schon mit 991 stattfinden, jedoch bleiben dann bereits installiere Version bestehen.
Ein Beispiel für Openssl
Package: openssl Pin: release n=xenial,o=LP-PPA-carsten-uppenbrink-net-nginx Pin-Priority: 1001
Durch das „release“ in der Pin Zeile wirkt das Pinning auf die Quellen und nicht auf eine bestimmte Version des Paketes. Durch n=xenial reduziere ich die Präferenz auf xenial Pakete. Durch o= bevorzuge ich ein bestimmtes PPA. Die Syntax für o bei PPAs ist etwas anders als bei den Einträgen in der sources.list. Es folgt dem Schema
o=LP-PPA-LP-BENUTZER-PPA-NAME
In dem Beispiel oben ist der LP Benutzer (carsten-uppenbrink-net) und der PPA Name (nginx). Die Einträge sind ab dem Speichern sofort aktiv. Überprüfen kann man das ganze recht einfach mit
$ apt-cache policy openssl openssl: Installed: 1.1.0g-3~ubuntu16.04.3+ppa.carsten+1 Candidate: 1.1.0g-3~ubuntu16.04.3+ppa.carsten+1 Version table: 1.1.0g-3~ubuntu16.04.3+ppa.carsten.weak+1 500 500 http://ppa.launchpad.net/carsten-uppenbrink-net/postfix/ubuntu xenial/main amd64 Packages *** 1.1.0g-3~ubuntu16.04.3+ppa.carsten+1 1001 500 http://ppa.launchpad.net/carsten-uppenbrink-net/nginx/ubuntu xenial/main amd64 Packages 100 /var/lib/dpkg/status 1.0.2g-1ubuntu4.10 500 500 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 Packages 500 http://security.ubuntu.com/ubuntu xenial-security/main amd64 Packages 1.0.2g-1ubuntu4 500 500 http://archive.ubuntu.com/ubuntu xenial/main amd64 Packages
Man sieht das 1.1.0g-3~ubuntu16.04.3+ppa.carsten+1 aus dem Nginx PPA installiert ist, obwohl es theoretisch eine neuere Version im Postfix PPA gibt.
Durch die Verwendung von Wildcards in der „Package“ Ziele kann man sich Einträge sparen. Jedoch kann man sicherheitshalber auch einfach für jedes doppelte Paket ein extra Eintrag anlegen.
Der Eintrag im Ubuntuusers Wiki zeigt noch weitere Möglichkeiten.