L’histoire de base est que les pilotes de processeur graphique Intel normaux ne font pas les différentes extensions OpenGL souhaitées par mon code de passe-temps et certains jeux. Je dois donc installer xorg-edgers, puis son contenu. Cependant, mercredi dernier, il y avait une mise à jour de xorg-edgers - beaucoup de paquets - et ça a mal fonctionné; les conducteurs se verrouillent et emportent tout l'ordinateur avec eux; réinitialisation matérielle requise.
Alors, comment pouvez-vous rétrograder - sélectionnez des versions de package dans un PPA qui représentent un point dans le passé, en ignorant les versions plus récentes?
Utiliser xorg-edgers ppa pour le travail quotidien pourrait être une très mauvaise idée.
Cela peut vous donner les derniers pilotes, c'est vrai, mais vous pouvez également obtenir des pilotes qui ne fonctionnent pas.
Pour supprimer un PPA et rétrograder les paquets qu'il remplace (revenons donc à ceux disponibles sur les référentiels officiels), installez d'abord ppa-purge:
Sudo apt-get install ppa-purge
Et ensuite, supprimez le PPA en rétrogradant gracieusement les paquets officiels:
Sudo ppa-purge ppaname
Cela devrait rétrograder vos paquets en paquets officiels.
Les autres packages qui étaient dans PPA mais pas dans les référentiels officiels ne seront pas désinstallés. Vous devez indiquer manuellement au gestionnaire de paquets de les supprimer, en utilisant par exemple apt:
Sudo apt-get purge packagename
Vous pouvez trouver le nom du ppa en consultant la section "Sources de logiciel" des paramètres Ubuntu et la liste des paquets qu'il fournit sur la page de son tableau de bord (ou en consultant la section "Origine" de Synaptic Package Manager, le cas échéant).
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 de mon système et j'avais toujours ubuntu-x-swat ppa activé avec un nouveau pilote nvidia. Le vieil était bien, le nouveau a brisé mon système (seulement légèrement, il m'a fallu un certain temps pour remarquer).
J'ai donc cherché dans /var/log/apt/history.log le numéro de version précédent du package de pilote nvidia que j'avais installé, puis j'ai essayé de le trouver dans/var/cache/apt/archives, où vous utiliserez normalement trouvez tous les paquets téléchargés par apt, mais ce n’était pas là. Et ppa ne conserve pas la version précédente de ses paquets une fois qu'ils ont été remplacés par une version plus récente, de sorte que je ne pouvais pas l'obtenir à partir de là non plus.
Cependant, la différence entre la version précédente et la version la plus récente est conservée dans le PPA pour toutes les versions et, avec l'archive d'origine et ses correctifs Debian, il est possible d'inverser toutes les modifications de la version la plus récente et d'obtenir les sources de la version précédente.
Je vais décrire brièvement les étapes nécessaires:
Allez sur ppa, recherchez la version la plus récente du paquet et téléchargez l’archive originale 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 originale est nommée:
nvidia-graphics-drivers_290.10.orig.tar.gz
Les correctifs Debian qui rendent un paquet constructible à partir de l'archive 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 avoir de morceaux rejetés lors de l'application de correctifs.
Sur la même page ppa, vous trouverez une différence entre la version précédente et celle que vous regardez, sous la section "Différences disponibles".
Pour moi c'était:
diff from 285.05.09-0ubuntu1~lucid~xup1 to 290.10-0ubuntu1~lucid~xup1
Téléchargez-le, extrayez-le et appliquez-le inversement 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! Vous devez maintenant avoir l’arborescence source de la version précédente prête à construire un paquet:
~/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 la version précédente du paquet pouvant ê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
[...]
À l'avenir, si vous utilisez Synaptic (en supposant que vous puissiez démarrer sous X), vous pouvez sélectionner l'une des versions disponibles en mettant en surbrillance le package à modifier, puis en sélectionnant "forcer la version" dans le menu. De là, vous devriez pouvoir déclasser.
[Affiche originale]
Ne m'amusant pas beaucoup, 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, mon déclassement a échoué car de nombreux paquets 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))