Jak zapobiec aktualizacji konkretnego pakietu?

374

Z powodu błędu # 693758 chciałbym uniemożliwić apt-get upgradei zaktualizować pakiet „libgtk2.0-0” przez Menedżera aktualizacji.

Jak można to osiągnąć?

Ivan
źródło
@hhlp: Ale to pytanie dotyczy pakietu, który nigdy nie został zainstalowany.
Nathan Osman
1
@George Edison - Istnieje również przechowywanie pakietów, które pozwala nie aktualizować pakietu. Trzymanie pakietu oznacza w zasadzie, że każesz menedżerowi pakietu zachować aktualną wersję bez względu na wszystko. Jest to przydatne, jeśli nowsza wersja aktualnie działającego programu ulegnie awarii po aktualizacji. (nie możesz trzymać pakietu, który nigdy nie był zainstalowany, również widzę, że moje pytanie jest takie samo) .... przetestowałem to teraz - patrz powiedziałdisable packages from the auto-update
hhlp

Odpowiedzi:

554

Trzymać

Istnieją cztery sposoby powstrzymywania pakietów: z dpkg, apt, aptitude lub dselect.

dpkg

Zawieś paczkę:

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

Usuń blokadę:

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

Wyświetl status swoich paczek:

dpkg --get-selections

Wyświetl status pojedynczej paczki:

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

trafny

Trzymaj paczkę:

sudo apt-mark hold <package-name>

Usuń blokadę:

sudo apt-mark unhold <package-name>

Pokaż wszystkie wstrzymane pakiety:

sudo apt-mark showhold

dselect

Za pomocą dselect przejdź do ekranu wyboru [S] elect, znajdź pakiet, który chcesz zatrzymać w jego obecnym stanie, i naciśnij =lub H. Zmiany zaczną obowiązywać natychmiast po wyjściu z ekranu [S] elekt.


Następujące podejścia są ograniczone w tym, że blokowanie / trzymanie pakietu w aptitude lub synaptic nie wpływa na apt-get / apt.

uzdolnienie

Trzymaj paczkę:

sudo aptitude hold <package-name>

Usuń blokadę:

sudo aptitude unhold <package-name>

Blokowanie za pomocą Menedżera pakietów Synaptic

Przejdź do Menedżera pakietów Synaptic (System> Administracja> Menedżer pakietów Synaptic).

Kliknij przycisk wyszukiwania i wpisz nazwę pakietu.

Po znalezieniu pakietu wybierz go i przejdź do menu Pakiet i wybierz opcję Zablokuj wersję .

Menu Synaptyczne

Ten pakiet nie będzie teraz wyświetlany w menedżerze aktualizacji i nie będzie aktualizowany.

hhlp
źródło
4
Działa to również, aby zapobiec instalacji pakietu. Podczas instalacji devscriptswiele pakietów jest pobieranych jako zalecane pakiety. Ponieważ nie potrzebuję serwera pocztowego (postfiks), mógłbym wyłączyć jego instalację, uruchamiając echo postfix hold | sudo dpkg --set-selectionsprzed uruchomieniem sudo apt-get install devscripts. Ta akcja wstrzymania trwa tylko dla tej instalacji, po instalacji opcje są resetowane.
Lekensteyn,
3
Warto również zauważyć, że pakiety wstrzymują aktualizacje i łaty czasami, tworząc sytuację, w której nie ma legalnego rozwiązania, które można by obliczyć na podstawie zależności. Jeśli pakiet foo ma zależność == <lub <= od libbar, apt odmówi aktualizacji libbar, a także foo. Z czasem te zależności kaskadowe mogą rosnąć, blokując dużą liczbę aktualizacji, w tym ważne aktualizacje zabezpieczeń. Musisz albo usunąć wstrzymanie i pozwolić na aktualizację, albo przebudować posiadane pakiety na nowsze wersje jego zależności, jeśli tak się stanie.
Stephanie,
2
Tylko uwaga: apt-marknie obsługuje holdw wersji 0.7.25 (Ubuntu Lucid)
Joril
1
Jest to szczególnie przydatne, gdy próbujesz zatrzymać sterowniki karty graficznej. Dla użytkowników ATI apt-mark hold fglrx fglrx-amdcccle fglrx-dev && aptitude hold fglrx fglrx-amdcccle fglrx-dev.
earthmeLon 18.04.13
8
Obecnie synaptic i aptitude blokują tylko pakiety w tych programach. „Cokolwiek innego, co wymaga aktualizacji pakietów (czytaj: Menedżer aktualizacji, apt-get, aptitude itp.) Ignoruje to.” Z tego pytania .
holocronweaver
44

