desabilitar pacotes ppa para versões disponíveis em um ponto anterior no tempo

14

A história de fundo é que os drivers normais da Intel GPU não fazem as várias extensões OpenGL que meu hobby codifica e alguns jogos querem. Então eu tenho que instalar o xorg-edgers e depois é feliz. No entanto, na última quarta-feira houve uma atualização para o xorg-edgers - muitos pacotes - e ele quebrou muito; os motoristas prendem e levam o computador inteiro com eles; necessidade de reinicialização forçada.

Então, como você pode fazer downgrade - selecione versões de pacotes em um PPA que representam um ponto no passado, ignorando versões mais recentes que isso?

    
por Will 27.06.2011 / 20:17

4 respostas

16

Usar o ppa xorg-edgers para o trabalho diário pode ser uma péssima ideia.

Pode lhe dar drivers mais recentes, é verdade, mas você também pode obter drivers que não funcionam.

Para remover um PPA e fazer o downgrade dos pacotes substituídos por ele (então, voltando aos disponíveis nos repositórios oficiais), primeiro instale o ppa-purge:

sudo apt-get install ppa-purge

E, em seguida, remova o PPA, fazendo o downgrade dos pacotes oficiais:

sudo ppa-purge ppaname

Isso deve fazer o downgrade de seus pacotes para os oficiais.

Outros pacotes que estavam no PPA, mas não nos repositórios oficiais, não serão desinstalados. Você deve informar manualmente ao gerenciador de pacotes para removê-los, por exemplo, usando o apt:

sudo apt-get purge packagename

Você pode encontrar o nome do ppa olhando a seção "Software Sources" do Ubuntu Settings, e ver uma lista de pacotes que ele fornece em sua página de inicialização (ou olhando a seção "Origin" do Synaptic Package Manager, se instalado).

    
por xangua 27.06.2011 / 21:30
2

Eu tive o mesmo problema hoje, notei que ~ 2 semanas atrás eu instalei atualizações para o meu sistema e ainda tinha o ubuntu-x-swat ppa ativado que tinha um novo driver nvidia. O antigo estava bom, o novo quebrou meu sistema (só um pouquinho, demorei um pouco para perceber).

Então eu olhei em /var/log/apt/history.log para encontrar o número da versão anterior do pacote de driver nvidia que eu tinha instalado e tentei encontrar o pacote em / var / cache / apt / archives, onde você Normalmente, você encontrará todos os pacotes baixados pelo apt, mas ele não estava lá. E o ppa não mantém a versão anterior de seus pacotes, uma vez que eles são substituídos por uma versão mais nova, então eu não consegui de lá também.

Mas, o diff da versão do pacote anterior para o mais recente é mantido no ppa para todas as versões, e junto com o tarball original e seus patches debian é possível reverter todas as alterações da versão mais recente e obter a versão anterior fontes.

Vou descrever brevemente as etapas necessárias:

  • Vá para o ppa, encontre a versão do pacote mais recente e faça o download do tarball original e dos patches do Debian (opcional), no meu caso, os que foram encontrados nessa página:

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

    O tarball original é chamado:

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

    Os patches do Debian que fazem um pacote compilável fora do tarball são:

    nvidia-graphics-drivers_290.10-0ubuntu1~lucid~xup1.diff.gz
    
  • Extraia aqueles em algum lugar de preferência em um diretório novo e vazio, depois aplique os patches na árvore de origem

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

    Você não deve receber fragmentos rejeitados ao fazer o patch.

  • Na mesma página do ppa você encontrará um diff da versão anterior do pacote para o que você está vendo, sob a seção "Available Diffs".

    Para mim, isso foi:

    diff from 285.05.09-0ubuntu1~lucid~xup1 to 290.10-0ubuntu1~lucid~xup1
    
  • Faça o download, extraia e aplique o contrário nas fontes originais corrigidas:

    ~/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! Agora você deve ter a árvore de fontes da versão anterior pronta para criar um pacote:

    ~/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
    
  • Qual deve dar a você o pacote da versão anterior que pode ser instalado com o dpkg:

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

No futuro, se você estiver usando synaptic (supondo que você pode inicializar no X), você pode selecionar a partir das versões disponíveis, destacando o pacote a ser alterado e, em seguida, selecionando 'force version' no menu. De lá você deve ser capaz de fazer o downgrade.

    
por rimez 27.06.2011 / 21:52
0

[Poster original]

Não tendo muita diversão, eu escrevi um script para calcular a diferença e executar o comando restore; havia cerca de 100 pacotes envolvidos. Infelizmente, meu downgrade falhou porque muitos pacotes não estão mais disponíveis: (

#!/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))
    
por Will 27.06.2011 / 22:10