web-dev-qa-db-ja.com

ppaパッケージを以前の時点で利用可能なバージョンにダウングレードします

裏話として、通常のIntel GPUドライバーは、趣味のコーディングや一部のゲームで必要なさまざまなOpenGL拡張機能を実行しません。そのため、xorg-edgersをインストールする必要があります。しかし、先週の水曜日かそこらで、xorg-edgersの更新(多くのパッケージ)があり、ひどく壊れました。ドライバーはロックアップし、コンピューター全体を持ち込みます。ハードリセットが必要です。

では、どのようにダウングレードできますか?PPAで過去のポイントを表すパッケージバージョンを選択し、それより新しいバージョンを無視しますか?

14
Will

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」セクションを見る(インストールされている場合))。

17
xangua

今日も同じ問題がありました。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
     [...]
    
2
rakete

将来的に、シナプスを使用している場合(Xで起動できると仮定)、変更するパッケージを強調表示し、メニューから「バージョンを強制する」を選択して、利用可能なバージョンから選択できます。そこからダウングレードできるはずです。

0
rimez

[オリジナルポスター]

あまり面白くないので、違いを計算して復元コマンドを実行するスクリプトを書きました。約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))
0
Will