# Downgrading Packages (日本語)

関連記事

- Arch Build System
- pacman
- Arch Rollback Machine

ここではパッケージを前のバージョンにダウングレードする方法を記述します。パッケージのダウングレードは普段は推奨されていませんが、最新パッケージにバグがあるときに必要になります。

ダウングレードする前に、なぜそうするのか考えて下さい。バグが理由ならば、Arch やそのプログラムの開発者にバグトラッカーでバグを報告するのに少し時間をさくことを考えていただけるでしょうか。Arch はローリングリリースなので、新しいパッケージにひそんだバグに出くわす可能性がいつでもあります。

私達やアップストリームの開発者は利用者からの報告にいつも感謝しています。ほんのすこしの情報でも、テストやデバッグに必要な時間を少なくし、ソフトウェアを安定させるのに役だっているのです。

## 理由

ダウングレードするということは現在のパッケージをアンインストールして前のバージョンをインストールすることです。その前のバージョンというのが一つ前のバージョン（パッケージのバージョンは一つ前です）なのか、かなり前のバージョンなのかは分かりません。

ダウングレードする理由で（数ある中でも）挙げられるのは: 現在のバージョンにバグがある・期待どおりに働かない・実験的な理由で、などです。ほとんどの場合、新しいバージョンのリリースを待つより前のバージョンに戻したほうが問題が少ないと判断されます。

あるパッケージのダウングレードをすると、他のパッケージのダウングレードの必要が生じることもあります。実験的なパッケージを大量にインストールしたり、設定をいじくりまわした人にとっては、ダウングレードを試みるよりもシステムの再インストールをしたほうが好ましいかもしれません。

## 詳細

しかし、ユーザーは次のことを心に留めるべきです:

- プログラムの依存性を考えて下さい。必要なライブラリのバージョンが変わるのがしょっちゅうで、挙動が以前と全く異なるようなとき、解決法は旧バージョンに変えることでしょう。
- ファイルが削除された後ファイルが他のソースから入手できるかどうか考えて下さい。Arch Linux はローリングリリースであり、レポジトリは自動的にアップデートされ古いバージョンは保存されません。この問題については後に詳しく書きます。
- 設定ファイルやスクリプトの変更に気をつけて下さい。今現在、pacman にはセーフガードがあり、それをバイパスしない限り、pacman がそれらを管理しています。

Arch Rollback Machine のコンセプトが完成して pacman に寄与されることが待たれています。そうすれば、ダウングレードは自動化されるでしょう。

## パッケージをダウングレードする方法

### 公式パッケージ

- Q: `pacman -Syu` をしたら XYZ パッケージがバージョンMからバージョンNにアップグレードされました。私の環境ではこのパッケージは問題があります、どうやったらバージョン N からバージョン M へダウングレードできますか？
- A: `/var/cache/pacman/pkg` ディレクトリの中にもし古いバージョンのパッケージが保存されていた場合、簡単にダウングレードすることができます。（つい最近に `pacman -Scc` をしたりしていない限り存在しているはずです）。`pacman -U /var/cache/pacman/pkg/pkgname-olderpkgver.pkg.tar.gz` でその指定したバージョンのパッケージをインストールできます。

この方法では現在のパッケージを削除するので、慎重に依存性の変更を計算してください。そして依存性を破壊しないように古いバージョンをインストールします。

Note: OS の基幹的な部分を変えるときは、文字通り数ダースものパッケージを古いバージョンに取り替える必要があるかもしれません。もしくはパッケージがどこかに行ってしまって、望ましくないパッケージバージョンに立ち返ってしまうことのないように特定のアップグレードには注意しながら、手動で一つずつ全部を戻すはめになるかもしれません。

また AUR に downgrade というパッケージもあります。シンプルな Bash スクリプトで、キャッシュから古いバージョンのパッケージを探してくれます。キャッシュにないときは A.R.M. の検索も行います。あなたはインストールするパッケージを選ぶことができます。簡単に言えば、この記事に書かれていることを自動化してくれます。使用方法は `downgrade --help` をチェックして下さい。

