Apt-pinning
Aus Fedorawiki.de
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:
| | 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:
ATrpms: apt-get -t ATrpms install PAKETNAME |
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

