[[Vorlage(Getestet, general)]] [[Vorlage(Fortgeschritten)]] {{{#!vorlage Wissen [:Editor: Einen Editor öffnen] [:Terminal: Ein Terminal öffnen] [:Paketquellen_freischalten: Paketquellen freischalten] [:apt: Verwenden von apt-get und apt-cache] }}} [[Inhaltsverzeichnis(2)]] ''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 [:sudo: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. Sie muss die Dateiendung '''.pref''' oder keine Endung haben, '''precise.pin''' würde z.B. ignoriert werden. {{{#!vorlage 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: {{{#!code sourceslist ## Offizielle Quellen deb http://archive.ubuntu.com/ubuntu/ precise main restricted universe multiverse deb-src http://archive.ubuntu.com/ubuntu/ precise main restricted universe multiverse ## Inoffizielle Quelle deb http://peters-ubuntupakete.example.org/ubuntu/ precise main restricted universe multiverse }}} == Pinning per release == {{{#!code c 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-fuer-Pinning-per-release Parameter für Pinning per release] erläutert. == Pinning per origin == {{{#!code c Package: * Pin: origin peters-ubuntupakete.example.org Pin-Priority: 300 }}} Dieser Fall setzt die Priorität einer bestimmten Internetadresse ("origin", Ursprung). Die genaue Bedeutung der ''"Pin-Priority"'' werden im Abschnitt [#Werte-fuer-Pin-Priority Werte für Pin-Priority] erläutert. == Pinning per version == {{{#!code c 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. {{{#!vorlage 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. {{{#!vorlage Befehl 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. ''precise'' oder ''precise-backports'' * '''c (components)''' - Der Bereich eines Repositories, z.B. ''universe'' * '''v (version)''' - Version des Repositories bzw. der Veröffentlichung, z.B. ''12.04'' für precise * '''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 precise/free Packages release v=12.04,o=Medibuntu,a=precise,l=Medibuntu,c=free origin packages.medibuntu.org 500 http://de.archive.ubuntu.com precise/main Packages release v=12.04,o=Ubuntu,a=precise,l=Ubuntu,c=main origin de.archive.ubuntu.com 50 http://ppa.launchpad.net precise/main Packages release v=12.04,o=LP-PPA-eclipse-team,a=precise,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 999''': Version wird in jedem Fall installiert, auch wenn das einen Downgrade des Paketes nach sich zieht * '''von 990 bis 999''': Version wird installiert, auch wenn sie nicht zum Release gehört, es sei denn ein aktuelleres Pakete ist bereits installiert * '''von 500 bis 989''' : Version wird installiert, es sei denn, es gibt eine Version, die zum Release gehört oder eine aktuellere Version ist bereits installiert * '''von 100 bis 499''': Version wird installiert, es sei denn, es gibt eine aktuellere die nicht zum Release gehört oder die bereits installierte Version ist aktueller * '''von 1 bis 99''': 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. {{{#!vorlage Experten Ausführlichere Informationen hierzu findet man in der [:man:Manpage] von `apt_preferences` oder im [http://www.debian.org/doc/manuals/apt-howto/ch-apt-get.en.html#s-pin APT HOWTO] {en}. }}} = Beispiele = == 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] {{{#!code c 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`, `oneiric`, `precise`, `quantal`, ... Anschließend sollte das Upgrade bzw. Downgrade der Pakete durchgeführt werden: [2] {{{#!vorlage Befehl 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. {{{#!vorlage Hinweis Bis einschließlich [:Lucid Lynx:Ubuntu 10.04] kann kein Globbing beim Archivnamen verwendet werden (Schreibweise mit Stern `*`). Stattdessen müssen alle Archive ausgeschrieben werden: {{{#!code c Package: * Pin: release a=ARCHIV Pin-Priority: 1001 Package: * Pin: release a=ARCHIV-updates Pin-Priority: 1001 Package: * Pin: release a=ARCHIV-security Pin-Priority: 1001 Package: * Pin: release a=ARCHIV-backports Pin-Priority: 1001 \}}} }}} == 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 Upgrade zu machen. Oder aber man hat ein Upgrade hinter sich, die neue Version eines Programms macht jedoch Probleme und man würde lieber für dieses eine Paket zur früheren Version zurückkehren. 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. {{{#!vorlage Warnung 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 einer hohen Zahl an Abhängigkeiten sind Probleme vorprogrammiert. }}} ''Konkretes Beispiel'': Das Paket '''subversion''' (siehe [:Svn:]) liegt für [:Precise Pangolin:Ubuntu 12.04] ("`precise`") in der Version 1.6.17 und für [:Quantal Quetzal:Ubuntu 12.10] ("`quantal`") in der Version 1.7.5 vor. Nach einem Upgrade auf Ubuntu 12.10 möchte man zur Version 1.6 des Pakets zurückkehren. Dazu fügt man den [:sources.list: Paketquellen] folgende Zeile hinzu: [3] {{{#!code sourceslist deb http://archive.ubuntu.com/ubuntu precise main }}} Nun wird in der Pinningsdatei '''/etc/apt/preferences''' folgender Inhalt ergänzt (bzw. die Datei neu angelegt): {{{#!code c Package: subversion Pin: version 1.6* Pin-Priority: 1001 Package: * Pin: release v=12.04, l=Ubuntu Pin-Priority: -1 }}} Nun kann nach Aktualisieren der Paketlisten mit "[:apt/apt-get#apt-get-update: `apt-get update`]" '''subversion''' aus den Ubuntu 12.04 Quellen installiert werden [4]. Wurde es bereits installiert, wird es mit "[:apt/apt-get#apt-get-dist-upgrade: `apt-get dist-upgrade`]" automatisch gedowngradet. Unter Umständen müssen je nach Komplexität der Abhängigkeiten noch weitere Pinning-Einträge hinzugefügt werden. = Links = * [:apt:] {Übersicht} Übersichtsseite zum Paketmanagement mit APT # tag: Installation, Paketverwaltung