回答:
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 Settingsの「Software Sources」セクションを見ると、ppaの名前を見つけることができ、ランチパッドページで提供されるパッケージのリストを見ることができます(または、Synaptic Package Managerの「Origin」セクションを見る(インストールされている場合))。
sudo ppa-purge ppa:someppa/ppa
今日も同じ問題がありました。2週間前にシステムにアップデートをインストールし、新しいnvidiaドライバーを備えたubuntu-x-swat ppaが有効になっていることに気付きました。古いものは大丈夫でしたが、新しいものは私のシステムを壊しました(ほんの少し、気づくまでに少し時間がかかりました)。
そこで、/ 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
[...]
[オリジナルポスター]
あまり面白くないので、違いを計算して復元コマンドを実行するスクリプトを書きました。約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
直接使用しますか?Synapticはのフロントエンドですapt-get
。