裏話として、通常のIntel GPUドライバーは、趣味のコーディングや一部のゲームで必要なさまざまなOpenGL拡張機能を実行しません。そのため、xorg-edgersをインストールする必要があります。しかし、先週の水曜日かそこらで、xorg-edgersの更新(多くのパッケージ)があり、ひどく壊れました。ドライバーはロックアップし、コンピューター全体を持ち込みます。ハードリセットが必要です。
では、どのようにダウングレードできますか?PPAで過去のポイントを表すパッケージバージョンを選択し、それより新しいバージョンを無視しますか?
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」セクションを見る(インストールされている場合))。
今日も同じ問題がありました。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
[...]
将来的に、シナプスを使用している場合(Xで起動できると仮定)、変更するパッケージを強調表示し、メニューから「バージョンを強制する」を選択して、利用可能なバージョンから選択できます。そこからダウングレードできるはずです。
[オリジナルポスター]
あまり面白くないので、違いを計算して復元コマンドを実行するスクリプトを書きました。約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))