Come impedire l'aggiornamento di un pacchetto specifico?


374

A causa del bug # 693758 Vorrei impedire a apt-get upgradeUpdate Manager di aggiornare il pacchetto "libgtk2.0-0".

Come si può ottenere questo?


@hhlp: Ma questa domanda è su un pacchetto che non è mai stato installato.
Nathan Osman,

1
@ George Edison - C'è anche un pacchetto in attesa, che ti consente di non aggiornare il pacchetto. quindi Tenere un pacchetto in pratica significa che stai dicendo al gestore di pacchetti di mantenere la versione corrente in ogni caso. Ciò è utile se una versione più recente di un programma attualmente funzionante si interrompe dopo un aggiornamento. (non puoi contenere un pacchetto che non è mai stato installato, vedi anche la mia domanda è la stessa) .... l'ho provato proprio ora - vedi, ha dettodisable packages from the auto-update
hhlp,

Risposte:


554

Tenere

Esistono quattro modi per trattenere i pacchetti: con dpkg, apt, aptitude o dselect.

dpkg

Metti un pacchetto in attesa:

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

Rimuovi la sospensione:

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

Visualizza lo stato dei tuoi pacchetti:

dpkg --get-selections

Visualizza lo stato di un singolo pacchetto:

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

adatto

Tenere un pacchetto:

sudo apt-mark hold <package-name>

Rimuovi la sospensione:

sudo apt-mark unhold <package-name>

Mostra tutti i pacchetti in attesa:

sudo apt-mark showhold

dselect

Con dselect, accedi alla schermata [S] eletti, trova il pacchetto che desideri conservare nel suo stato attuale e premi =o H. Le modifiche diventeranno effettive immediatamente dopo essere usciti dalla schermata [S] eletti.


I seguenti approcci sono limitati nel fatto che bloccare / tenere un pacchetto all'interno di aptitude o synaptic non influenza apt-get / apt.

attitudine

Tenere un pacchetto:

sudo aptitude hold <package-name>

Rimuovi la sospensione:

sudo aptitude unhold <package-name>

Blocco con Synaptic Package Manager

Vai a Gestore pacchetti Synaptic (Sistema> Amministrazione> Gestore pacchetti Synaptic).

Fai clic sul pulsante di ricerca e digita il nome del pacchetto.

Quando trovi il pacchetto, selezionalo e vai al menu Pacchetto e seleziona Blocca versione .

Menu sinaptico

Quel pacchetto ora non verrà mostrato nel gestore aggiornamenti e non verrà aggiornato.


4
Questo funziona anche per impedire l'installazione di un pacchetto. Durante l'installazione devscripts, molti pacchetti vengono estratti come pacchetti consigliati. Poiché non ho bisogno di un mailserver (postfix), potrei disabilitare l'installazione eseguendolo echo postfix hold | sudo dpkg --set-selectionsprima di eseguire sudo apt-get install devscripts. Questa azione di blocco persiste solo per questa installazione, dopo l'installazione le selezioni vengono ripristinate.
Lekensteyn,

3
Vale anche la pena sottolineare che i blocchi di pacchetti interrompono a volte aggiornamenti e patch creando una situazione in cui non esiste una soluzione legale che apt possa calcolare in base a una dipendenza. Se il pacchetto foo ha una dipendenza == <o <= su libbar, apt rifiuterà di aggiornare libbar e foo. Nel tempo, queste dipendenze a cascata potrebbero crescere per bloccare un gran numero di aggiornamenti, inclusi importanti aggiornamenti di sicurezza. Dovrai rimuovere il blocco e consentire l'aggiornamento, oppure ricostruire i pacchetti in tuo possesso rispetto alle versioni più recenti delle sue dipendenze, se ciò accade.
Stephanie,

2
Solo una nota: apt-marknon supporta holdnella versione 0.7.25 (Ubuntu Lucid)
Joril

