degradar paquetes de ppa a versiones disponibles en un momento anterior

14

La historia de fondo es que los controladores normales de GPU Intel no hacen las diversas extensiones de OpenGL que mi codificación de hobby y algunos juegos quieren. Así que tengo que instalar xorg-edgers y luego es feliz. Sin embargo, el miércoles pasado hubo una actualización de xorg-edgers, muchos paquetes, y se rompió gravemente; los conductores se bloquean y se llevan toda la computadora con ellos; Se requiere restablecimiento completo.

Entonces, ¿cómo puede degradar: seleccione versiones de paquetes en un PPA que representen un punto en el pasado, ignorando las versiones más nuevas que eso?

Será
fuente

Respuestas:

17

Usar xorg-edgers ppa para el trabajo diario podría ser una muy mala idea.

Puede proporcionarle los controladores más recientes, es cierto, pero también puede obtener controladores que no funcionan.

Para eliminar un PPA y degradar los paquetes reemplazados por él (volviendo a los disponibles en los repositorios oficiales), primero instale ppa-purge:

sudo apt-get install ppa-purge

Y luego elimine el PPA, bajando con gracia a los paquetes oficiales:

sudo ppa-purge ppaname

Esto debería degradar sus paquetes a los oficiales.

No se desinstalarán otros paquetes que estaban en PPA pero no en repositorios oficiales. Debe decirle manualmente al administrador de paquetes que los elimine, por ejemplo, usando apt:

sudo apt-get purge packagename

Puede encontrar el nombre del ppa en la sección "Fuentes de software" de la Configuración de Ubuntu y ver una lista de paquetes que proporciona en su página de launchpad (o mirando la sección "Origen" de Synaptic Package Manager, si está instalado).

xangua
fuente
1
Como dije, los controladores normales no funcionan para mí. Necesito xorg-edgers. Solo quiero eludir la última versión de mis controladores.
Será
diez la próxima vez que use xorg edgers ppa (y funciona) simplemente desactive el ppa y
quédese
2
sudo ppa-purge ppa:someppa/ppa
DmitrySandalov
eliminando todo en mi caso
nadie el
2

Tuve el mismo problema hoy, noté que hace unas 2 semanas instalé actualizaciones en mi sistema y todavía tenía habilitado ubuntu-x-swat ppa que tenía un nuevo controlador nvidia. El viejo estaba bien, el nuevo rompió mi sistema (solo un poco, me tomó un tiempo notarlo).

Así que busqué en /var/log/apt/history.log para encontrar el número de versión anterior del paquete del controlador nvidia que había instalado y luego intenté encontrar el paquete en / var / cache / apt / archives, donde normalmente encuentra todos los paquetes descargados por apt, pero no estaba allí. Y el ppa no mantiene la versión anterior de sus paquetes una vez que son reemplazados por una versión más nueva, por lo que tampoco pude obtenerlo desde allí.

Pero, la diferencia de la versión del paquete anterior a la más reciente se mantiene en el ppa para todas las versiones, y junto con el tarball original y sus parches de Debian es posible revertir todos los cambios de la versión más nueva y obtener las fuentes de la versión anterior.

Describiré brevemente los pasos necesarios:

  • Vaya a la ppa, busque la versión más reciente del paquete y descargue el tarball original y los parches debian (opcionales), en mi caso, se encontraron en esa página:

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

    El tarball original se llama:

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

    Los parches de Debian que hacen un paquete construible del tarball son:

    nvidia-graphics-drivers_290.10-0ubuntu1~lucid~xup1.diff.gz
    
  • Extraiga esos en algún lugar preferiblemente en un directorio nuevo y vacío, luego aplique los parches al árbol de origen

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

    No debería obtener ningún fragmento rechazado al parchear.

  • En la misma página de ppa, encontrará una diferencia de la versión del paquete anterior a la que está viendo, en la sección "Diferencias disponibles".

    Para mí eso fue:

    diff from 285.05.09-0ubuntu1~lucid~xup1 to 290.10-0ubuntu1~lucid~xup1
    
  • Descargue eso, extráigalo y aplíquelo a las fuentes originales parcheadas:

    ~/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! Ahora debería tener el árbol de origen de la versión anterior listo para construir un paquete:

    ~/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
    
  • Lo que debería darle un paquete de la versión anterior que se puede instalar con dpkg:

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

En el futuro, si está utilizando Synaptic (suponiendo que puede iniciar en X) puede seleccionar entre las versiones disponibles resaltando el paquete que se va a cambiar y luego seleccionando 'forzar versión' en el menú. A partir de ahí, deberías poder degradar.

rimez
fuente
0

[Poster original]

Sin divertirme mucho, escribí un script para calcular la diferencia y ejecutar el comando de restauración; Había alrededor de 100 paquetes involucrados. Lamentablemente, mi downgrade falló ya que muchos paquetes ya no están 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))
Será
fuente
Pobrecito. ¿Sabía que el historial de instalación solo está disponible /var/log/apt/history.log?
Lekensteyn
dpkg.log es la misma información pero también incluye otras aplicaciones que no sean apt.
Será
¿Qué otras aplicaciones usan dpkgdirectamente entonces? Synaptic es un front-end de apt-get.
Lekensteyn
el usuario puede usar dpkg directamente; el usuario puede usar gdebi o alguna otra herramienta también. Tuve que elegir un archivo para analizar, así que elegí el archivo adecuado: dpkg.log. Sucede que uso apt exclusivamente, pero la misma diferencia.
Será el