Comment empêcher la mise à jour d'un paquet spécifique?

375

En raison du bogue n ° 693758, je voudrais empêcher apt-get upgradeUpdate Manager de mettre à jour le package "libgtk2.0-0".

Comment cela peut il etre accompli?

Ivan
la source
@hhlp: Mais cette question concerne un paquet qui n'a jamais été installé.
Nathan Osman
1
@ George Edison - Il existe également une conservation de paquet, ce qui vous permet de ne pas mettre à jour le paquet. donc, maintenir un paquet signifie en gros que vous demandez au gestionnaire de paquets de conserver la version actuelle, quoi qu’il en soit. Ceci est utile si une version plus récente d'un programme en cours de travail est interrompue après une mise à jour. (vous ne pouvez pas conserver un paquet qui n’a jamais été installé et voir que ma question est identique) ... j’ai déjà testé cela - voyez-vous ditdisable packages from the auto-update
hhlp

Réponses:

555

En portant

Il y a quatre façons de retenir des paquets: avec dpkg, apt, aptitude ou dselect.

dpkg

Mettre un colis en attente:

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

Enlevez la cale:

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

Affichez le statut de vos colis:

dpkg --get-selections

Afficher le statut d'un seul paquet:

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

apte

Tenir un colis:

sudo apt-mark hold <package-name>

Enlevez la cale:

sudo apt-mark unhold <package-name>

Afficher tous les forfaits en attente:

sudo apt-mark showhold

désélectionner

Avec dselect, ouvrez l’écran [S] elect, trouvez le paquet que vous souhaitez conserver dans son état actuel et appuyez sur =ou H. Les modifications prendront effet immédiatement après la sortie de l'écran [S] select.


Les approches suivantes sont limitées en ce que verrouiller / conserver un paquet dans aptitude ou synaptic n'affecte pas apt-get / apt.

aptitude

Tenir un colis:

sudo aptitude hold <package-name>

Enlevez la cale:

sudo aptitude unhold <package-name>

Verrouillage avec le gestionnaire de paquets Synaptic

Allez au gestionnaire de paquets Synaptic (Système> Administration> Gestionnaire de paquets Synaptic).

Cliquez sur le bouton de recherche et tapez le nom du paquet.

Lorsque vous trouvez le package, sélectionnez-le, accédez au menu Package et sélectionnez Verrouiller la version .

Menu synaptique

Ce paquet n'apparaîtra plus dans le gestionnaire de mise à jour et ne sera pas mis à jour.

hhlp
la source
4
Cela fonctionne également pour empêcher l'installation d'un paquet. Lors de l’installation devscripts, un lot emballé est extrait en tant que paquet recommandé. Comme je n’ai pas besoin d’un serveur de courrier (postfix), je pourrais en désactiver l’installation en exécutant echo postfix hold | sudo dpkg --set-selectionsavant d’exécuter sudo apt-get install devscripts. Cette action de maintien ne persiste que pour cette installation. Après cette installation, les sélections sont réinitialisées.
Lekensteyn
3
Il convient également de souligner que les retenues de paquet interrompent les mises à jour et les correctifs en créant parfois une situation dans laquelle il n’existe aucune solution juridique à laquelle apt peut prétendre une dépendance. Si le paquet foo a une dépendance == <ou <= sur libbar, alors apt refusera de mettre à jour libbar ainsi que foo. Au fil du temps, ces dépendances en cascade risquent de bloquer un grand nombre de mises à jour, y compris des mises à jour de sécurité importantes. Si cela se produit, vous devrez soit supprimer le blocage et laisser la mise à niveau se dérouler, soit recréer les packages que vous avez conservés à l'aide de versions plus récentes de ses dépendances.
Stephanie
2
Juste une note: apt-markne supporte pas holddans la version 0.7.25 (Ubuntu Lucid)
Joril
1
Ceci est particulièrement utile lorsque vous essayez de retenir les pilotes graphiques. Pour les utilisateurs ATI, apt-mark hold fglrx fglrx-amdcccle fglrx-dev && aptitude hold fglrx fglrx-amdcccle fglrx-dev.
earthmeLon
8
Actuellement, synaptic et aptitude verrouillent uniquement les paquets contenus dans ces programmes. "Tout ce qui fait les mises à jour de paquet (lisez: Update Manager, apt-get, aptitude, etc.) l'ignore." De cette question .
holocronweaver
44

