пониження пакетів ppa до версій, доступних у попередній момент часу


15

Історія полягає в тому, що звичайні драйвери графічного процесора Intel не роблять різних розширень OpenGL, які хоче моє хобі та деякі ігри. Тож я маю встановити xorg-edgers і тоді його задоволено. Однак минулої середи або близько того було оновлення до xorg-edgers - багато пакетів - і воно погано вийшло; водії замикаються та беруть із собою весь комп’ютер; потрібен жорсткий скидання.

Тож як ви можете знизити версію - виберіть версії пакету в PPA, які представляють собою точку в минулому, ігноруючи новіші версії?

Відповіді:


18

Використання xorg-edgers ppa для щоденної роботи може бути досить поганою ідеєю.

Можливо, це дає вам останні драйвери, правда, але ви також можете отримати непрацюючі драйвери.

Щоб видалити PPA та зменшити оновлені пакети (таким чином повертаючись до тих, які є в офіційних сховищах), спочатку встановіть ppa-purge:

sudo apt-get install ppa-purge

А потім видаліть PPA, миттєво повернувшись до офіційних пакетів:

sudo ppa-purge ppaname

Це повинно повернути ваші пакети до офіційних.

Інші пакети, які були в PPA, але не були в офіційних сховищах, не будуть видалені. Ви повинні вручну сказати менеджеру пакунків, щоб видалити їх, наприклад, використовуючи apt:

sudo apt-get purge packagename

Ви можете знайти ім'я ppa, переглянувши розділ «Джерела програмного забезпечення» у Налаштуваннях Ubuntu, а на його сторінці запуску переглянути список пакетів, які він надає (або переглянувши розділ «Походження» Synaptic Package Manager, якщо він встановлений).


1
Як я вже говорив, нормальні водії не працюють на мене. Мені потрібні xorg-edgers. Я просто хочу обійти сторону найновішої версії своїх драйверів.
Буде

десять наступного разу, коли ви будете використовувати xorg edgers ppa (і працює), просто вимкніть ppa та дотримуйтесь цих версій пакета
xangua

2
sudo ppa-purge ppa:someppa/ppa
Дмитро Сандалов

це видалення кожного в моєму випадку
ніхто

2

У мене була така ж проблема і сьогодні, я помітив, що ~ 2 тижні тому я встановив оновлення в моїй системі і все ще ввімкнув ubuntu-x-swat ppa, який мав новий драйвер nvidia. Стара була в порядку, нова зламала мою систему (лише трохи, мені знадобилося деякий час).

Тому я заглянув у /var/log/apt/history.log, щоб знайти номер попередньої версії встановленого мені пакета драйверів nvidia, а потім спробував знайти пакунок у / var / cache / apt / archives, де зазвичай знайти всі пакунки, завантажені apt, але його там не було. І ppa не підтримує попередню версію своїх пакетів, коли їх замінюють новішою версією, тому я не можу отримати її і звідти.

Але різниця від попередньої версії пакета до нової зберігається в ppa для всіх версій, і разом з оригінальним тарболом та його патчами debian можна змінити всі зміни нової версії та отримати джерела попередньої версії.

Я коротко опишу необхідні кроки:

  • Перейдіть до ppa, знайдіть найновішу версію пакета та скачайте оригінальний тарбол та (необов’язково) патчі debian, у моєму випадку вони були знайдені на цій сторінці:

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

    Оригінальний тарбол названий:

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

    Патчі Debian, які роблять збірний пакет із тарболу:

    nvidia-graphics-drivers_290.10-0ubuntu1~lucid~xup1.diff.gz
    
  • Витягніть їх десь переважно у новому та порожньому каталозі, а потім застосуйте патчі до вихідного дерева

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

    Ви не повинні отримувати жодних відхилених шматочків під час виправлення.

  • На цій же сторінці ppa ви знайдете відмінність від попередньої версії пакета до тієї, яку ви шукаєте, у секторі "Доступні відмінності".

    Для мене це було:

    diff from 285.05.09-0ubuntu1~lucid~xup1 to 290.10-0ubuntu1~lucid~xup1
    
  • Завантажте це, витягніть та оберніть реверс, застосуйте його до виправлених вихідних джерел:

    ~/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
    [...]
    
  • Престо! Тепер ви повинні мати готове дерево попередньої версії, щоб створити пакет:

    ~/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
    
  • Який повинен дати вам попередній пакет версій, який можна встановити за допомогою dpkg:

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

0

Надалі, якщо ви використовуєте синаптичний (припускаючи, що ви можете завантажуватися в X), ви можете вибрати з доступних версій, виділивши пакунок, який потрібно змінити, а потім виберіть у меню "форсовану версію". Звідти ви маєте змогу знизитись до рівня.


0

[Оригінальний плакат]

Не веселячись, я написав сценарій для обчислення різниці та виконання команди відновлення; було залучено близько 100 пакетів. На жаль, помилка мого поновлення не вдалася, оскільки багато пакунків більше не доступні :(

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

Бідні ви. Чи знаєте ви, що історія встановлення доступна лише в /var/log/apt/history.log?
Лекенштейн

dpkg.log - це та сама інформація, але також включає інші додатки, ніж apt.
Буде

Які інші додатки dpkgпотім використовують безпосередньо? Синаптик - це передня частина apt-get.
Лекенштейн

користувач може використовувати dpkg безпосередньо; Користувач також може використовувати замість нього. Мені довелося вибрати файл для розбору, тому я вибрав один власний файл - dpkg.log. Буває, я використовую виключно підхожі, але однакова різниця.
Буде
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.