eseguire il downgrade dei pacchetti ppa alle versioni disponibili in un momento precedente


14

Il retroscena è che i normali driver GPU Intel non eseguono le varie estensioni OpenGL che il mio codice hobby e alcuni giochi vogliono. Quindi devo installare xorg-edger e poi è felice. Tuttavia, mercoledì scorso circa c'è stato un aggiornamento di xorg-edgers - molti pacchetti - e si è rotto male; i driver si bloccano e portano con sé l'intero computer; hard reset richiesto.

Quindi, come è possibile effettuare il downgrade: selezionare le versioni del pacchetto in un PPA che rappresentano un punto nel passato, ignorando le versioni più recenti di quella?

Risposte:


17

L'uso di xorg-edgers ppa per il lavoro quotidiano potrebbe essere una pessima idea.

Può darti i driver più recenti, vero, ma puoi anche ottenere driver non funzionanti.

Per rimuovere un PPA e eseguire il downgrade dei pacchetti sostituiti da esso (quindi tornando a quelli disponibili sui repository ufficiali), installare prima ppa-purge:

sudo apt-get install ppa-purge

E quindi rimuovere il PPA, eseguendo il downgrade con grazia ai pacchetti ufficiali:

sudo ppa-purge ppaname

Questo dovrebbe ridimensionare i tuoi pacchetti a quelli ufficiali.

Altri pacchetti che erano in PPA ma non nei repository ufficiali non verranno disinstallati. Dovresti dire manualmente al gestore pacchetti di rimuoverli, ad esempio usando apt:

sudo apt-get purge packagename

Puoi trovare il nome del ppa guardando la sezione "Sorgenti software" delle Impostazioni di Ubuntu e vedere un elenco di pacchetti che fornisce sulla sua pagina del launchpad (o guardando la sezione "Origine" di Synaptic Package Manager, se installato).


1
Come ho detto, i driver normali non funzionano per me. Ho bisogno di bordi per xorg. Voglio solo eludere l'ultima versione dei miei driver.
— Sarà il

dieci la prossima volta che usi xorg edgers ppa (e funziona) basta disabilitare ppa e attenersi a quelle versioni del pacchetto
— xangua

2
sudo ppa-purge ppa:someppa/ppa
— DmitrySandalov il

rimuovendo ogni cosa nel mio caso
— nessuno

2

Ho avuto lo stesso problema oggi, ho notato che ~ 2 settimane fa ho installato gli aggiornamenti del mio sistema e avevo ancora Ubuntu-X-Swat ppa abilitato che aveva un nuovo driver NVIDIA. Il vecchio andava bene, il nuovo ha rotto il mio sistema (solo leggermente, mi ci è voluto un po 'per notarlo).

Quindi ho cercato in /var/log/apt/history.log per trovare il numero di versione precedente del pacchetto driver nvidia che avevo installato e poi ho cercato di trovare il pacchetto in / var / cache / apt / archives, dove normalmente trova tutti i pacchetti scaricati da apt, ma non era lì. E il ppa non mantiene la versione precedente dei suoi pacchetti una volta che sono stati sostituiti da una versione più recente, quindi non sono riuscito a ottenerlo da lì.

Tuttavia, la differenza tra la versione precedente del pacchetto e la più recente è mantenuta nel ppa per tutte le versioni e insieme al tarball originale e alle sue patch debian è possibile invertire tutte le modifiche della versione più recente e ottenere i sorgenti della versione precedente.

Descriverò brevemente i passaggi necessari:

  • Vai su ppa, trova la versione del pacchetto più recente e scarica il tarball originale e le patch debian (opzionali), nel mio caso quelle sono state trovate su quella pagina:

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

    Il tarball originale si chiama:

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

    Le patch debian che rendono un pacchetto costruibile fuori dal tarball sono:

    nvidia-graphics-drivers_290.10-0ubuntu1~lucid~xup1.diff.gz
    
  • Estrarre quelli da qualche parte preferibilmente in una directory nuova e vuota, quindi applicare le patch all'albero dei sorgenti

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

    Non si dovrebbero ottenere pezzi rifiutati durante l'applicazione di patch.

  • Nella stessa pagina di ppa troverai un diff dalla versione precedente del pacchetto a quella che stai guardando, sotto la sezione "Available Diffs".

    Per me quello era:

    diff from 285.05.09-0ubuntu1~lucid~xup1 to 290.10-0ubuntu1~lucid~xup1
    
  • Scaricalo, estrailo e applicalo al contrario alle fonti originali con patch:

    ~/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! Ora dovresti avere l'albero dei sorgenti della versione precedente pronto per compilare un pacchetto:

    ~/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
    
  • Che dovrebbe darti un pacchetto della versione precedente che può essere installato con dpkg:

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

0

In futuro, se si utilizza synaptic (supponendo che sia possibile eseguire l'avvio in X) è possibile selezionare tra le versioni disponibili evidenziando il pacchetto da modificare e quindi selezionando 'imponi versione' dal menu. Da lì dovresti essere in grado di eseguire il downgrade.


0

[Poster originale]

Non mi sono divertito molto, ho scritto uno script per calcolare la differenza ed eseguire il comando di ripristino; c'erano circa 100 pacchetti coinvolti. Purtroppo il mio downgrade non è riuscito poiché molti pacchetti non sono più disponibili :(

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

Povero te. Sapevi che la cronologia dell'installazione è disponibile solo in/var/log/apt/history.log ?
— Lekensteyn,

dpkg.log ha le stesse informazioni ma include anche altre app oltre a apt.
— Sarà il

Quali altre app usano dpkgdirettamente allora? Synaptic è un front-end diapt-get .
— Lekensteyn,

l'utente può usare direttamente dpkg; l'utente può usare anche gdebi o qualche altro strumento. Ho dovuto scegliere un file da analizzare, quindi ho scelto il file corretto - dpkg.log. Succede che uso esclusivamente apt, ma stessa differenza.
— Sarà il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.