ubuntuusers.de

Du betrachtest eine alte Revision dieser Wikiseite.

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.

Apt-Pinning nennt man eine Technik, bei der in der sources.list verschiedene Paketquellen bevorzugt werden. So kann man bei einer LTS-Version bleiben, aber gezielt Pakete von einer neueren Version oder einer inoffiziellen Quelle ziehen. Es lässt sich auch ein Paket in einer bestimmten Version festhalten oder dessen Installieren oder Deinstallieren verhindern. Dies wird hier als Beispiel dargestellt.

Das Pinning geschieht in der Datei /etc/apt/preferences, die in einem Editor mit Root-Rechten [1] angelegt bzw. bearbeitet werden muss. Im weiteren Verlauf folgen Beispiele. Ab Ubuntu 10.04 müssen im Ordner /etc/apt/preferences.d/ Dateien angelegt werden. Diese können beliebige Namen haben und beliebig viele Regeln enthalten.

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:

## Offizielle Quellen
deb http://archive.ubuntu.com/ubuntu/ lucid main restricted universe multiverse
deb-src http://archive.ubuntu.com/ubuntu/ lucid main restricted universe multiverse
## Inoffizielle Quelle
deb http://peters-ubuntupakete.example.org/ubuntu/ lucid main restricted universe multiverse

Pinning per release

Package: *
Pin: release v=10.04, l=Ubuntu
Pin-Priority: 1000

Von nun an haben alle Pakete aus Quellen mit der Version 10.04 und dem Distributionsnamen (Label) Ubuntu den Vorzug, selbst wenn es in anderen Quellen neuere Pakete gibt. Ein Pin: release a=lucid hätte nicht gereicht, da es ja auch Paketquellen von Ubuntu 10.04 gibt, die lucid-security, lucid-updates etc. heißen. Erst wenn es die 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 erläutert.

Pinning per origin

Package: *
Pin: origin peters-ubuntupakete.example.org
Pin-Priority: 300

Dieser Fall setzt die Priorität einer bestimmten Internetadresse ("origin"). Die genaue Bedeutung der "Pin-Priority" werden im Abschnitt Werte für Pin-Priority erläutert.

Pinning per version

Package: hello
Pin: version 2.1.1*
Pin-Priority: 1000

Dieses Beispiel verhindert das Installieren einer neueren Version als 2.1.1 des Paketes hello, aber auch die unbeabsichtigte „automatische“ Deinstallation aufgrund von Konflikten.

Hinweis:

In der /etc/apt/preferences definiert eine Leerzeile einen neuen Abschnitt für einen weiteren Eintrag. Leerzeilen zwischen Package, Pin und Pin-Priority sind nicht erlaubt!

Gezieltes Umgehen mit apt-get

Im Terminal [2] kann man mit apt-get die Prioritäten aber auch gezielt umgehen. Folgender Aufruf z.B. zieht mplayer aus dem precise-Paketbereich (= Ubuntu 12.04). Dabei werden Abhängigkeiten nach der Priorität erfüllt.

apt-get -t precise install mplayer-custom

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. lucid oder lucid-backports

  • c (components) - Der Bereich eines Repositories, z.B. universe

  • v (version) - Version des Repositories bzw. der Veröffentlichung, z.B. 10.04 für lucid

  • o (origin) - Die Erzeuger des Repositories z.B. Ubuntu oder LP-PPA-eclipse-team. Nicht zu Verwechseln mit origin als Quelle (Domainname).

  • l (label) - Name der Distribution, z.B. Ubuntu