Pour mettre un paquet "foo" en attente:

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

Dans votre cas, nous allons mettre le vin en attente:

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

Pour enlever la cale:

sudo -i
echo "wine install" | dpkg --set-selections
Panthère
la source
Notez également que lorsqu'un paquet est en attente, vous pouvez installer une version spécifique via apt-get install wine=1.2.3. Être en attente empêche apt-get (dist-)upgradede le changer.
rcoup
@rcoup Si vous avez une ancienne version en attente et que vous effectuez ensuite une mise à niveau manuelle vers une nouvelle version sans supprimer la suspension comme vous le décrivez, l'ancienne version sera-t-elle conservée dans le cache afin que vous puissiez y revenir?
cxrodgers
1
@cxrodgers le cache local (généralement /var/cache/apt/archives) est indépendant des retenues, des mises à jour et autres, donc toutes les versions que vous avez téléchargées seront là jusqu'à ce que vous apt-get [auto]clean
exécutiez
35

Je recherchais la même chose et, après de nombreuses recherches, j'ai constaté qu'en utilisant la syntaxe suivante, vous pouvez interdire une version spécifique mais autoriser la prochaine mise à jour:

Paquetage: compiz-plugins-main
Pin: version 1: 0.9.7.0 ~ bzr19-0ubuntu10.1
Priorité de broche: -1

Cela va dans le fichier / etc / apt / preferences.

soger
la source
9
Il s'agit d'un moyen bien meilleur que d'empêcher les mises à jour indéfiniment
Eero Aaltonen
Avec cette méthode, je pense, les chances sont plus grandes d'empêcher la «réinstallation» d'UBuntu comme Ubuntu One ou de l'icône amazon avec la prochaine mise à jour de version…
Daniel Alder le
19

Installer synapticavec sudo apt-get install synaptic.

Exécutez en utilisant gksudo synapticet dans la zone de recherche, localisez le paquet que vous voulez verrouiller, c'est-à-dire:gedit

entrez la description de l'image ici

Dans le menu du package, sélectionnez Verrouiller la version :

entrez la description de l'image ici

Et c'est tout, la version actuellement installée au moment du verrouillage restera installée même pendant les mises à niveau.

