Answers:
在日常工作中使用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软件包管理器的“来源”部分(如果已安装)中查看)。
sudo ppa-purge ppa:someppa/ppa
我今天遇到了同样的问题,大约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
[...]
[原始海报]
我玩得不太开心,所以编写了一个脚本来计算差异并执行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
吗?
dpkg
直接使用?突触是的前端apt-get
。