Die genauen Werte können mittels apt-cache policy nachgeschlagen werden. Hier ein Ausschnitt aus der Ausgabe dieses Kommandos.

  25 http://packages.medibuntu.org jaunty/free Packages
     release v=9.04,o=Medibuntu,a=jaunty,l=Medibuntu,c=free
     origin packages.medibuntu.org
 500 http://de.archive.ubuntu.com jaunty/main Packages
     release v=9.04,o=Ubuntu,a=jaunty,l=Ubuntu,c=main
     origin de.archive.ubuntu.com
  50 http://ppa.launchpad.net jaunty/main Packages
     release v=9.04,o=LP-PPA-eclipse-team,a=jaunty,l=Ubuntu,c=main
     origin ppa.launchpad.net

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 1000: Version wird in jedem Fall installiert, auch wenn das einen Downgrade des Paketes nach sich zieht

  • von 991 bis 1000: Version wird installiert, auch wenn sie nicht zum Release gehört, es sei denn ein aktuelleres Pakete ist bereits installiert

  • von 501 bis 990 : Version wird installiert, wenn es nicht eine Version gibt, die zum Release gehört oder eine aktuellere Version bereits installiert ist

  • von 101 bis 500: Version wird installiert, es sei denn, es gibt eine aktuellere die nicht zum Release gehört oder die bereits installierte Version ist aktueller

  • von 0 bis 100: Version wird nur dann installiert, wenn es keine bereits installierte gibt

  • negativer Wert: Version wird nicht installiert

Das Paket mit der höchsten Punktzahl wird bevorzugt.

Experten-Info:

Ausführlichere Informationen hierzu findet man in der Manpage von apt_preferences oder im APT HOWTO 🇬🇧.

Beispiele

1. Von proposed-Quellen downgraden

Mit Pinnings 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 idR. gut getesteten Pakete bzgl. Installationsroutine und -Integration downzugraden. Zuerst deaktiviert man die proposed-Quellen [3] und aktualisiert die Paketindexdateien. Dann fügt man folgenden Eintrag der /etc/apt/preferences hinzu (ggfs. Datei neu anlegen): [1]

1
2
3
Package: *
Pin: release a=ARCHIV*
Pin-Priority: 1001

Dabei ist ARCHIV durch den Codenamen der jeweiligen Ubuntuversion zu ersetzen. Der Stern * sollte nach dem Codenamen gesetzt werden, damit auch Pakete aus den -updates und -security-Quellen berücksichtigt werden. Codenamen sind: hardy, lucid, natty, oneiric, precise, quantal, ...

Anschließend sollte das Upgrade bzw. Downgrade der Pakete durchgeführt werden: [2]

sudo apt-get dist-upgrade 

Nachdem die Paketversionen korrigiert wurden, sollte der Pinning-Eintrag wieder entfernt werden, damit in Zukunft ein Upgrade auf ein neues Ubunturelease ohne Probleme möglich ist.

2. Einzelne Pakete aus früherer / späterer 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 Update zu machen. Oder aber man hat ein Update hinter sich, die neue Version eines Programms macht jedoch Probleme und man würde lieber für dieses eine Paket zur früheren Version wechseln. 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 up- bzw. downgegraded werden sollen.

Achtung!

Die Verwendung von Paketen aus anderen Ubuntu-Versionen kann im Einzelfall eine pragmatisch Lösung sein, in der Regel ist aber davon abzuraten. Besonders bei bei einer hohen Zahl an Abhängigkeiten sind Probleme vorprogrammiert.

Konkretes Beispiel: Das Paket subversion liegt für Ubuntu 12.04 (precise) in der Version 1.6.17 und für Ubuntu 12.10 (quantal) in der Version 1.7.5 vor. Nach einem Update möchte man zur Version 1.6 zurückkehren. Dazu legt man eine Datei /etc/apt/sources.list.d/ubuntu-precise.list an, mit dem Inhalt

1
deb http://archive.ubuntu.com/ubuntu precise main

sowie eine Datei /etc/apt/preferences.d/my-pinning an, mit dem Inhalt:

1
2
3
4
5
6
7
Package: *
Pin: release v=12.04, l=Ubuntu
Pin-Priority: 100

Package: subversion
Pin: version 1.6*
Pin-Priority: 1001

Nach einem sudo apt-get update kann das Paket auf die gewünschte Version gebracht werden:

sudo apt-get install subversion 

Dieser Befehl funktioniert noch nicht sofort, stattdessen zeigt apt-get die Abhängigkeiten an, die ebenfalls downgegraded werden müssen. Dies kann entweder durch einen weiteren pinning-Eintrag geschehen, oder einfach durch Neuinstallation:

sudo apt-get remove libsvn1
sudo apt-get install subversion 

  • apt Übersichtsseite zum Paketmanagement mit APT

Diese Revision wurde am 13. November 2012 21:24 von 3TX erstellt.
Die folgenden Schlagworte wurden dem Artikel zugewiesen: Paketverwaltung, Installation