17 votes

Comment puis-je rétrograder des paquets sans supprimer les éléments qui en dépendent ?

J'ai un certain nombre de paquets tabla que j'ai mis à jour vers une version PPA, avant de purger le PPA pour pouvoir mettre à jour mon système. Les différences entre les versions sont mineures (elles sont techniquement les mêmes, juste un ensemble de bibliothèques provenant de git et les autres sont les versions finales).

Si j'essaie de rétrograder via Synaptic, apt-get ou aptitude, je me retrouve dans l'enfer des dépendances.

Existe-t-il un moyen de rétrograder les paquets manuellement (peut-être un par un) et de marquer les paquets qui en dépendent comme inamovibles (si cela a un sens) jusqu'à ce que j'aie terminé ?

P.S. cette question : Comment rétrograder un paquet via apt-get ? est un peu différent et n'aide pas dans cette situation.

14voto

landroni Points 5657

Je n'ai jamais joué avec cela auparavant, mais je suggérerais que vous hold (ou lock ) la version des dépendances qui vous posent problème. De cette manière apt a un nombre plus limité de solutions possibles, et ne s'embrouille peut-être pas lorsque vous tentez de rétrograder les autres paquets.


Si rien d'autre ne fonctionne, vous pouvez adopter l'approche manuelle suggérée dans cette réponse : Comment rétrograder un paquet via apt-get ? . En principe, il faut télécharger les .deb manuellement, puis les installer un par un à l'aide de l'outil de niveau inférieur dpkg et l'un de ses arguments forts : --ignore-depends , --force-depends , --force-depends-version ou même --force-all .

Dans le même esprit que ci-dessus, vous disposez de la --force-downgrade argument :

          downgrade(*): Install a package, even if newer version of
          it is already installed.

          Warning:  At  present  dpkg  does  not  do any dependency
          checking on downgrades and therefore will not warn you if
          the  downgrade  breaks the dependency of some other pack
          age. This can  have  serious  side  effects,  downgrading
          essential system components can even make your whole sys
          tem unusable. Use with care.

Mais cela suppose que vous ayez lu man dpkg et que vous comprenez ce que vous faites :

          Warning: These options are mostly intended to be used  by
          experts  only.  Using  them  without  fully understanding
          their effects may break your whole system.

Voir Erreur : le numéro de version ne commence pas par un chiffre y Comment installer une ancienne version de Java y Comment installer une version plus ancienne d'un paquet comme liquid 2.2.2 ? pour des exemples de :

sudo dpkg --force-downgrade -i your_mesa_package.deb

Et voir Comment puis-je installer un paquet sans installer certaines dépendances ? pour un exemple (accompagné de l'avertissement approprié) :

sudo dpkg --force-all -i your_mesa_package.deb

Une autre approche consisterait à créer un fichier fictif .deb à l'aide du paquet equivs (et peut-être un nom légèrement différent). Ensuite, l'installation du paquet factice devrait vous permettre de supprimer le "vrai" paquet tout en conservant les deps pertinents, puis d'installer l'ancienne version. Je ne sais pas exactement comment cela fonctionne, mais jetez un coup d'œil à ce fil de discussion pour plus de détails : Comment supprimer une version deb sans supprimer ses dépendances ? .

5voto

precise Points 14840

Vous pouvez d'abord utiliser apt-mark pour marquer toutes les dépendances du paquet cible (et peut-être aussi ceux qui sont recommandés/suggérés) installé dans le système en tant que manuel installe. Après cela, installez les versions précédentes du logiciel avec apt-get en mentionnant explicitement la version.

  • Pour lister les dépendances, les paquets recommandés et suggérés pour le paquet cible :

    apt-cache show <target-package-name>
  • Marquer les paquets comme installé manuellement :

    sudo apt-mark manual <package-name(s)>

    (à utiliser pour toutes les dépendances, recommandées et suggérées).

  • Supprimer le paquet cible :

    sudo apt-get remove <target-package-name>
  • Pour obtenir une liste des versions de paquets que vous pouvez modifier ou mettre à jour, utilisez la commande suivante

    apt-cache policy <target-package-name>
  • Installer la version cible du paquetage requis :

    sudo apt-get install <target-package-name>=<target-package-version-number> 

    ou

    sudo apt-get -t=<target release> install <target-package-name>

PS. Si la liste des dépendances/recommandé/suggéré les paquets, c'est-à-dire ceux qui doivent être marqués d'un apt-mark est important, sauvegarder la liste prévue du paquetage produit par apt-cache show <target-package-name> dans n'importe quel fichier, par exemple /path/to/foo et utiliser le apt-mark dans une telle combinaison :

cat /path/to/foo | xargs -imarkthese sudo apt-mark manual markthese

4voto

user2427436 Points 459

Je viens de subir la douleur d'une mise à jour vers une version amont d'un paquetage et de décider ensuite de rétrograder. Cela s'est fait par l'intermédiaire d'un dépôt privé d'un mainteneur. Dans mon cas, il s'agissait d'essayer la dernière version de systemd 233 (qui n'a pas encore été publiée).

L'essentiel est de comprendre que vous devez spécifier tous les paquets qui doivent être déclassés. Si vous le faites correctement, il y a de fortes chances qu'apt fasse ce que vous voulez. Si vous oubliez quelque chose, apt vous dira que l'action entraînera la suppression de nombreux paquets. Pour s'en assurer, nous utilisons l'option '-s' pour tester la rétrogradation avant de l'effectuer.

Les étapes à suivre sont les suivantes :

1) Listez toutes les dépendances qui ont été mises à jour en amont (utilisez un autre mot-clé si votre situation est différente) :

dpkg -l|grep upstream

Cela vous donne une liste de paquets avec un numéro de version en amont.

2) Lister la version stable correcte pour chaque paquet :

for i in libnss-resolve:amd64 libsystemd0:amd64 libpam-systemd:amd64 libsystemd0:i386 libudev1:amd64 libudev1:i386 systemd systemd-sysv udev; do apt-cache show $i; done|grep Version

3) Vérifier à nouveau que tout est en ordre :

apt -s --allow-downgrades --no-remove --reinstall install libnss-resolve:amd64=232-21ubuntu5 libsystemd0:amd64=232-21ubuntu5 libpam-systemd:amd64=232-21ubuntu5 libsystemd0:i386=232-21ubuntu5 libudev1:amd64=232-21ubuntu5 libudev1:i386=232-21ubuntu5 systemd=232-21ubuntu5 systemd-sysv=232-21ubuntu5 udev=232-21ubuntu5

0 to upgrade, 0 to newly install, 9 to downgrade, 0 to remove and 0 not to upgrade.

(je ne suis pas sûr que --reinstall soit nécessaire, mais c'est ce que j'ai fait)

4) Supprimez le -s et faites-le.

apt --allow-downgrades --no-remove --reinstall install libnss-resolve:amd64=232-21ubuntu5 libsystemd0:amd64=232-21ubuntu5 libpam-systemd:amd64=232-21ubuntu5 libsystemd0:i386=232-21ubuntu5 libudev1:amd64=232-21ubuntu5 libudev1:i386=232-21ubuntu5 systemd=232-21ubuntu5 systemd-sysv=232-21ubuntu5 udev=232-21ubuntu5

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X