1
Ciò è particolarmente utile quando si tenta di trattenere i driver grafici. Per gli utenti di ATI, apt-mark hold fglrx fglrx-amdcccle fglrx-dev && aptitude hold fglrx fglrx-amdcccle fglrx-dev.
earthmeLon

8
Attualmente synaptic e aptitude bloccano solo i pacchetti all'interno di tali programmi. "Qualsiasi altra cosa che esegua gli aggiornamenti dei pacchetti (leggi: Update Manager, apt-get, aptitude, ecc.) Lo ignora." Da questa domanda .
holocronweaver,

44

Per mettere in attesa un pacchetto "pippo":

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

Nel tuo caso metteremo il vino in attesa:

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

Per rimuovere il blocco:

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

Si noti inoltre che mentre un pacchetto è in attesa, è possibile installare una versione specifica tramite apt-get install wine=1.2.3. Essere in attesa impedisce apt-get (dist-)upgradedi cambiarlo.
Ricupera il

@rcoup Se hai una vecchia versione in attesa e quindi esegui l'upgrade manuale a una nuova versione senza rimuovere la sospensione come descritto, la vecchia versione verrà mantenuta nella cache in modo da poterti tornare indietro?
cxrodgers,

1
@cxrodgers la cache locale (in genere /var/cache/apt/archives) è indipendente da prese, aggiornamenti e cose, quindi tutte le versioni che hai scaricato saranno lì fino a quando non apt-get [auto]clean
eseguirai

35

Stavo cercando la stessa cosa e dopo molte ricerche ho scoperto che usando la sintassi seguente puoi proibire una versione specifica ma consentire il prossimo aggiornamento:

Pacchetto: compiz-plugins-main
Pin: versione 1: 0.9.7.0 ~ bzr19-0ubuntu10.1
Priorità pin: -1

Questo va nel file / etc / apt / preferenze.


9
Questo è un modo molto migliore rispetto alla prevenzione degli aggiornamenti a tempo indeterminato
Eero Aaltonen,

Con questo metodo, penso, ci sono maggiori possibilità di impedire che "adware" di Ubuntu come Ubuntu One o l'icona di Amazon venga reinstallato con il prossimo aggiornamento della versione ...
Daniel Alder,

19

Installa synapticusando sudo apt-get install synaptic.

Esegui utilizzando gksudo synaptice nella casella di ricerca individua il pacchetto che desideri bloccare, ovvero:gedit

inserisci qui la descrizione dell'immagine

Dal menu del pacchetto selezionare Blocca versione :

inserisci qui la descrizione dell'immagine

E questo è tutto, la versione attualmente installata al momento del blocco rimarrà installata anche durante gli aggiornamenti.


7
Si prega di guardare "Bloccare la versione non è così intelligente come sembra. Dovrebbe fare quello che dice sulla scatola, bloccare la versione ... Ma la blocca solo all'interno di Synaptic. Qualsiasi altra cosa che esegua gli aggiornamenti del pacchetto (leggi: Update Manager , apt-get, aptitude, ecc.) ignora questo. Questo è probabilmente un comportamento errato, quindi mi aspetto che questo sia risolto in tempo. " da askubuntu.com/questions/9607/what-does-lock-version-do . Qual è lo stato attuale? Se qualcosa è bloccato in Synaptic, altri gestori di pacchetti "onoreranno" il blocco?