Aby zawiesić pakiet „foo”:

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

W twoim przypadku wstrzymamy wino:

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

Aby usunąć blokadę:

sudo -i
echo "wine install" | dpkg --set-selections
Pantera
źródło
Należy również zauważyć, że podczas gdy opakowanie jest zawieszone, to może zainstalować konkretną wersję pośrednictwem apt-get install wine=1.2.3. Wstrzymanie uniemożliwia apt-get (dist-)upgradezmianę tego.
rcoup
@rcoup Jeśli masz zawieszoną starą wersję, a następnie ręcznie zaktualizujesz ją do nowej wersji bez usuwania wstrzymania zgodnie z opisem, czy stara wersja będzie przechowywana w pamięci podręcznej, aby można było do niej wrócić?
cxrodgers
1
@ cxrodgers lokalna pamięć podręczna (zazwyczaj /var/cache/apt/archives) jest niezależna od wstrzymań, aktualizacji i innych rzeczy, więc wszystkie pobrane wersje będą tam, dopóki nie uruchomiszapt-get [auto]clean
rcoup
35

Szukałem tego samego i po wielu badaniach odkryłem, że używając następującej składni możesz zabronić jednej konkretnej wersji, ale zezwolić na następną aktualizację:

Pakiet: compiz-plugins-main
Pin: wersja 1: 0.9.7.0 ~ bzr19-0ubuntu10.1
Priorytet pinów: -1

To idzie do pliku / etc / apt / preferences.

soger
źródło
9
Jest to znacznie lepszy sposób niż zapobieganie aktualizacjom na czas nieokreślony
Eero Aaltonen
Wydaje mi się, że dzięki tej metodzie istnieje większe prawdopodobieństwo, że oprogramowanie ubuntu „adware”, takie jak ubuntu one lub ikona Amazon, nie zostanie ponownie zainstalowane przy następnej aktualizacji ...
Daniel Alder
19

Zainstaluj synapticza pomocą sudo apt-get install synaptic.

Uruchom za pomocą gksudo synapticiw polu wyszukiwania zlokalizuj pakiet, który chcesz zablokować, tj .:gedit

wprowadź opis zdjęcia tutaj

Z menu pakietu wybierz Wersja blokady :

wprowadź opis zdjęcia tutaj

I to wszystko, wersja aktualnie zainstalowana w momencie blokady pozostanie zainstalowana nawet podczas aktualizacji.

