Apt-pinning

Aus Fedorawiki.de

Wechseln zu: Navigation, Suche
Dieser Artikel ist Teil der HOWTO Sammlung
Achtung Achtung:

Die folgenden Beispiele betreffen die erweiterte Konfiguration von apt. Für einen normalen Betrieb ist das folgende nicht notwendig. Durch das Mischen von Repositories oder das "Pinnen" eines einzelnen Paketes können andere Pakete an ihrer Installation gehindert werden. Alles in allem sollten die folgenden Schritte nur mit bedacht und auf eigene Gefahr eingesetzt werden.

Inhaltsverzeichnis

Vorwort

Das Mischen der Repositories kann ja bekanntlich zu Problemen (d.h. meistens Paketkonflikten) führen. Was aber tun, wenn man z.B. als ein User der "großen Drei" (fedora.us, livna.org, kde-redhat) unbedingt ein Paket von ATrpms installieren und vor allem automatisch aktuell halten möchte. Oder wenn man ein Paket in der jetzigen Versionsnummer beibehalten möchte (also das es nicht aktualisiert wird).Die Antwort liegt in der Konfiguration von /etc/apt/preferences.

Grundsätzlicher Aufbau

Die Syntax der Datei /etc/apt/preferences lautet folgendermassen:

Explanation:
Package:
Pin:
Pin-Priority:

Wichtig dabei ist, dass man leider keine Einträge mit # auskommentieren kann. Dies bewirkt, dass apt meckert.

Die Punkte im einzelnen:

Explanation: Die Eintragung von Explanation ist dabei optional.

Package: Für Package kann entweder ein * oder der genaue Name des Paketes angegeben werden, eine Kombination ist leider nicht wirksam (z.B. kde*).

Pin: Für Pin kann entweder eingetragen werden:

version VERSIONSNUMMER
origin HERKUNFT
release c=SEKTION, o=ORIGIN, v=VERSION, l=LABEL

Die Versionsnummer kann auch mit einer Wildcard kombiniert werden, z.B. 2.4*. Die Werte für origin und release müssen dabei eindeutig sein, auch übergreifend für die verschiedenen Zweige eines Repositories (z.B. bei kde-redhat: stable, testing, unstable). Dies ist leider nicht immer der Fall (siehe dazu auch [1]) Mit dem folgenden Befehl können die möglichen Einträge angezeigt werden:

apt-cache policy

Pin-Priority: Als Pin-Priority muss eine Zahl X eingegeben werden. Nach ihr entscheidet apt, was es installieren bzw. nicht installieren und wie es bei Updates vorgehen soll. Die Auswahl und das Verstehen dieses Wertes ist der schwierigste Teil, mit ihr sollte man am besten ein wenig testen, bis der optimale Wert herausgefunden wurde. Regel:

Wichtig Wichtig:

X < 0 Das Paket wird niemals installiert
0 < X <= 100 Das Paket wird nur installiert, wenn es noch keine installierte Version des Paketes gibt
100 < X <= 500 Bewirkt eine installation des Paketes, ausser es exisitiert eine Version, die zu einer andere Distribution (bezogen auf Debian stable, testing, unstable) gehört oder die installierte Version ist neuer.
500 < X <= 990 Bewirkt die Installation, es sei denn es gibt eine zum Target Release gehörige Version oder die installierte Version ist neuer
990 < X <= 1000 Bewirkt immer eine Installation, ausser die installierte Version ist neuer
X > 1000 Das Paket wird immer installiert, auch wenn dies ein Downgrade des Paketes nach sich zieht

Anmerkung Anmerkung:

Normalerweise haben die Pakete in den Repos einen Wert von 500, schon installierte Pakete dabei den Wert 100

Je größer die Liste wird, desto genauer müssen natürlich die jeweiligen Pin-Priority abgewägt werden.

Beispiele

Pinnen eines bestimmten Packetes

Wenn z.B. das Paket gaim in der jetzigen Version 1.0.1 festgehalten werden soll, muss folgendes in /etc/apt/preferences eingetragen werden:

Package: gaim
Pin: version 1.0.1
Pin-Priority: 999


Nur das Aktualisieren von Paketen aus dem gewünschten Repository zulassen

Wer KDE vom KDE-Redhat-Projekt benutzt, kennt es manchmal, dass die Version von redhat-menus (oder anderer Pakete) von Fedora aktueller als die von kde-redhat ist. Wenn man jetzt nicht bei jedem dist-upgrade von Hand suchen möchte, kann man z.B. angeben, dass Pakete vom kde-Redhat-Projekt Vorrang vor allen anderen Paketen haben.

