Wie kann ich die Aktualisierung eines bestimmten Pakets verhindern?


374

Wegen des Fehlers # 693758 möchte ich verhindern, dass der apt-get upgradeUpdate Manager das Paket "libgtk2.0-0" aktualisiert.

Wie kann das erreicht werden?


@hhlp: Aber diese Frage bezieht sich auf ein Paket, das nie installiert wurde.
Nathan Osman

1
@ George Edison - Es gibt auch eine Paketverwaltung, mit der Sie das Paket nicht aktualisieren können. Wenn Sie also ein Paket halten, müssen Sie dem Paketmanager sagen, dass er die aktuelle Version behalten soll, egal was passiert. Dies ist nützlich, wenn eine aktuellere Version eines laufenden Programms nach einem Update nicht mehr funktioniert. (Sie können nicht ein Paket halten, das nie installiert wurde, siehe auch meine Frage ist die gleiche) .... ich habe das gerade getestet - siehe, sagte erdisable packages from the auto-update
HLP

Antworten:


554

Halten

Es gibt vier Möglichkeiten, Pakete zurückzuhalten: mit dpkg, apt, aptitude oder dselect.

dpkg

Paket zurückstellen:

echo "<package-name> hold" | sudo dpkg --set-selections

Entfernen Sie den Laderaum:

echo "<package-name> install" | sudo dpkg --set-selections

Zeigen Sie den Status Ihrer Pakete an:

dpkg --get-selections

Zeigen Sie den Status eines einzelnen Pakets an:

dpkg --get-selections | grep "<package-name>"

geeignet

Halten Sie ein Paket:

sudo apt-mark hold <package-name>

Entfernen Sie den Laderaum:

sudo apt-mark unhold <package-name>

Alle angehaltenen Pakete anzeigen:

sudo apt-mark showhold

dselect

Rufen Sie mit dselect den Bildschirm [S] elect auf, suchen Sie das Paket, das Sie in seinem aktuellen Zustand halten möchten, und drücken Sie =oder H. Die Änderungen werden sofort nach dem Verlassen des Auswahlbildschirms [S] wirksam.


Die folgenden Ansätze sind dahingehend eingeschränkt, dass das Sperren / Halten eines Pakets innerhalb von aptitude oder synaptic keinen Einfluss auf apt-get / apt hat.

Eignung

Halten Sie ein Paket:

sudo aptitude hold <package-name>

Entfernen Sie den Laderaum:

sudo aptitude unhold <package-name>

Sperren mit dem Synaptic Package Manager

Gehen Sie zu Synaptic Package Manager (System> Administration> Synaptic Package Manager).

Klicken Sie auf die Suchschaltfläche und geben Sie den Paketnamen ein.

Wenn Sie das Paket gefunden haben, wählen Sie es aus und gehen Sie zum Menü Paket und wählen Sie Version sperren .

Synaptisches Menü

Dieses Paket wird jetzt nicht im Update-Manager angezeigt und nicht aktualisiert.


4
Dies verhindert auch, dass ein Paket installiert wird. Bei der Installation devscriptswerden viele Pakete als empfohlene Pakete abgerufen. Da ich keinen Mailserver (Postfix) benötige, kann ich die Installation deaktivieren, indem ich sie echo postfix hold | sudo dpkg --set-selectionsvor der Ausführung ausführe sudo apt-get install devscripts. Diese Hold-Aktion bleibt nur für diese Installation bestehen. Nach der Installation werden die Einstellungen zurückgesetzt.
Lekensteyn

3
Es ist auch erwähnenswert, dass Paketstopps manchmal Upgrades und Patches beschädigen, indem sie eine Situation schaffen, in der es keine legale Lösung gibt, die Apt für eine Abhängigkeit berechnen kann. Wenn das Paket foo eine == <oder <= Abhängigkeit von libbar hat, lehnt apt das Upgrade von libbar und foo ab. Mit der Zeit können diese kaskadierenden Abhängigkeiten zunehmen und eine große Anzahl von Updates blockieren, einschließlich wichtiger Sicherheitsupdates. In diesem Fall müssen Sie entweder die Zurückhaltung aufheben und das Upgrade zulassen oder die von Ihnen aufbewahrten Pakete für neuere Versionen der Abhängigkeiten neu erstellen.
Stephanie

2
Nur ein Hinweis: apt-marknicht unterstützt holdin der Version 0.7.25 (Ubuntu Lucid)
Joril

