obniż pakiety ppa na wersje dostępne w poprzednim momencie

15

Historia jest taka, że ​​normalne sterowniki GPU firmy Intel nie robią różnych rozszerzeń OpenGL, które wymagają mojego hobby i niektórych gier. Więc muszę zainstalować xorg-edgeri, a potem jest szczęśliwy. Jednak w ostatnią środę wprowadzono aktualizację xorg-edgerów - wiele pakietów - i bardzo się zepsuło; kierowcy blokują się i zabierają ze sobą cały komputer; wymagany twardy reset.

Jak więc obniżyć wersję - wybrać wersje pakietu w PPA, które stanowią punkt w przeszłości, ignorując nowsze wersje?

Wola
źródło

Odpowiedzi:

18

Używanie xorg-edgerów ppa do codziennej pracy może być dość złym pomysłem.

To prawda, że ​​daje najnowsze sterowniki, ale możesz także uzyskać niedziałające sterowniki.

Aby usunąć PPA i obniżyć liczbę zastąpionych przez niego pakietów (wracając do tych dostępnych w oficjalnych repozytoriach), najpierw zainstaluj ppa-purge:

sudo apt-get install ppa-purge

Następnie usuń PPA, z wdziękiem obniżając oficjalne pakiety:

sudo ppa-purge ppaname

To powinno obniżyć twoje pakiety z powrotem do oficjalnych.

Inne pakiety, które były w PPA, ale nie w oficjalnych repozytoriach, nie zostaną odinstalowane. Powinieneś ręcznie powiedzieć menadżerowi pakietów, aby je usunął, na przykład używając apt:

sudo apt-get purge packagename

Możesz znaleźć nazwę ppa patrząc na sekcję „Źródła oprogramowania” w Ustawieniach Ubuntu i zobaczyć listę pakietów, które ona udostępnia na stronie startera (lub patrząc na sekcję „Pochodzenie” Synaptic Package Manager, jeśli jest zainstalowany).

Xangua
źródło
1
Jak powiedziałem, normalne sterowniki nie działają dla mnie. Potrzebuję Xorg-Edgerów. Chcę tylko ominąć najnowszą wersję moich sterowników.
Czy
dziesięć następnym razem, gdy użyjesz xorg edgerów ppa (i działa), po prostu wyłącz ppa i trzymaj się tych wersji pakietów
xangua
2
sudo ppa-purge ppa:someppa/ppa
Dmitrij Sandałow
usuwa wszystko w moim przypadku
nikt
2

Miałem dzisiaj ten sam problem, zauważyłem, że ~ 2 tygodnie temu zainstalowałem aktualizacje mojego systemu i nadal miałem włączoną ppa Ubuntu-X-SWAT, która miała nowy sterownik NVIDIA. Stary był w porządku, nowy zepsuł mój system (tylko nieznacznie, zajęło mi to trochę czasu).

Poszukałem w /var/log/apt/history.log, aby znaleźć poprzedni numer wersji pakietu sterowników nvidia, który zainstalowałem, a następnie próbowałem znaleźć pakiet w / var / cache / apt / archives, gdzie normalnie znajdź wszystkie pakiety pobrane przez apt, ale go tam nie było. I ppa nie utrzymuje poprzedniej wersji swoich pakietów, gdy zostaną one zastąpione nowszą wersją, więc nie mogłem ich stamtąd pobrać.

Ale różnica z poprzedniej wersji pakietu do nowszej jest przechowywana w ppa dla wszystkich wersji, a wraz z oryginalnym plikiem tarball i jego łatkami debianowymi możliwe jest cofnięcie wszystkich zmian w nowszej wersji i pobranie źródeł poprzedniej wersji.

Pokrótce opiszę niezbędne kroki:

  • Idź do ppa, znajdź najnowszą wersję pakietu i pobierz oryginalne tarball i (opcjonalne) łatki debian, w moim przypadku te zostały znalezione na tej stronie:

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

    Oryginalny plik tarball ma nazwę:

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

    Łatki debian, które tworzą pakiet do zbudowania z tarballa, to:

    nvidia-graphics-drivers_290.10-0ubuntu1~lucid~xup1.diff.gz
    
  • Wyodrębnij je gdzieś najlepiej w nowym i pustym katalogu, a następnie zastosuj łaty do drzewa źródłowego

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

    Nie powinieneś otrzymywać żadnych odrzuconych fragmentów podczas łatania.

  • Na tej samej stronie ppa znajdziesz różnicę od poprzedniej wersji pakietu do tej, na którą patrzysz, w sekcji „Dostępne różnice”.

    Dla mnie było to:

    diff from 285.05.09-0ubuntu1~lucid~xup1 to 290.10-0ubuntu1~lucid~xup1
    
  • Pobierz, rozpakuj i zastosuj wstecz do poprawionych oryginalnych źródeł:

    ~/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! Teraz powinieneś mieć drzewo źródeł poprzedniej wersji gotowe do zbudowania pakietu:

    ~/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
    
  • Który powinien dać ci poprzedni pakiet wersji, który można zainstalować za pomocą dpkg:

     ~/n/nvidia-settings-285.05.09> cd ..
     ~/nvidia> sudo dpkg -i nvidia-current_285.05.09-0ubuntu1\~lucid\~xup1_amd64.deb
     [...]
    
rakete
źródło
0

W przyszłości, jeśli używasz synaptic (zakładając, że możesz uruchomić system w X), możesz wybrać jedną z dostępnych wersji, podświetlając pakiet, który chcesz zmienić, a następnie wybierając z menu opcję „wymuś wersję”. Stamtąd powinieneś być w stanie obniżyć wersję.

rimez
źródło
0

[Oryginalny plakat]

Nie mając dużo zabawy, napisałem skrypt, aby obliczyć różnicę i wykonać polecenie restore; w grę wchodziło około 100 pakietów. Niestety moje obniżenie wersji nie powiodło się, ponieważ wiele pakietów nie jest już dostępnych :(

#!/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))
Wola
źródło
Biedny. Czy wiesz, że historia instalacji jest właśnie dostępna /var/log/apt/history.log?
Lekensteyn
dpkg.log to te same informacje, ale także inne aplikacje niż apt.
Czy
Jakie inne aplikacje używają dpkgwtedy bezpośrednio? Synaptic to interfejs apt-get.
Lekensteyn
użytkownik może bezpośrednio korzystać z dpkg; użytkownik może zamiast tego użyć gdebi lub innego narzędzia. Musiałem wybrać plik do analizy, więc wybrałem jeden właściwy plik - dpkg.log. Zdarza się, że używam wyłącznie apt, ale z tą samą różnicą.
Będzie