APT-Pinning
Contents
1. Einleitung und erstes Beispiel
APT versucht immer, die höchsten Versionen aus dem ihm in der /etc/apt/sources.list zugewiesenen Quellen zu installieren. Dieses Verhalten ist nicht immer erwünscht; zB. wenn man nur bestimmte Pakete aus den [:BackPorts:Backports] installieren möchte, würde ein dist-upgrade versuchen, sämtliche in den Backports zur Verfügung stehenden Pakete in das System einzuspielen. Dies wird mit fast hundertprozentiger Sicherheit zu nur schwer, wenn überhaupt aufzulösenden Konflikten führen.
Um dieses Verhalten zu beeinflussen, kann man APT Prioritäten (sog. Pin-Priorities) für Quellen oder auch einzelne Pakete vorschreiben. Jene werden in der Datei /etc/apt/preferences festgelegt, die selbst angelegt werden muss.
Grundsätzlich gilt, je höher die Pin-Priority, desto höher die Priorität zur Installation der Pakete v. v.!
Die wichtigsten Eckwerte
Pin
Bedeutung
P<=0
Diese Pakete werden nie installiert.
P=100
Dieser Pin wird bereits installierten Paketen zugewiesen (Quelle: /var/lib/dpkg/status).
P=500
Dieser Pin wird allen Paketen zugewiesen, die über die Quellen der /etc/apt/sources.list entweder erreichbar oder aus denen bereits installiert sind.
P>1000
Dies erzwingt einen Downgrade, selbst wenn schon höhere Paketversionen installiert oder zur Installation vorgemerkt sind
Welche Quelle oder welche Pakete welche Priorität haben, kann mit dem Befehl
apt-cache policy
abgefragt werden. Ohne weitere Optionen gibt dieser die Pin-Priorities für die einzelnen Paketquellen aus, gibt man ein Paket ein, so die verschieden Versionen.
Hier als Beispiel die Ausgaben bei einer Mischung aus Testing(derzeit Etch) und Unstable(Sid):
user@debian:~$ apt-cache policy
Paketdateien:
100 /var/lib/dpkg/status
release a=now
90 http://debian.tu-bs.de sid/non-free Packages
release o=Debian,a=unstable,l=Debian,c=non-free
origin debian.tu-bs.de
90 http://debian.tu-bs.de sid/contrib Packages
release o=Debian,a=unstable,l=Debian,c=contrib
origin debian.tu-bs.de
90 http://debian.tu-bs.de sid/main Packages
release o=Debian,a=unstable,l=Debian,c=main
origin debian.tu-bs.de
990 http://www.debian-multimedia.org etch/main Packages
release o=Unofficial Multimedia Packages,a=testing,l=Unofficial Multimedia Packages,c=main
origin www.debian-multimedia.org
990 http://security.debian.org etch/updates/main Packages
release o=Debian,a=testing,l=Debian-Security,c=main
origin security.debian.org
990 http://debian.tu-bs.de etch/non-free Packages
release o=Debian,a=testing,l=Debian,c=non-free
origin debian.tu-bs.de
990 http://debian.tu-bs.de etch/contrib Packages
release o=Debian,a=testing,l=Debian,c=contrib
origin debian.tu-bs.de
990 http://debian.tu-bs.de etch/main Packages
release o=Debian,a=testing,l=Debian,c=main
origin debian.tu-bs.de
Festgehaltene Pakete (»Pin«):
user@debian:~$user@debian:~$ apt-cache policy wine
wine:
Installiert:(keine)
Mögliche Pakete:0.9.25-1
Versions-Tabelle:
0.9.28-1 0
90 http://debian.tu-bs.de sid/main Packages
0.9.25-1 0
990 http://debian.tu-bs.de etch/main PackagesMan sieht hier, dass unter "Mögliche Pakete" die Versionsnummer des Paketes aus der Etch-Quelle angeführt wird. Wollte ich wine installieren, so würde diese ausgewählt, sofern nichts anderes bestimmt wird (dazu später).
Die hier benutzte /etc/apt/preferences sieht folgendermaßen aus:
Package: * Pin: release a=testing Pin-Priority: 990 Package: * Pin: release a=unstable Pin-Priority: 90
Hinweis: Die Leerzeile am Ende der Datei ist wichtig, da aptitude ohne sie durcheinandergeraten kann.
Um die automatische Installation des Pakets zu verhindern, genügt es, den Pin von Sid niedriger als den von Etch anzusetzen, aber: Ist das Paket ersteinmal installiert, so würde ein automatischer upgrade des Pakets aus Sid erfolgen, sofern der Pin größer gleich 100 beträgt. Bei einem Wert niedriger als 100 passiert dies nicht, da die installierten Pakete den Wert von 100 besitzen.
Will man nun ein Paket, zB. wine aus Sid installieren, so muss man aptitute die Option -t [Release] mitgeben. Das t steht für target release, also übersetzt in etwa Zielversion, Zielquelle.
aptitude install -t unstable wine
Die Abhängigkeiten werden dann, sofern nicht aus Etch zu lösen, durch Sid bedient, so dass man diese nicht manuell aufschlüsseln muss.
2. Zweites Beispiel: Stable + Backports
Siehe Backports 4.2
3. Drittes Beispiel: Rettung von APT durch Pinning
Falls man versehentlich eine höhere Version eines Paketes aus einer anderen Quelle zur Installation vorgesehen hat (ohne Pinning), dieses Paket aber nicht installationsfähig ist, so kann dies zu der verfahrenen Situation führen, dass APT nun ständig versucht, dieses Paket anstelle der gewünschten (niedrigeren) Version zuinstallieren und daran scheitert. Selbst ein Herausnehmen der anderen Quelle aus der sources.list nebst einem aptitude update ändert daran nichts.
Eine Lösung hierfür ist, die Hauptquelle mit einem Pin von zB. 1001 zu versehen (siehe die obige Tabelle). ZB.:
Package: * Pin: release a=stable Pin-Priority: 1001
Zwei Beispiele aus der Praxis: