rétrograder les packages ppa vers des versions disponibles à un moment antérieur


14

La trame de fond est que les pilotes Intel GPU normaux ne font pas les différentes extensions OpenGL que mon codage de passe-temps et certains jeux veulent. Je dois donc installer xorg-edgers et puis c'est content. Cependant, mercredi dernier, il y a eu une mise à jour de xorg-edgers - beaucoup de paquets - et elle s'est mal cassée; les chauffeurs se verrouillent et emportent tout l'ordinateur avec eux; réinitialisation matérielle requise.

Alors, comment pouvez-vous rétrograder - sélectionner des versions de package dans un PPA qui représentent un point dans le passé, en ignorant les versions plus récentes que cela?

Réponses:


17

Utiliser xorg-edgers ppa pour le travail quotidien pourrait être une très mauvaise idée.

Cela peut vous donner les derniers pilotes, certes, mais vous pouvez également obtenir des pilotes qui ne fonctionnent pas.

Pour supprimer un PPA et rétrograder les packages remplacés par celui-ci (donc revenir à ceux disponibles sur les dépôts officiels), installez d'abord ppa-purge:

sudo apt-get install ppa-purge

Et puis supprimez le PPA, rétrogradant gracieusement vers les packages officiels:

sudo ppa-purge ppaname

Cela devrait rétrograder vos packages vers les packages officiels.

Les autres packages qui étaient dans PPA mais pas dans les dépôts officiels ne seront pas désinstallés. Vous devez dire manuellement au gestionnaire de packages de les supprimer, par exemple en utilisant apt:

sudo apt-get purge packagename

Vous pouvez trouver le nom du ppa en consultant la section "Sources de logiciels" des paramètres Ubuntu, et voir une liste des packages qu'il fournit sur sa page de tableau de bord (ou en consultant la section "Origine" de Synaptic Package Manager, s'il est installé).


1
Comme je l'ai dit, les pilotes normaux ne fonctionnent pas pour moi. J'ai besoin de xorg-edgers. Je veux juste contourner la toute dernière version de mes pilotes.
Will

dix la prochaine fois que vous utilisez xorg edgers ppa (et fonctionne), désactivez simplement le ppa et restez avec ces versions de package
xangua

2
sudo ppa-purge ppa:someppa/ppa
DmitrySandalov

il supprime tout dans mon cas
personne

2

J'ai eu le même problème aujourd'hui, j'ai remarqué qu'il y a environ 2 semaines, j'ai installé des mises à jour sur mon système et j'avais toujours ubuntu-x-swat ppa activé qui avait un nouveau pilote nvidia. L'ancien allait bien, le nouveau a cassé mon système (seulement légèrement, il m'a fallu un certain temps pour le remarquer).

J'ai donc regardé dans /var/log/apt/history.log pour trouver le numéro de version précédente du package de pilotes nvidia que j'avais installé, puis j'ai essayé de trouver le package dans / var / cache / apt / archives, où vous aurez normalement trouver tous les paquets téléchargés par apt, mais il n'y était pas. Et le ppa ne conserve pas la version précédente de ses packages une fois qu'ils sont remplacés par une version plus récente, je ne peux donc pas l'obtenir non plus.

Mais, le diff de la version précédente du package à la plus récente est conservé dans le ppa pour toutes les versions, et avec l'archive tar d'origine et ses correctifs Debian, il est possible d'annuler toutes les modifications de la version la plus récente et d'obtenir les sources de la version précédente.

