将ppa软件包降级到先前时间点可用的版本


14

背景是普通的Intel GPU驱动程序不执行我的业余爱好编码和某些游戏所需的各种OpenGL扩展。因此,我必须安装xorg-edgers,然后才能满意。但是,上个星期三左右,对xorg-edgers进行了更新-很多软件包-严重损坏。驱动程序将锁定并带走整个计算机;需要硬重置。

那么,如何降级-在PPA中选择代表过去某个点的软件包版本,而忽略更新的版本呢?

Answers:


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

您可以在Ubuntu设置的“软件源”部分找到ppa的名称,并在启动板页面上查看其提供的软件包列表(或在Synaptic软件包管理器的“来源”部分(如果已安装)中查看)。


1
正如我所说,普通的司机对我不起作用。我需要xorg-edgers。我只想回避最新版本的驱动程序。
威尔

十,下次您使用xorg edgers ppa(并且可以工作)时,只需禁用ppa并坚持使用这些软件包版本
xangua 2011年

2
sudo ppa-purge ppa:someppa/ppa
DmitrySandalov 2014年

它去除我的情况everyting
没有人

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
    

    原始的tarball名为:

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

    从tarball制作可构建软件包的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

[原始海报]

我玩得不太开心,所以编写了一个脚本来计算差异并执行restore命令。大约涉及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吗?
Lekensteyn 2011年

dpkg.log是相同的信息,但还包括除apt之外的其他应用程序。
威尔

那么,还有哪些其他应用dpkg直接使用?突触是的前端apt-get
Lekensteyn 2011年

用户可以直接使用dpkg;用户也可以改用gdebi或其他工具。我必须选择一个要分析的文件,所以我选择了一个正确的文件dpkg.log。碰巧我只使用apt,但有相同的区别。
威尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.