downgrade paket ppa ke versi yang tersedia pada titik waktu sebelumnya

14

Backstory adalah bahwa driver GPU Intel normal tidak melakukan berbagai ekstensi OpenGL yang diinginkan oleh hobi dan beberapa permainan. Jadi saya harus menginstal xorg-edgers dan kemudian senang. Namun, sekitar Rabu lalu ada pembaruan untuk xorg-edgers - banyak paket - dan itu rusak parah; driver mengunci dan membawa seluruh komputer; diperlukan hard reset.

Jadi bagaimana Anda bisa menurunkan versi - memilih versi paket dalam PPA yang mewakili titik di masa lalu, mengabaikan versi yang lebih baru dari itu?

Akan
sumber

Jawaban:

17

Menggunakan xorg-edgers ppa untuk pekerjaan sehari-hari bisa menjadi ide yang sangat buruk.

Ini mungkin memberi Anda driver terbaru, benar, tetapi Anda juga bisa mendapatkan driver tidak berfungsi.

Untuk menghapus PPA dan menurunkan versi paket yang digantikannya (jadi kembali ke yang tersedia di repositori resmi), instal terlebih dahulu ppa-purge:

sudo apt-get install ppa-purge

Dan kemudian menghapus PPA, menurunkan anggun ke paket resmi:

sudo ppa-purge ppaname

Ini harus menurunkan versi paket Anda kembali ke yang resmi.

Paket-paket lain yang berada di PPA tetapi tidak dalam repositori resmi tidak akan dihapus. Anda harus memberi tahu manajer paket secara manual untuk menghapusnya, misalnya menggunakan apt:

sudo apt-get purge packagename

Anda dapat menemukan nama ppa yang melihat bagian "Sumber Perangkat Lunak" dari Pengaturan Ubuntu, dan melihat daftar paket yang disediakannya di halaman launchpad-nya (atau melihat bagian "Asal" dari Synaptic Package Manager, jika diinstal).

xua
sumber
1
Seperti yang saya katakan, driver normal tidak bekerja untuk saya. Saya perlu xorg-edgers. Saya hanya ingin menghindari versi terbaru dari driver saya.
Akan
sepuluh kali berikutnya Anda menggunakan xorg edgers ppa (dan berfungsi) cukup nonaktifkan ppa dan tetap menggunakan versi paket tersebut
xangua
2
sudo ppa-purge ppa:someppa/ppa
DmitrySandalov
itu menghapus semua dalam kasus saya
noone
2

Saya memiliki masalah yang sama hari ini, saya perhatikan bahwa ~ 2 minggu yang lalu saya menginstal pembaruan ke sistem saya dan masih mengaktifkan ppa ubuntu-x-swat yang memiliki driver nvidia baru. Yang lama baik-baik saja, yang baru merusak sistem saya (hanya sedikit, butuh beberapa saat untuk menyadari).

Jadi saya mencari di /var/log/apt/history.log untuk menemukan nomor versi sebelumnya dari paket driver nvidia yang telah saya instal dan kemudian mencoba untuk menemukan paket di / var / cache / apt / arsip, di mana Anda biasanya akan temukan semua paket yang diunduh oleh apt, tetapi tidak ada di sana. Dan ppa tidak menyimpan versi sebelumnya dari paket-paketnya setelah mereka digantikan oleh versi yang lebih baru jadi saya tidak bisa mendapatkannya dari sana juga.

Namun, perbedaan dari versi paket sebelumnya ke yang lebih baru disimpan dalam ppa untuk semua versi, dan bersama dengan tarball asli dan tambalan debiannya, dimungkinkan untuk membalikkan semua perubahan dari versi yang lebih baru dan mendapatkan sumber versi sebelumnya.

Saya akan menjelaskan secara singkat langkah-langkah yang diperlukan:

  • Buka ppa, temukan versi paket terbaru dan unduh tarball asli dan tambalan debian (opsional), dalam kasus saya yang ditemukan di halaman itu:

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

    Tarball asli diberi nama:

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

    Patch debian yang membuat paket buildable dari tarball adalah:

    nvidia-graphics-drivers_290.10-0ubuntu1~lucid~xup1.diff.gz
    
  • Ekstrak mereka di suatu tempat lebih disukai di direktori baru dan kosong, lalu terapkan tambalan ke pohon sumber

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

    Anda seharusnya tidak mendapatkan potongan yang ditolak saat menambal.

  • Pada halaman ppa yang sama, Anda akan menemukan perbedaan dari versi paket sebelumnya dengan yang Anda lihat, di bawah bagian "Available Diffs".

    Bagi saya itu adalah:

    diff from 285.05.09-0ubuntu1~lucid~xup1 to 290.10-0ubuntu1~lucid~xup1
    
  • Unduh itu, ekstrak dan balikkan menerapkannya ke sumber asli yang ditambal:

    ~/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! Sekarang Anda harus sudah menyiapkan pohon sumber versi sebelumnya untuk membangun sebuah paket:

    ~/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
    
  • Yang seharusnya memberi Anda paket versi sebelumnya yang dapat diinstal dengan dpkg:

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

Di masa depan, jika Anda menggunakan sinaptik (dengan asumsi Anda dapat boot ke X), Anda dapat memilih dari versi yang tersedia dengan menyorot paket yang akan diubah dan kemudian memilih 'paksa versi' dari menu. Dari sana Anda harus bisa menurunkan versi.

rimez
sumber
0

[Poster Asli]

Tidak bersenang-senang, saya menulis skrip untuk menghitung perbedaan dan menjalankan perintah restore; ada sekitar 100 paket yang terlibat. Sayangnya downgrade saya gagal karena banyak paket tidak lagi tersedia :(

#!/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))
Akan
sumber
Kasihan kamu. Tahukah Anda bahwa riwayat pemasangan baru tersedia di /var/log/apt/history.log?
Lekensteyn
dpkg.log adalah info yang sama tetapi juga termasuk aplikasi lain selain apt.
Akan
Apa yang digunakan aplikasi lain dpkgsecara langsung? Synaptic adalah ujung depan dari apt-get.
Lekensteyn
pengguna dapat menggunakan dpkg secara langsung; pengguna juga dapat menggunakan gdebi atau alat lain. Saya harus memilih file untuk diuraikan, jadi saya memilih satu file yang tepat - dpkg.log. Itu terjadi saya menggunakan apt secara eksklusif, tetapi perbedaan yang sama.
Akan