Je décrirai brièvement les étapes nécessaires:

  • Allez sur le ppa, trouvez la dernière version du paquet et téléchargez l'archive tar d'origine et les correctifs Debian (facultatifs), dans mon cas, ceux-ci ont été trouvés sur cette page:

    https://launchpad.net/~ubuntu-x-swat/+archive/x-updates/+sourcepub/2087970/+listing-archive-extra
    

    L'archive tar d'origine est nommée:

    nvidia-graphics-drivers_290.10.orig.tar.gz
    

    Les correctifs Debian qui font un paquet constructible à partir de l'archive tar sont:

    nvidia-graphics-drivers_290.10-0ubuntu1~lucid~xup1.diff.gz
    
  • Extrayez-les quelque part de préférence dans un nouveau répertoire vide, puis appliquez les correctifs à l'arborescence source

    ~/nvidia> tar xvzf nvidia-graphics-drivers_290.10.orig.tar.gz
    [...]
    ~/nvidia> gzip -d nvidia-graphics-drivers_290.10-0ubuntu1\~lucid\~xup1.diff.gz
    ~/nvidia> patch -p0 < nvidia-graphics-drivers_290.10-0ubuntu1\~lucid\~xup1.diff
    [...]
    

    Vous ne devriez pas obtenir de morceaux rejetés lors du patch.

  • Sur la même page ppa, vous trouverez un diff de la version précédente du package à celle que vous regardez, sous la section "Available Diffs".

    Pour moi, c'était:

    diff from 285.05.09-0ubuntu1~lucid~xup1 to 290.10-0ubuntu1~lucid~xup1
    
  • Téléchargez-le, extrayez et inversez-le pour l'appliquer aux sources originales corrigées:

    ~/nvidia> gzip -d nvidia-graphics-drivers_285.05.09-0ubuntu1\~lucid\~xup1_290.10-0ubuntu1\~lucid\~xup1.diff.gz
    ~/nvidia> patch -R -p0 < nvidia-settings_285.05.09-0ubuntu1\~lucid\~xup1_290.10-0ubuntu1\~lucid\~xup1.diff
    [...]
    
  • Presto! Maintenant, vous devriez avoir l'arborescence source de la version précédente prête à construire un package:

    ~/nvidia> mv nvidia-settings-290.10/ nvidia-settings-285.05.09
    ~/nvidia> cd nvidia-settings-285.05.09/
    ~/n/nvidia-settings-285.05.09> dpkg-buildpackage
    
  • Ce qui devrait vous donner un package de la version précédente qui peut être installé avec dpkg:

     ~/n/nvidia-settings-285.05.09> cd ..
     ~/nvidia> sudo dpkg -i nvidia-current_285.05.09-0ubuntu1\~lucid\~xup1_amd64.deb
     [...]
    

0

À l'avenir, si vous utilisez synaptique (en supposant que vous pouvez démarrer dans X), vous pouvez sélectionner parmi les versions disponibles en mettant en surbrillance le package à modifier, puis en sélectionnant `` forcer la version '' dans le menu. De là, vous devriez pouvoir rétrograder.


0

[Affiche originale]

N'ayant pas beaucoup de plaisir, j'ai écrit un script pour calculer la différence et exécuter la commande de restauration; il y avait environ 100 paquets impliqués. Malheureusement, ma rétrogradation a échoué car de nombreux packages ne sont plus disponibles :(

#!/usr/bin/env python

import sys, getopt, os
from datetime import datetime
datefmt = "%Y-%m-%d %H:%M:%S"

dry_run = True
try:
    opts,args = getopt.getopt(sys.argv[1:],"y")
    if not args:
        raise Exception("no date specified")
    elif len(args) == 1:
        args.append("00:00:00") # default time
    elif len(args) != 2:
        raise Exception("unexpected arguments")
    snapshot = datetime.strptime(" ".join(args),datefmt)
    for opt,_ in opts:
        if opt == "-y":
            dry_run = False
        else:
            raise Exception("unsupported option %s"%opt)
except Exception as e:
    print "error:",e
    print "usage:",sys.argv[0],"[flags] YYYY-MM-DD [HH:MM:SS]"
    print "flags: -y = for real; don\'t just show it, restore it"
    sys.exit(1)

# work out what to do
history = {}
restore = set()
remove = set()
with open("/var/log/dpkg.log","r") as log:
    for line in log:
        date,time,action,line = line.split(None,3)       
        when = datetime.strptime("%s %s"%(date,time),datefmt)
        package,ver = line.strip().split(None,1)
        if when <= snapshot:
            if action in ("upgrade","install"):
                prev_ver,new_ver = ver.split()
                history[package] = new_ver
            elif action == "remove":
                if package in history:
                    del history[package]
                else:
                    print "(cannot remove %s)"%line
        else:
            if action == "install":
                remove.add(package)
            elif action == "upgrade":
                if package in history:
                    restore.add(package)
                elif package not in remove:
                    print "(cannot revert %s)"%line
            elif action == "remove":
                if package in history:
                    restore.add(package)
                elif package in remove:
                    remove.remove(package)
                else:
                    print "(cannot revert %s)"%line

# show what to do
for package in restore:
    print "restore",package,history[package]
for package in remove:
    print "remove",package

# do it
if not dry_run:
    print "======"
    def execute(cmd):
        print cmd
        os.system(cmd)
    #execute("apt-get remove "+" ".join(remove))
    execute("apt-get install "+" ".join("%s=%s"%(package,history[package]) for package in restore))

Pauvre toi. Saviez-vous que l'historique d'installation est disponible dans /var/log/apt/history.log?
Lekensteyn

dpkg.log est la même information mais inclut également d'autres applications que apt.
Will

Quelles autres applications utilisent dpkgalors directement? Synaptic est un frontal de apt-get.
Lekensteyn

l'utilisateur peut utiliser directement dpkg; l'utilisateur peut également utiliser gdebi ou un autre outil. J'ai dû choisir un fichier à analyser, alors j'ai choisi le seul fichier approprié - dpkg.log. Il arrive que j'utilise apt exclusivement, mais même différence.
Will
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.