1
Dies ist besonders nützlich, wenn Sie versuchen, Grafiktreiber zurückzuhalten. Für ATI-Benutzer apt-mark hold fglrx fglrx-amdcccle fglrx-dev && aptitude hold fglrx fglrx-amdcccle fglrx-dev.
EarthMeLon

8
Derzeit sperren synaptic und aptitude nur Pakete in diesen Programmen. "Alles andere, das Paket-Upgrades ausführt (lesen Sie: Update Manager, apt-get, aptitude usw.), ignoriert dies." Aus dieser Frage .
Holocronweaver

44

So stellen Sie ein Paket "foo" in die Warteschleife:

echo "foo hold" | dpkg --set-selections

In Ihrem Fall werden wir den Wein auf Eis legen:

sudo -i
echo "wine hold" | dpkg --set-selections

So entfernen Sie den Hold:

sudo -i
echo "wine install" | dpkg --set-selections

Beachten Sie auch, dass Sie, während ein Paket angehalten ist, eine bestimmte Version über installieren könnenapt-get install wine=1.2.3 . In der Warteschleife zu sein, verhindert, dass dies apt-get (dist-)upgradegeändert wird.
rcoup

@rcoup Wenn Sie eine alte Version in der Warteschleife haben und dann manuell auf eine neue Version aktualisieren, ohne die von Ihnen beschriebene Warteschleife zu entfernen, wird die alte Version im Cache gespeichert, damit Sie wieder darauf zugreifen können?
cxrodgers

1
@cxrodgers der lokale Cache ( in der Regel /var/cache/apt/archives) unabhängig ist von hält und Upgrades & stuff, so dass alle Versionen , die Sie wird es heruntergeladen haben , bis Sie laufenapt-get [auto]clean
rcoup

35

Ich habe das Gleiche gesucht und nach langem Nachforschen festgestellt, dass Sie mit der folgenden Syntax eine bestimmte Version verbieten und das nächste Update zulassen können:

Paket: compiz-plugins-main
Pin: Version 1: 0.9.7.0 ~ bzr19-0ubuntu10.1
Pin-Priorität: -1

Dies geht in die Datei / etc / apt / preferences.


9
Dies ist ein viel besserer Weg, als Updates auf unbestimmte Zeit zu verhindern
Eero Aaltonen

Ich denke, mit dieser Methode ist die Wahrscheinlichkeit größer, dass Ubuntu-Adware wie Ubuntu One oder das Amazon-Symbol beim nächsten Release-Upgrade nicht erneut installiert werden ...
Daniel Alder,

19

Installieren Sie synapticmit sudo apt-get install synaptic.

Führen Sie mit gksudo synapticund im Suchfeld das Paket aus, das Sie sperren möchten, dh:gedit

Bildbeschreibung hier eingeben

Wählen Sie im Paketmenü die Option Version sperren :

Bildbeschreibung hier eingeben

Und das ist alles, die zum Zeitpunkt der Sperre aktuell installierte Version bleibt auch bei Upgrades installiert.


7
Bitte schauen Sie auf "Lock version is not so clever wie es sich anhört. Es soll das tun, was auf der Dose steht, die Version sperren ... Aber es sperrt sie nur innerhalb von Synaptic , apt-get, aptitude, etc) ignoriert dies. Dies ist wahrscheinlich ein fehlerhaftes Verhalten, daher würde ich erwarten, dass dies rechtzeitig behoben wird. " von askubuntu.com/questions/9607/what-does-lock-version-do . Wie ist der aktuelle Stand? Wenn etwas in Synaptic gesperrt ist, werden andere Paketmanager die Sperre "anerkennen"?