Package: *
Pin: origin apt.de.kde-redhat.org
Pin-Priority: 990

Wenn es jetzt in verschiedenen Repositories dieselben Pakete gibt, werden trotzdem nur diejenigen installiert, die als Herkunft "apt.de.kde-redhat.org" aufweisen können, auch wenn ein anderes Paket neuer ist. Pakete, die es z.B. nur bei Fedora direkt gibt, sind davon nicht betroffen. "apt.de.kde-redhat.org" ist die eindeutige Angabe bei apt-get policy und mein momentan eingetragener Mirror von kde-redhat. Bei einem Wechsel des Mirrors ändert sich der Eintrag!

Mischen von Repositories (Erster Teil)

Ich benutze z.B. das KDE von kde-redhat, finde aber dass an Crystal angepasste OpenOffice.org extrem hässlich und möchte lieber die von Fedora standardmäßig mitgelieferte Version benutzen:

Package: *
Pin: origin apt.de.kde-redhat.org
Pin-Priority: 990

Package: openoffice.org
Pin: origin apt.de.kde-redhat.org
Pin-Priority: -50

Package: openoffice.org-i18n
Pin: origin apt.de.kde-redhat.org
Pin-Priority: -50 

Package: openoffice.org-libs
Pin: origin apt.de.kde-redhat.org
Pin-Priority: -50

So haben alle Pakete aus dem kde-redhat-Repository Vorrang, OpenOffice.org wird jedoch niemals von dort installiert werden, selbst wenn es gerade nicht auf dem System wäre. Die Updates von OpenOffice.org kommen auch von Fedora direkt.

Soweit zur Theorie. Da beim Update allerdings OpenOffice.org von kde-redhat trotz dieser Einträge installiert werden sollte, musste ich mir mit folgendem zusätzlichen Eintrag helfen, der die drei OpenOffice.org-Pakete auf höhere Priorität seltzt, als alle Pakete von kde-redhat:

Package: openoffice.org
Pin: origin download.fedora.us
Pin-Priority: 999 

Package: openoffice.org-i18n
Pin: origin download.fedora.us
Pin-Priority: 999

Package: openoffice.org-libs
Pin: origin download.fedora.us
Pin-Priority: 999

Mischen von Repositories (Zweiter Teil)

Jetzt wird das Ganze ein wenig heikler: Als Benutzer der großen Drei möchte ich z.B. auch ein Paket von ATrpms installieren und dieses auch pflegen. Gleichzeitig möchte ich aber nicht das ganze Repository einbinden und ausversehen Pakete von dort installieren. Es muss natürlich in der sources.list ein Eintrag für ATrpms vorhanden sein.

Package: *
Pin: release o=ATrpms
Pin-Priority: -50

Der Aufruf von apt-cache search STRING sucht durch den sources.list-Eintrag auch in dem Repository von ATrpms. Durch ein einfaches apt-get install PAKETNAME ist eine Installation jetzt allerdings nicht möglich. Es muss mittels der Option -t ATrpms explizit angegeben werden, wo das Paket herstammt.

apt-get -t ATrpms install PAKETNAME

Dabei werden auch die Abhängigkeiten geprüft und bei Bedarf zusätzliche Pakete mitinstalliert. Diese kommen allerdings auch aus diesem Repository, selbst wenn ein Paket aus einem der eingetragenen Hauptrepositories die Abhängigkeit lösen würde. Abhilfe: Die Abhängikeiten vorher selbst lösen und das fragliche Paket erst danach installieren. Was für die Option -t angegeben werden muss, hab ich einmal kurz hier aufgeführt:

Anmerkung Anmerkung:

ATrpms: apt-get -t ATrpms install PAKETNAME
FreshRPMS: apt-get -t "Fedora Linux Freshrpms" install PAKETNAME
Livna.org: apt-get -t "Fedora Compatible Packages" install PAKETNAME

Wichtig Wichtig:

Mit anderen Repositories ist dies leider im Moment nicht möglich, da die Benennung der jeweiligen Archive nicht eindeutig ist. Es können nur Archive angegeben werden, die bei der Ausgabe von apt-cache policy mit a=STRING eindeutig und einmalig definiert sind.

Allerdings wird dieses Paket bei einem dist-upgrade jetzt nicht aktuell gehalten. Um dieses zu erreichen, muss ein Extra-Eintrag für dieses Paket vorgenommen werden:

Package: PAKETNAME
Pin: release o=ATrpms
Pin-Priority: 750

