faça o downgrade dos pacotes ppa para versões disponíveis em um momento anterior

14

A história de fundo é que os drivers normais da GPU Intel não executam as várias extensões OpenGL que meu código de hobby e alguns jogos desejam. Então eu tenho que instalar o xorg-edgers e então fica feliz. No entanto, na última quarta-feira, houve uma atualização para o xorg-edgers - muitos pacotes - e ele quebrou muito; os drivers travam e levam o computador inteiro com eles; reinicialização total necessária.

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

Vai
fonte

Respostas:

17

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

Pode fornecer drivers mais recentes, é verdade, mas você também pode obter drivers que não estão funcionando.

Para remover um PPA e fazer o downgrade dos pacotes substituídos por ele (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 normalmente para 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 o gerenciador de pacotes para removê-los, por exemplo, usando o apt:

sudo apt-get purge packagename

Você pode encontrar o nome do ppa na seção "Fontes de software" das Configurações do Ubuntu e ver uma lista de pacotes que ele fornece na página da barra de ativação (ou na seção "Origem" do Synaptic Package Manager, se instalado).

xangua
fonte
1
Como eu disse, os drivers normais não funcionam para mim. Eu preciso de xorg-edgers. Eu só quero evitar a versão mais recente dos meus drivers.
Will
dez a próxima vez que você usar xorg edgers ppa (e obras) apenas desabilitar o ppa e ficar com essas versões de pacotes
xangua
2
sudo ppa-purge ppa:someppa/ppa
DmitrySandalov
que a remoção everyting no meu caso
ninguém
2

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

Então, procurei em /var/log/apt/history.log para encontrar o número da versão anterior do pacote de drivers da nvidia que eu havia instalado e tentei encontrar o pacote em / var / cache / apt / archives, onde você normalmente encontre 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 por aí quando são substituídos por uma versão mais recente, então eu também não consegui obtê-lo a partir daí.

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

Descreverei brevemente as etapas necessárias:

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

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

    O tarball original é nomeado:

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

    Os patches debian que compõem um pacote compilável do tarball são:

    nvidia-graphics-drivers_290.10-0ubuntu1~lucid~xup1.diff.gz
    
  • Extraia-os em algum lugar de preferência em um diretório novo e vazio e 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 nenhum pedaço rejeitado ao aplicar o patch.

  • Na mesma página do ppa, você encontrará um diff da versão anterior do pacote para a que está visualizando, na seção "Diffs disponíveis".

    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 inversamente às 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 origem 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
    
  • O que deve fornecer 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
     [...]
    
rakete
fonte
0

No futuro, se você estiver usando o synaptic (assumindo que pode inicializar no X), poderá selecionar entre as versões disponíveis, destacando o pacote a ser alterado e, em seguida, selecionando 'forçar versão' no menu. A partir daí, você poderá fazer o downgrade.

rimez
fonte
0

[Pôster original]

Não me divertindo muito, escrevi um script para calcular a diferença e executar o comando restore; havia cerca de 100 pacotes envolvidos. Infelizmente, meu downgrade falhou, pois 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))
Vai
fonte
Pobre voce. Você sabia que o histórico de instalação está disponível apenas /var/log/apt/history.log?
Lekensteyn
O dpkg.log é a mesma informação, mas também inclui outros aplicativos que não o apt.
Will
Quais outros aplicativos usam dpkgdiretamente então? Synaptic é um front-end de apt-get.
Lekensteyn
o usuário pode usar o dpkg diretamente; o usuário pode usar o gdebi ou alguma outra ferramenta também. Eu tive que escolher um arquivo para analisar, então escolhi o arquivo adequado - dpkg.log. Acontece que eu uso o apt exclusivamente, mas a mesma diferença.
Will