Bruno Pereira
la source
7
Veuillez regarder "La version verrouillée n’est pas aussi intelligente que cela puisse paraître. Elle est supposée faire ce qu’elle dit sur l’étain, verrouiller la version ... Mais elle ne la verrouille que dans Synaptic. , apt-get, aptitude, etc.) ignore ceci. Il s’agit probablement d’un comportement bogué, je pense donc que cela sera corrigé à temps. " de askubuntu.com/questions/9607/what-does-lock-version-do . Quel est l'état actuel? Si quelque chose est verrouillé dans Synaptic, les autres gestionnaires de paquets "honoreront-ils" le verrou?
2
vasa1: Depuis la version 0.75.13, toujours pas :( Même problème d'aptitude.
syockit
16

Empêcher l’installation d’un paquet est appelé "maintien du paquet" et il est très simple à faire:

echo nom_package hold | dpkg --set-selections

... où * nom_package * est le nom du paquet que vous souhaitez empêcher l'installation.

Remarque: la commande ci-dessus suppose les privilèges root. En d'autres termes, vous devrez probablement taper sudo suavant de l'exécuter.

RobotHumans
la source
Parfait ce fut la réponse. Je vous remercie.
asoundmove
s/sudo su/sudo -s/g(ou sudo -i). ( -idonnera un shell de connexion, -sne sera pas).
derobert
6

Depuis un certain temps apt-getest remplacé par apt, donc par exemple que je veux empêcher Firefox de mettre à jour à la version ci - dessus 56, parce que beaucoup d'add-ons, comme « Groupes Tab » ne fonctionnent pas plus avec le nouveau Firefox 57 (voir « WebExtensions Mise à jour").

Il est possible de contenir plusieurs packages avec une commande et d'utiliser des caractères génériques.

Empêcher Firefox de se mettre à jour

sudo apt-mark hold firefox firefox-locale-*

Si vous désiriez les retirer plus tard, ce serait la commande:

sudo apt-mark unhold firefox firefox-locale-*
rubo77
la source
4

Je synaptic vous pouvez geler la version d'un paquet spécifique. Je ne suis pas sûr à 100% de savoir si cela modifiera apt-get mais cela arrêtera définitivement le gestionnaire de mise à jour.

Pour geler un paquet, sélectionnez-le dans Synaptic, puis ouvrez le menu du paquet et sélectionnez Geler la version.

J'espère que cela t'aides

modifier: Cette question 16668 concerne une situation similaire

Allan
la source
3

Voir les bogues n ° 75332 , n ° 158981 et n ° 72806 .

Le résumé est que le maintien au niveau d'apt-get / aptitude ne déclenche pas le statut de maintien dans dpkg (voir le bogue 72806 en particulier) et que le statut de update-manager est lu par dpkg.

La solution de contournement est exécutée en tant que root: echo "package hold" | dpkg --set-selections

jaspe
la source
2

Vous pouvez utiliser sur aptitude le "remplacement spécifique", comme ceci:

aptitude reinstall ~i oracle-java8-jre:

Ceci est une utilisation unique (non stockée pour les réinstallations futures), conservez un remplacement spécifique, pour réinstaller tous les paquetages de votre système, mais pas oracle-java8-jre.

Si vous utilisez un remplacement spécifique à Keep, le paquet sera momentanément dans un état de garder une aptitude ne tentera pas de l'installer.

Une très bonne chose si vous pensez que votre système a été compromis.

cabonamigo
la source
1

Si vous avez installé Synaptic, vous pouvez sélectionner le package et utiliser le menu Package -> Verrouiller la version pour empêcher sa mise à jour.

Vous pouvez installer Synaptic avec sudo apt-get install synaptic. Personnellement, je le trouve plus utile que le Centre logiciel ... là encore, je suis assez vieux. :)

dinchamion
la source
0

De temps en temps, on peut vouloir retenir tous les paquets actuellement installés. Voici comment.

Commencez par enregistrer l’état actuel pour pouvoir annuler:

dpkg --get-selections > current_selections.txt

Ensuite, pour retenir tous les paquets:

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

Enfin, lorsque vous souhaitez revenir à l'état précédent:

dpkg --set-selections < current_selections.txt

Un cas d'utilisation pour cela pourrait être lors de la création d'un instantané de machine virtuelle ou Amazon AMI pour migrer d'un QA vers un environnement de production.

JVW
la source
0

Ajout de détails aux commentaires de @ soger relatifs à Ubuntu 16.04.

Ubuntu 16.04 n'a pas de fichier / etc / apt / preferences existant par défaut. Si vous n'en avez pas actuellement, créez simplement un nouveau fichier et complétez-le avec une strophe telle que décrite par @soger pour exclure le package donné et ses dépendances des mises à jour.

Ensuite, courez apt updateet vous êtes GTG. : 0)

Par exemple, j'ai un serveur Ubuntu 16.04.5 LTS avec une carte vidéo Intel intégrée et une carte NVidia. La carte NVidia est la seule utilisée. Le serveur utilise également des pilotes CUDA. J'ai eu un problème où aptinsistait

va-driver-all

(Pilotes Intel) nécessitait une mise à jour, mais il n’était pas possible de déterminer quelle version installer. Cela me rendait dingue et je n'avais de toute façon pas besoin des pilotes Intel. J'ai entré ce texte dans le fichier de préférences et vidé le problème, le problème est résolu.

Package: va-driver-all
Pin: release *
Pin-Priority: -1
MrPotatoHead
la source