ppa paketlerini bir önceki zamanda kullanılabilen sürümlere düşürme


15

Arka plan, normal Intel GPU sürücülerinin hobi kodlamamın ve bazı oyunların istediği çeşitli OpenGL uzantılarını yapmamasıdır. Bu yüzden xorg-edgers'ı kurmalıyım ve sonra mutlu. Ancak, geçen Çarşamba ya da öylesine xorg-edgers için bir güncelleme vardı - bir sürü paket - ve kötü kırdı; sürücüler kilitlenir ve tüm bilgisayarı yanlarında götürür; donanım sıfırlaması gerekli.

Peki, geçmişte bir noktayı temsil eden ve bundan daha yeni sürümleri yok sayarak bir PPA'daki paket sürümlerini nasıl eski sürüme geçirebilirsiniz?

Yanıtlar:


18

Günlük çalışma için xorg-edgers ppa kullanmak oldukça kötü bir fikir olabilir.

Size en son sürücüleri verebilir, doğru, ama aynı zamanda çalışma sürücüleri alabilirsiniz.

Bir PPA'yı kaldırmak ve onun yerine değiştirilen paketleri düşürmek için (resmi depolarda bulunanlara geri dönerek), önce ppa-purge kurun:

sudo apt-get install ppa-purge

Ardından, resmi paketlere incelikle indirerek PPA'yı kaldırın:

sudo ppa-purge ppaname

Bu, paketlerinizi resmi paketlere geri indirmelidir.

PPA'da bulunan ancak resmi depolarda bulunmayan diğer paketler kaldırılmaz. Paket yöneticisine bunları kaldırmak için el ile söylemelisiniz, örneğin apt:

sudo apt-get purge packagename

Ppa'nın adını Ubuntu Ayarları'nın "Yazılım Kaynakları" bölümüne bakarak bulabilir ve paketlerinin listesini başlatma paneli sayfasında (veya kurulu ise Synaptic Paket Yöneticisi'nin "Kök" bölümüne bakarak) görebilirsiniz.


1
Dediğim gibi, normal sürücüler benim için çalışmıyor. Xorg-edger'lara ihtiyacım var. Sadece sürücülerimin en son sürümünü kullanmak istiyorum.
Will

xorg edgers ppa (ve çalışıyor) bir sonraki kullanışınızda on sadece
ppa'yı

2
sudo ppa-purge ppa:someppa/ppa
DmitrySandalov

benim durumumda her şeyi kaldırma
kimse

2

Bugün aynı sorunu yaşadım, ~ 2 hafta önce sistemime güncellemeler yüklediğimi ve hala yeni bir nvidia sürücüsüne sahip ubuntu-x-swat ppa'nın etkin olduğunu fark ettim. Eskisi iyiydi, yenisi sistemimi kırdı (sadece biraz, fark etmem biraz zaman aldı).

Bu yüzden kurduğum nvidia sürücü paketinin önceki sürüm numarasını bulmak için /var/log/apt/history.log dosyasına baktım ve paketi normalde / var / cache / apt / archives içinde bulmaya çalıştım. apt tarafından indirilen tüm paketleri bul, ama orada değildi. Ve daha yeni bir sürümün yerine geçtikten sonra ppa paketlerinin önceki sürümünü tutmuyor, bu yüzden de oradan alamadım.

Ancak, önceki paket sürümünden yenisine olan fark, tüm sürümler için ppa'da tutulur ve orijinal tarball ve debian yamalarıyla birlikte, yeni sürümün tüm değişikliklerini tersine çevirip önceki sürüm kaynaklarını almak mümkündür.

Gerekli adımları kısaca açıklayacağım:

  • Ppa'ya gidin, en yeni paket sürümünü bulun ve orijinal tarball ve (isteğe bağlı) debian yamaları indirin, benim durumumda bu sayfada bulundu:

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

    Orijinal tarball şu şekilde adlandırılır:

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

    Tarball'dan çıkarılabilir bir paket oluşturan debian yamaları:

    nvidia-graphics-drivers_290.10-0ubuntu1~lucid~xup1.diff.gz
    
  • Bunları tercihen yeni ve boş bir dizinde çıkarın, ardından yamaları kaynak ağacına uygulayın

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

    Yama yaparken reddedilen parçalar almamalısınız.

  • Aynı ppa sayfasında, "Kullanılabilir Farklar" sekmesi altında, önceki paket versiyonundan baktığınız versiyona bir fark bulacaksınız.

    Benim için:

    diff from 285.05.09-0ubuntu1~lucid~xup1 to 290.10-0ubuntu1~lucid~xup1
    
  • İndir, yamalı ve tersine yamalı orijinal kaynaklara uygula:

    ~/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! Şimdi önceki sürüm kaynak ağacının bir paket oluşturmaya hazır olması gerekir:

    ~/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
    
  • Hangi dpkg ile yüklenebilecek bir önceki sürüm paketini vermelisiniz:

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

0

Gelecekte, sinaptik kullanıyorsanız (X'e önyükleme yapabileceğinizi varsayarak), değiştirilecek paketi vurgulayıp menüden 'sürümü zorla'yı seçerek mevcut sürümler arasından seçim yapabilirsiniz. Oradan alt sürüme geçebilmeniz gerekir.


0

[Orijinal Poster]

Çok eğlenmiyorum, farkı hesaplamak ve restore komutunu yürütmek için bir komut dosyası yazdım; 100 kadar paket vardı. Ne yazık ki, pek çok paket artık kullanılamadığından eski sürüme geçme başarısız oldu :(

#!/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))

Yazık sana. Kurulum geçmişinin sadece mevcut olduğunu biliyor muydunuz /var/log/apt/history.log?
Lekensteyn

dpkg.log aynı bilgidir, ancak apt dışındaki diğer uygulamaları da içerir.
Will

Başka hangi uygulamalar dpkgdoğrudan kullanıyor ? Sinaptik bir ön uçtur apt-get.
Lekensteyn

kullanıcı doğrudan dpkg kullanabilir; kullanıcı bunun yerine gdebi veya başka bir araç da kullanabilir. Ayrıştırmak için bir dosya almak zorunda kaldım, bu yüzden uygun bir dosyayı seçtim - dpkg.log. Sadece uygun ama aynı farkı kullanıyorum.
Will
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.