より強力なツールに downgrader があります。これは pacman のログとして働くだけでなく、ARM やローカルキャッシュからパッケージをダウングレードしたり、パッケージのリストを回覧するのに使えます。（パッケージのアップグレードのあと、パッケージの名前がわからないとき便利です）。

### カーネルのダウングレード

カーネルアップデートの後に起動できなくなった場合、livecd を使ってカーネルをダウングレードできます。なるべく最新の Arch Linux のインストールメディアを使って下さい。ブートしたら、システムのパーティションをマウント（たとえば /mnt に）し、もしパーティションが分割されていて /boot や /var があるならそれらもマウントしてください (`mount /dev/sdc3 /mnt/boot`)。そして proc などをマウントします。

    mount -t proc proc /mnt/proc
    mount -t sysfs sys /mnt/sys
    mount -o bind /dev /mnt/dev

次に chroot を使います。`chroot /mnt /bin/bash`。それから /var/cache/pacman/pkg まで行き、パッケージをダウングレードします。少なくとも linux と linux-headers そしてカーネルモジュールをダウングレードしてください。 例えば、

    pacman -U linux-3.5.6-1-x86_64.pkg.tar.xz linux-headers-3.5.6-1-x86_64.pkg.tar.xz virtualbox-host-modules-4.2.0-5-x86_64.pkg.tar.xz

chroot を終了し、再起動すれば完了です。

もし特殊なセットアップ (lvm, encryption, ...) をしていたのなら、次の記事を参照してください: http://sch1zo.github.com/blog/2012/05/08/downgrading-a-bad-kernel-on-arch-with-luks-and-lvm/

### AUR パッケージ

AUR のパッケージは、http://pkgbuild.com/git/aur-mirror.git/ にある古い PKGBUILD を取得するか、Unofficial user repositories でコンパイル済みのバイナリ（ときどき古いものが残っています）を探すのが唯一の方法です。AUR-mirror を使いたい場合は、以下の手順に従って下さい:

1. http://pkgbuild.com/git/aur-mirror.git/log/PACKAGENAME に行く。
2. 特定の commit もしくは日付をクリック。
3. その commit の AUR スナップショット (aur-mirror-COMMIT.tar.xz) をダウンロード (~100MB)。
4. 次のコマンドでスナップショットを展開する:

    tar xvJf aur-mirror-COMMIT.tar.xz

最後に、パッケージフォルダを開いて Arch User Repository (日本語)#パッケージのインストール に書かれているようにしてインストール。

## 古いバージョンのパッケージを見つける

３つの方法があります。

### 未同期のミラーサーバ

パソコンの中に古いバージョンが見つからなかった場合、未同期のサーバーで見つけられるかもしれません。こちらでミラーの状態を見ることができます。

### Arch Rollback Machine

Arch Rollback Machine は公式 Archlinux ミラーの毎日のスナップショットです。詳しくは Arch Rollback Machine (日本語) を参照してください。

### パッケージのリコンパイル

最悪の場合、つまりパッケージがどこにも見つからない場合、古いバージョンを自分でコンパイルする必要があるかもしれません。これには PKGBUILD ファイルが必要です。ABS の PKGBUILD を古いリソースを使うように編集する、もしくは https://www.archlinux.org/packages/ にアクセスしてダウングレードしたいパッケージをさがしてください。見つけたら、"View Changes" をクリックして "log" を選択します。クリックして必要なバージョンの場所をつきとめて、ディレクトリにあるファイルをダウンロードして makepkg でビルドしてください。

## FAQ

#### Q: 依存性のせいでパッケージをダウングレードできません。

A: アップグレードや削除のとき 'd' を使って依存性を無視できます。例: pacman -Ud pkgpkgname-olderpkgver.pkg.tar.gz。システムを破壊する可能性もあるので気をつけて下さい。

#### Q: ダウングレードしたパッケージを pacman がアップデートしないようにするのにはどうしたらいいですか？

A: `pacman.conf` に `IgnorePkg = package1 package2` と書けば --sysupgrade した時も Pacman は指定されたパッケージのアップグレードを無視します。

#### Q: システムを昨日の状態に戻したいのですが。

A: LVM を使って定期的にスナップショットを作れば簡単です。
Category:

- Package management (日本語)