ppa-Pakete auf Versionen zurückstufen, die zu einem früheren Zeitpunkt verfügbar waren


14

Die Hintergrundgeschichte ist, dass die normalen Intel-GPU-Treiber nicht die verschiedenen OpenGL-Erweiterungen ausführen, die meine Hobby-Programmierung und einige Spiele wollen. Also muss ich xorg-edgers installieren und dann ist es glücklich. Letzten Mittwoch gab es jedoch ein Update für xorg-edgers - viele Pakete - und es ist schwer kaputt gegangen. die Fahrer schließen ab und nehmen den ganzen Computer mit; Hard Reset erforderlich.

Wie können Sie ein Downgrade durchführen, indem Sie Paketversionen in einem PPA auswählen, die einen früheren Zeitpunkt darstellen, und neuere Versionen ignorieren?

Antworten:


17

Xorg-edgers ppa für die tägliche Arbeit zu verwenden, könnte eine ziemlich schlechte Idee sein.

Es kann Ihnen die neuesten Treiber geben, stimmt, aber Sie können auch nicht funktionierende Treiber bekommen.

Um einen PPA zu entfernen und die durch ihn ersetzten Pakete herunterzustufen (gehen Sie also zu den Paketen zurück, die in den offiziellen Repositories verfügbar sind), installieren Sie zuerst ppa-purge:

sudo apt-get install ppa-purge

Entfernen Sie anschließend die PPA, und führen Sie einen ordnungsgemäßen Downgrade auf offizielle Pakete durch:

sudo ppa-purge ppaname

Dies sollte Ihre Pakete wieder auf offizielle Pakete zurückstufen.

Andere Pakete, die in PPA, aber nicht in offiziellen Repositorys enthalten waren, werden nicht deinstalliert. Sie sollten den Paketmanager manuell anweisen, sie zu entfernen, z. B. mit apt:

sudo apt-get purge packagename

Den Namen des ppa finden Sie im Abschnitt "Software Sources" der Ubuntu-Einstellungen und eine Liste der bereitgestellten Pakete auf der Launchpad-Seite (oder im Abschnitt "Origin" des Synaptic Package Manager, falls installiert).


1
Wie gesagt, die normalen Fahrer arbeiten bei mir nicht. Ich brauche Xorg-Kantenschneider. Ich möchte nur die neueste Version meiner Treiber umgehen.
Wird

Wenn du das nächste Mal xorg edgers ppa verwendest (und es funktioniert), deaktiviere einfach ppa und
bleibe

2
sudo ppa-purge ppa:someppa/ppa
DmitrySandalov

Es entfernt alles in meinem Fall
niemand

2

Ich hatte heute das gleiche Problem. Mir ist aufgefallen, dass ich vor ca. 2 Wochen Updates für mein System installiert und immer noch Ubuntu-X-Swat PPA aktiviert hatte, das einen neuen NVIDIA-Treiber hatte. Der alte war in Ordnung, der neue hat mein System kaputt gemacht (nur geringfügig, es dauerte eine Weile, bis ich es bemerkte).

Also habe ich in /var/log/apt/history.log nach der vorherigen Versionsnummer des von mir installierten nvidia-Treiberpakets gesucht und dann versucht, das Paket in / var / cache / apt / archives zu finden, wo Sie es normalerweise finden Finde alle Pakete, die von apt heruntergeladen wurden, aber es war nicht da. Und das ppa behält keine frühere Version seiner Pakete bei, sobald sie von einer neueren Version abgelöst wurden, sodass ich sie auch von dort nicht mehr bekommen konnte.

Der Unterschied zwischen der vorherigen und der neueren Paketversion bleibt jedoch für alle Versionen im ppa erhalten, und zusammen mit dem ursprünglichen Tarball und seinen Debian-Patches ist es möglich, alle Änderungen der neueren Version rückgängig zu machen und die Quellen der vorherigen Version abzurufen.

Ich beschreibe kurz die notwendigen Schritte:

  • Gehen Sie zum ppa, suchen Sie die neueste Paketversion und laden Sie den Original-Tarball und die (optionalen) Debian-Patches herunter, in meinem Fall die auf dieser Seite gefundenen:

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

    Der ursprüngliche Tarball heißt:

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

    Die Debian-Patches, die aus dem Tarball ein baubares Paket machen, sind:

    nvidia-graphics-drivers_290.10-0ubuntu1~lucid~xup1.diff.gz
    
  • Extrahieren Sie diese Dateien vorzugsweise in ein neues und leeres Verzeichnis und wenden Sie die Patches auf den Quellbaum an

    ~/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
    [...]
    

    Sie sollten beim Patchen keine abgelehnten Teile erhalten.

  • Auf derselben ppa-Seite finden Sie unter "Available Diffs" (Verfügbare Diffs) ein Diff von der vorherigen Paketversion zu dem, den Sie gerade sehen.

    Für mich war das:

    diff from 285.05.09-0ubuntu1~lucid~xup1 to 290.10-0ubuntu1~lucid~xup1
    
  • Laden Sie das herunter, extrahieren Sie es und wenden Sie es in umgekehrter Reihenfolge auf die gepatchten Originalquellen an:

    ~/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! Jetzt sollten Sie den Quelltextbaum der vorherigen Version bereit haben, um ein Paket zu erstellen:

    ~/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
    
  • Welches sollte Ihnen ein Paket der Vorgängerversion geben, das mit dpkg installiert werden kann:

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

0

Wenn Sie in Zukunft synaptic verwenden (vorausgesetzt, Sie können in X booten), können Sie aus den verfügbaren Versionen auswählen, indem Sie das zu ändernde Paket markieren und dann "Version erzwingen" aus dem Menü auswählen. Von dort aus sollten Sie ein Downgrade durchführen können.


0

[Originalplakat]

Ich hatte nicht viel Spaß und schrieb ein Skript, um den Unterschied zu berechnen und den Wiederherstellungsbefehl auszuführen. Es waren ungefähr 100 Pakete beteiligt. Leider ist mein Downgrade fehlgeschlagen, da viele Pakete nicht mehr verfügbar sind :(

#!/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))

Du armer. Wussten Sie, dass die Installationshistorie nur in verfügbar ist /var/log/apt/history.log?
Lekensteyn

dpkg.log enthält die gleichen Informationen, jedoch auch andere Apps als apt.
Wird

Welche anderen Apps nutzen dpkgdann direkt? Synaptic ist ein Frontend von apt-get.
Lekensteyn

der Benutzer kann dpkg direkt verwenden; der Benutzer kann stattdessen auch gdebi oder ein anderes Tool verwenden. Ich musste eine Datei zum Parsen auswählen, also habe ich die richtige Datei ausgewählt - dpkg.log. Es kommt vor, dass ich ausschließlich apt verwende, aber den gleichen Unterschied.
Wird
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.