web-dev-qa-db-fra.com

Comment puis-je rétrograder des packages sans supprimer leurs personnes à charge?

J'ai mis à niveau un certain nombre de packages mesa vers une version de PPA avant de purger le PPA afin de pouvoir mettre à niveau mon système. Les différences entre les versions sont mineures (elles sont techniquement identiques, un seul ensemble de bibliothèques provient de git et les autres sont les versions finales).

Si j'essaie de rétrograder via Synaptic, apt-get ou aptitude, je suis plongé dans l'enfer de la dépendance.

Existe-t-il un moyen de rétrograder les packages manuellement (un par un) et de marquer leurs packages dépendants comme inamovibles (si cela a du sens) jusqu'à ce que j'ai terminé?

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

16
RolandiXor

Je n'avais jamais joué avec cela auparavant, mais je suggèrerais que vous hold (ou lock) la version des dépendances qui vous causent des problèmes. De cette façon, apt a un nombre plus limité de solutions possibles et ne vous confondez peut-être pas lorsque vous essayez de rétrograder les autres packages.


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 gros, téléchargez manuellement les packages .deb nécessaires, puis installez-les un par un à l'aide du dpkg de niveau inférieur et de 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 avez l'argument --force-downgrade:

          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 avez 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 digit et Comment installer une version plus ancienne de Java et Comment installer une version plus ancienne d'un paquet tel que liquid 2.2. 2? pour des exemples de:

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

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

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

Une autre approche consisterait à créer un package factice .deb à l'aide du package equivs (et peut-être d'un nom légèrement différent). Ensuite, l’installation du paquet factice devrait vous permettre de supprimer le paquet "vrai" tout en conservant les dépôts appropriés, puis d'installer l'ancienne version. Je ne sais pas exactement comment cela fonctionnerait, mais vérifiez ce fil pertinent pour plus de détails: Comment supprimer un deb sans supprimer ses dépendances .

13
landroni

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

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

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

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

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

  • Supprimez le package cible:

    Sudo apt-get remove <target-package-name>
    
  • Pour voir une liste des versions de paquetages que vous pouvez déclasser/mettre à niveau, utilisez:

    apt-cache policy <target-package-name>
    
  • Installez la version cible du package 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 de dépendances/recommandées/suggérées paquets, c’est-à-dire ceux qui doivent être marqués avec apt-mark est grande, enregistrez la liste prévue de la sortie empaquetée par apt-cache show <target-package-name> dans n’importe quel fichier, par exemple, /path/to/foo et utilisez le apt-mark dans un fichier. combo comme ceci:

cat /path/to/foo | xargs -imarkthese Sudo apt-mark manual markthese
4
precise

Je viens tout juste de passer à la mise à niveau vers une version en amont d'un package, puis de décider de rétrograder. C'était via un référentiel privé de mainteneurs. Dans mon cas, il s'agissait d'essayer la dernière version de Systemd 233 (non encore publiée).

La clé est de comprendre que vous devez spécifier tous les packages qui doivent être rétrogradés. Si vous obtenez ce droit, les chances sont aptes à faire ce que vous voulez. Si vous manquez quelque chose, apt vous dira que l'action entraînera la suppression de nombreux paquets. Pour vous assurer que nous utilisons l'indicateur '-s' pour essayer le déclassement avant de le faire.

Les étapes à suivre sont les suivantes:

1) Répertoriez toutes les dépendances mises à niveau 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) Indiquez quelle est la bonne version stable 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érifiez que tout va bien:

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 sais pas si --reinstall était nécessaire, mais c'est ce que j'ai fait)

4) Retirez les -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
1
user2427436