2
vasa1: A partire dalla versione 0.75.13, ancora no :( Stesso problema con aptitude.
syockit,

16

Impedire che un pacchetto venga installato si chiama "pacchetto holding" ed è molto semplice da fare:

echo nome_pacchetto hold | dpkg --set-selections

... dove * nome_pacchetto * è il nome del pacchetto che si desidera impedire l'installazione.

Nota: il comando sopra presuppone i privilegi di root. In altre parole, probabilmente dovrai digitare sudo suprima di eseguirlo.


Perfetta questa era la risposta. Grazie.
asoundmove,

s/sudo su/sudo -s/g(o sudo -i). ( -idarà una shell di login, -sno).
derobert l'

6

Dato che un po 'di tempo apt-getviene sostituito da apt, quindi ad esempio voglio impedire a Firefox di aggiornare alla versione precedente 56, perché molti componenti aggiuntivi, come "Gruppi di schede" non funzionano più con il nuovo Firefox 57 (vedi "WebExtensions" Aggiornare").

È possibile contenere più di un pacchetto con un solo comando e utilizzare caratteri jolly.

Impedisci l'aggiornamento di Firefox

sudo apt-mark hold firefox firefox-locale-*

Se dovessi desiderare di slegarli in seguito, questo sarebbe il comando:

sudo apt-mark unhold firefox firefox-locale-*

4

Sinceramente puoi congelare la versione di un pacchetto specifico. Non sono sicuro al 100% se questo modificherà apt-get ma fermerà definitivamente Update Manager.

Per bloccare un pacchetto selezionalo in sinaptico, quindi apri il menu del pacchetto e seleziona congela versione.

Spero che sia di aiuto

modifica: Questa domanda 16668 riguarda una situazione simile



3

Vedi bug # 75332 , # 158981 e # 72806 .

Il sommario è che hold a livello apt-get / aptitude non sta innescando lo stato hold in dpkg (vedi in particolare il bug 72806) e update-manager legge lo stato da dpkg.

la soluzione alternativa viene eseguita come root: echo "package hold" | dpkg --set-selections


2

È possibile utilizzare su aptitude la "sostituzione specifica", in questo modo:

aptitude reinstall ~i oracle-java8-jre:

Questo è un solo utilizzo di (non memorizzato per future reinstallazioni), mantenere l'override specifico, per reinstallare tutti i pacchetti nel sistema ma non oracle-java8-jre.

Se si utilizza un override specifico di keep, il pacchetto sarà momentaneamente in uno stato di keep a aptitude non tenterà di installarlo.

Un'ottima cosa se pensi che il tuo sistema sia stato compromesso in qualche modo.


1

Se Synaptic è installato, è possibile selezionare il pacchetto e utilizzare il menu Pacchetto -> Blocca versione per impedirne l'aggiornamento.

È possibile installare Synaptic con sudo apt-get install synaptic. Personalmente lo trovo più utile del Software Center ... poi di nuovo, sono abbastanza vecchia scuola. :)


0

Occasionalmente si potrebbe voler trattenere tutti i pacchetti attualmente installati. Ecco come.

Innanzitutto salva lo stato corrente, in modo da poter annullare:

dpkg --get-selections > current_selections.txt

Quindi, per trattenere tutti i pacchetti:

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

Alla fine, quando vuoi tornare allo stato precedente:

dpkg --set-selections < current_selections.txt

Un caso d'uso per questo potrebbe essere quando si crea uno snapshot VM o Amazon AMI per migrare da un QA a un ambiente di produzione.


0

Aggiunta di dettagli ai commenti di @ soger relativi a Ubuntu 16.04.

Ubuntu 16.04 non ha un file / etc / apt / preferenze di default. Se non ne hai uno al momento, crea un nuovo file e popolalo con una stanza come descritto da @soger sopra per escludere il pacchetto dato e le sue dipendenze dagli aggiornamenti.

Successivamente, corri apt updatee sei GTG. : 0)

Ad esempio, ho un server Ubuntu 16.04.5 LTS con scheda video Intel integrata e una scheda NVidia. La scheda NVidia è l'unica utilizzata. Il server utilizza anche i driver CUDA. Ho avuto un problema in cui ho aptcontinuato a insistere

va-driver-tutto

(Driver Intel) ha richiesto un aggiornamento, ma non è stato possibile determinare quale versione installare. Questo mi stava facendo impazzire e comunque non avevo bisogno dei driver Intel. Ho inserito questo testo nel file delle preferenze e scaricato flush, problema risolto.

Package: va-driver-all
Pin: release *
Pin-Priority: -1
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.