2
vasa1: Ab Version 0.75.13 noch kein :( Gleiches Problem mit aptitude.
syockit

16

Das Verhindern der Installation eines Pakets wird als "Paketspeicherung" bezeichnet und ist ganz einfach:

echo Paketname hold | dpkg --set-Auswahl

... wobei * Paketname * der Name des Pakets ist, dessen Installation Sie verhindern möchten.

Hinweis: Der obige Befehl setzt root-Rechte voraus. Mit anderen Worten, Sie müssen wahrscheinlich etwas eingeben, sudo subevor Sie es ausführen können.


Perfekt, das war die Antwort. Danke.
Asoundmove

s/sudo su/sudo -s/g(oder sudo -i). ( -iWird eine Login-Shell geben, -swird nicht).
Derobert

6

Da einige Zeit apt-getdurch ersetzt wird apt, möchte ich beispielsweise verhindern, dass Firefox auf eine Version über 56 aktualisiert wird, da viele Add-Ons wie "Tab Groups" mit dem neuen Firefox 57 nicht mehr funktionieren (siehe "WebExtensions") Aktualisieren").

Es ist möglich, mehrere Pakete mit einem Befehl zu speichern und Platzhalter zu verwenden.

Verhindern Sie, dass Firefox aktualisiert wird

sudo apt-mark hold firefox firefox-locale-*

Wenn Sie sie später wieder freigeben möchten, ist dies der Befehl:

sudo apt-mark unhold firefox firefox-locale-*

4

Ich bin mir nicht sicher, ob dies apt-get ändern wird, aber es wird definitiv den Update Manager stoppen.

Um ein Paket einzufrieren, wählen Sie es in Synaptic aus, öffnen Sie das Paketmenü und wählen Sie die Option zum Einfrieren der Version.

Hoffe das hilft

bearbeiten: Diese Frage 16668 befasst sich mit einer ähnlichen Situation



3

Siehe Bugs # 75332 , # 158981 und # 72806 .

Die Zusammenfassung ist, dass das Halten auf apt-get / aptitude-Ebene nicht den Haltestatus in dpkg auslöst (siehe insbesondere Bug 72806) und der Update-Manager den Status von dpkg liest.

Die Problemumgehung wird als root ausgeführt: echo "package hold" | dpkg --set-selections


2

Sie können bei Bedarf den "bestimmten Override" wie folgt verwenden:

aptitude reinstall ~i oracle-java8-jre:

Dies ist eine einmalige Verwendung von (nicht für zukünftige Neuinstallationen gespeichert), um alle Pakete in Ihrem System neu zu installieren, jedoch nicht von oracle-java8-jre.

Wenn Sie ein Keep-spezifisches Override verwenden, befindet sich das Paket momentan in einem Keep-Zustand und es wird nicht versucht, es zu installieren.

Eine sehr gute Sache, wenn Sie glauben, dass Ihr System irgendwie kompromittiert wurde.


1

Wenn Sie Synaptic installiert haben, können Sie das Paket auswählen und das Menü Paket -> Version sperren verwenden, um zu verhindern, dass es aktualisiert wird.

Sie können Synaptic mit sudo apt-get install synaptic installieren. Ich persönlich finde es nützlicher als das Software Center ... andererseits bin ich ziemlich altmodisch. :)


0

Gelegentlich möchte man vielleicht alle derzeit installierten Pakete zurückhalten . Hier ist wie.

Speichern Sie zuerst den aktuellen Status, damit Sie Folgendes rückgängig machen können:

dpkg --get-selections > current_selections.txt

So halten Sie alle Pakete zurück:

dpkg --get-selections | sed -r "s/\tinstall/hold/" |dpkg --set-selections

Zum Schluss, wenn Sie zum vorherigen Status zurückkehren möchten:

dpkg --set-selections < current_selections.txt

Ein Anwendungsfall hierfür ist möglicherweise die Erstellung eines VM- oder Amazon AMI-Snapshots für die Migration von einer QS- in eine Produktionsumgebung.


0

Hinzufügen von Details zu @sogers Kommentaren zu Ubuntu 16.04.

In Ubuntu 16.04 ist standardmäßig keine / etc / apt / preferences-Datei vorhanden. Wenn Sie derzeit keine haben, erstellen Sie einfach eine neue Datei und füllen Sie sie mit einer Zeilengruppe, wie oben von @soger beschrieben, um das angegebene Paket und seine Abhängigkeiten von Aktualisierungen auszuschließen.

Danach laufen apt updateund du bist GTG. : 0)

Zum Beispiel habe ich einen Ubuntu 16.04.5 LTS-Server mit eingebetteter Intel-Grafikkarte und einer NVidia-Karte. Die NVidia-Karte ist die einzige, die verwendet wird. Der Server verwendet auch CUDA-Treiber. Ich hatte ein Problem, auf dem ich aptimmer wieder bestand

Va-Fahrer-alles

(Intel-Treiber) erforderten ein Update, konnten jedoch nicht feststellen, welche Version installiert werden soll. Das hat mich verrückt gemacht, und ich brauchte sowieso keine Intel-Treiber. Ich habe diesen Text in die Einstellungsdatei eingegeben und apt gelöscht, Problem behoben.

Package: va-driver-all
Pin: release *
Pin-Priority: -1
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.