понизить пакеты ppa до версий, доступных в предыдущий момент времени


14

Предыстория заключается в том, что обычные драйверы Intel GPU не поддерживают различные расширения OpenGL, которые нужны моему хобби и некоторым играм. Поэтому я должен установить xorg-edgers, и тогда он будет счастлив. Однако в прошлую среду или около того появилось обновление для xorg-edgers - множество пакетов - и оно сломалось плохо; водители блокируются и забирают с собой весь компьютер; требуется полный сброс.

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

Ответы:


17

Использование 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 для всех версий, и вместе с исходным архивом tarball и его исправлениями Debian можно отменить все изменения более новой версии и получить исходные коды предыдущей версии.

Я кратко опишу необходимые шаги:

  • Перейдите к ppa, найдите новейшую версию пакета и загрузите оригинальный tarball и (необязательные) патчи 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
    [...]
    
  • Presto! Теперь у вас должно быть дерево исходного кода предыдущей версии, готовое для сборки пакета:

    ~/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

В будущем, если вы используете synaptic (при условии, что вы можете загрузиться в 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 напрямую; пользователь также может использовать gdebi или другой инструмент. Мне пришлось выбрать файл для анализа, поэтому я выбрал один правильный файл - dpkg.log. Бывает, я использую исключительно apt, но та же разница.
Будет
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.