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.