Bruno Pereira
źródło
7
Proszę spojrzeć na „Wersja blokady nie jest tak sprytna, jak się wydaje. Powinna robić to, co mówi na puszce, blokować wersję ... Ale blokuje ją tylko w Synaptic. Cokolwiek innego, co powoduje aktualizację pakietu (czytaj: Menedżer aktualizacji , apt-get, aptitude itp.) ignoruje to. Prawdopodobnie jest to błędne zachowanie, więc oczekiwałbym, że zostanie to naprawione na czas. ” from askubuntu.com/questions/9607/what-does-lock-version-do . Jaki jest obecny stan? Jeśli coś jest zablokowane w Synaptic, to czy inni menedżerowie pakietów „honorują” zamek?
2
vasa1: Począwszy od wersji 0.75.13, wciąż nie :( Ten sam problem z aptitude.
syockit,
16

Zapobieganie instalowaniu pakietu nazywa się „wstrzymywaniem pakietu” i jest bardzo proste:

echo nazwa_pakietu wstrzymaj | dpkg - set-selections

... gdzie * nazwa_pakietu * to nazwa pakietu, którego instalacji chcesz zabronić.

Uwaga: powyższe polecenie zakłada uprawnienia roota. Innymi słowy, prawdopodobnie będziesz musiał wpisać sudo suprzed uruchomieniem.

RobotHumans
źródło
Idealne, to była odpowiedź. Dziękuję Ci.
asoundmove
s/sudo su/sudo -s/g(lub sudo -i). ( -ida powłokę logowania, -snie będzie).
derobert
6

Ponieważ jakiś czas apt-getzostał zastąpiony przez apt, więc na przykład chcę zapobiec aktualizacji Firefoksa do wersji powyżej 56, ponieważ wiele dodatków, takich jak „Grupy kart , nie działa już z nowym Firefoksem 57 (patrz „Rozszerzenia Web” Aktualizacja").

Możliwe jest przechowywanie więcej niż jednego pakietu za pomocą jednego polecenia i używanie symboli wieloznacznych.

Zapobiegaj aktualizacji Firefoksa

sudo apt-mark hold firefox firefox-locale-*

Jeśli zechcesz je później zatrzymać, będzie to polecenie:

sudo apt-mark unhold firefox firefox-locale-*
rubo77
źródło
4

Synaptic możesz zamrozić wersję konkretnego pakietu. Nie jestem w 100% pewien, czy to poprawi apt-get, ale na pewno zatrzyma menedżera aktualizacji.

Aby zamrozić pakiet, wybierz go w synaptic, a następnie otwórz menu pakietu i wybierz opcję zamrożenia.

Mam nadzieję że to pomoże

edytuj: To pytanie 16668 dotyczy podobnej sytuacji

Allan
źródło
3

Zobacz błędy # 75332 , # 158981 i # 72806 .

Podsumowując, wstrzymanie na poziomie apt-get / aptitude nie wyzwala statusu wstrzymania w dpkg (szczególnie błąd 72806), a menedżer aktualizacji odczytuje status z dpkg.

obejście jest uruchamiane jako root: echo "package hold" | dpkg --set-selections

jaspis
źródło
2

Możesz użyć na aptitude „specyficznego przesłonięcia”, takiego jak to:

aptitude reinstall ~i oracle-java8-jre:

Jest to jednorazowe użycie (nieprzechowywane do przyszłej ponownej instalacji), zachowaj określone zastąpienie, aby ponownie zainstalować wszystkie pakiety w systemie, ale nie oracle-java8-jre.

Jeśli użyjesz przesłonięcia specyficznego dla keep, pakiet na chwilę będzie w stanie keep, a aptitude nie spróbuje go zainstalować.

Bardzo dobrze, jeśli uważasz, że twój system został w jakiś sposób skompromitowany.

cabonamigo
źródło
1

Jeśli masz zainstalowany Synaptic, możesz wybrać pakiet i użyć menu Pakiet -> Zablokuj wersję, aby zapobiec jego aktualizacji.

Możesz zainstalować Synaptic za pomocą sudo apt-get install synaptic. Osobiście uważam to za bardziej przydatne niż Software Center ... z drugiej strony jestem dość starą szkołą. :)

dinchamion
źródło
0

Czasami ktoś może chcieć powstrzymać wszystkie aktualnie zainstalowane pakiety. Oto jak.

Najpierw zapisz bieżący stan, aby móc cofnąć:

dpkg --get-selections > current_selections.txt

Następnie, aby powstrzymać wszystkie paczki:

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

Wreszcie, gdy chcesz przywrócić poprzedni stan:

dpkg --set-selections < current_selections.txt

Jednym z takich przypadków może być tworzenie migawki maszyny wirtualnej lub Amazon AMI w celu migracji z kontroli jakości do środowiska produkcyjnego.

JVW
źródło
0

Dodanie szczegółów do komentarzy @ soger dotyczących Ubuntu 16.04.

Ubuntu 16.04 domyślnie nie ma pliku / etc / apt / preferencji. Jeśli go nie masz, po prostu utwórz nowy plik i wypełnij go sekcją, jak opisano powyżej @ soger, aby wykluczyć dany pakiet i jego zależności z aktualizacji.

Następnie biegnij apt updatei jesteś GTG. : 0)

Na przykład mam serwer Ubuntu 16.04.5 LTS z wbudowaną kartą wideo Intel i kartą NVidia. Użyto tylko karty NVidia. Serwer używa również sterowników CUDA. Miałem problem, w którym aptciągle nalegałem

va-driver-all

(Sterowniki Intel) wymagały aktualizacji, ale nie można było ustalić, którą wersję zainstalować. To doprowadzało mnie do szału, a i tak nie potrzebowałem sterowników Intela. Wpisałem ten tekst do pliku preferencji i opróżniłem apt, problem rozwiązany.

Package: va-driver-all
Pin: release *
Pin-Priority: -1
MrPotatoHead
źródło