Jetzt wird es bei einem Upgrade berücksichtigt. Falls eine neuere Version in einem der Hautprepositories (d.h. es wurde mit einer höheren Pin-Priority eingetragen) bereitsteht, wird allerdings diese genommen.

Mischen von Repositories (Dritter Teil)

Im zweiten Teil wurde beschrieben, wie weitere Pakete mit Hilfe der Option -t relativ einfach und schnell installiert werden können. Für alle anderen Repositories gibt es aber trotzdem eine Möglichkeit, Installation und Updates von apt bewerkstelligen zu lassen. Dazu muss der direkte Umweg über /etc/apt/preferences gegangen werden, indem das zu installierdene Paket eine Pin-Priority über 500 bekommt.

Beispiel: Die Bücherverwaltung tellico gibt es nur bei DAG. DAG selber bezeichnet seine Repositories leider nicht eindeutig (release a=Unknown). DAG als ganzes ist als Vertreter der "Großen Vier" immer noch unerwünscht. Zuerst sollte ein Eintrag in /etc/apt/preferences existieren, der das gesamte Repository von der normalen Installation via apt ausnimmt:

Explanation: Niedrige Priorität für Pakete von Dries
Package: *
Pin: origin apt.sw.be
Pin-Priority: -50

Als Pin sollte die Herkunft (origin) gewählt werden, da sich diese nur durch einen Eintrag eines anderen Mirrors für das Repository ändert. Als nächstes wird ein Pin für das Paket tellico definiert:

Explanation: tellico aus dem Repository von DAG
Package: tellico
Pin: origin apt.sw.be
Pin-Priority: 750

Das Paket tellico kann jetzt ganz normal über

apt-get install tellico

installiert werden. Die Option -t ist nicht nötig. Ebenso wird es bei einem Upgrade berücksichtigt. Zusätzliche Abhängigkeiten aus diesem Repository werden allerdings nicht berücksichtigt. Für die benötigten Pakete müssen zusätzliche Pins definiert werden.

Fehlermeldung: Kein Installationskandidat gefunden

Zuletzt noch einmal kurz die Fehlermeldung, die erscheind, wenn man versucht hat, ein Paket aus einem Repository zu installieren, bei dem eine negative Pin-Priority eingestellt wurde:

[root@linux]# apt-get install libFLAC++4
Lese Paketlisten... Fertig
Erzeuge Abhängigkeitsbaum... Fertig
Package libFLAC++4 has no available version, but exists in the database.
This typically means that the package was mentioned in a dependency and
never uploaded, has been obsoleted or is not available with the contents
of sources.list
W: No priority (or zero) specified for pin
E: Paket libFLAC++4 hat keinen Installationskanditaten

Um der Sache noch genauer auf den Grund zu gehen (es kann auch andere Ursachen als das Pinning haben), kann der Befehl apt-cache policy STRING genutzt werden, der die möglichen Installationskandidaten und die eingestellte Priorität anzeigt:

[root@linux]# apt-cache policy libFLAC++4
libFLAC++4:
 Installiert: (nichts)
 Kandidat: (nichts)
 Versionstabelle:
    1.1.1-6.rhfc3.at 0
       -50 http://apt.physik.fu-berlin.de fedora/3/en/i386/at-stable pkglist
       -50 http://apt.physik.fu-berlin.de fedora/3/en/i386/at-testing pkglist
W: No priority (or zero) specified for pin

Mittels der Option -t kann dieses gewünschte Paket aber trotzdem und mitsamt seiner Abhängigkeiten installiert werden:

[root@linux]# apt-get -t ATrpms install libFLAC++4
Lese Paketlisten... Fertig
Erzeuge Abhängigkeitsbaum... Fertig
Die folgenden zusätzlichen Pakete werden installiert werden:
  libFLAC6 (1.1.1-6.rhfc3.at)
Die folgenden NEUEN Pakete werden installiert werden:
  libFLAC++4 (1.1.1-6.rhfc3.at)
  libFLAC6 (1.1.1-6.rhfc3.at)
0 upgraded, 2 newly installed, 0 entfernt und 92 nicht upgegradet.
Muss 136kB an Archiven holen.
Nach dem Auspacken werden 352kB zusätzlicher Plattenplatz benutzt werden.
Wollen Sie fortsetzen? [J/n]

Das Paket libFLAC6 wird also zusätzlich aus dem Repository von ATrpms installiert.

Troubleshooting

Bei Problemen oder unklarheiten kann die Manpage des Programms weiterhelfen:

apt_preferences

Persönliche Werkzeuge