Pacman/ローカルデータベースの復元
ローカルデータベースの復元が必要だとわかる兆候:
pacman -Q
で何も出力がされず、pacman -Syu
でシステムが最新だと表示されるとき。pacman -S package
を使ってパッケージをインストールしようとすると、既にインストールされている依存パッケージのリストが出力される。
以上の場合、十中八九、インストールしたソフトウェアの pacman データベースである /var/lib/pacman/local
が破損していたり削除されています。これは深刻な問題ですが、以下の手順に従うことで復元することができます。
まず、pacman のログファイルが存在するか確認します:
$ ls /var/log/pacman.log
ログファイルが存在しない場合は、この方法で続行することは不可能です。Xyne のパッケージ検出スクリプト を使ってデータベースを再作成してみてください。それができない場合、解決方法としてはシステム全体を再インストールするしかありません。
パッケージの復旧リストを生成する
ログフィルタースクリプトを作成して実行可能権限を付与:
pacrecover
#!/bin/bash -e . /etc/makepkg.conf PKGCACHE=$((grep -m 1 '^CacheDir' /etc/pacman.conf || echo 'CacheDir = /var/cache/pacman/pkg') | sed 's/CacheDir = //') pkgdirs=("$@" "$PKGDEST" "$PKGCACHE") while read -r -a parampart; do pkgname="${parampart[0]}-${parampart[1]}-*.pkg.tar.xz" for pkgdir in ${pkgdirs[@]}; do pkgpath="$pkgdir"/$pkgname [ -f $pkgpath ] && { echo $pkgpath; break; }; done || echo ${parampart[0]} 1>&2 done
スクリプトを実行してください (任意でパッケージが含まれている追加のディレクトリをパラメータで渡して下さい):
$ paclog-pkglist /var/log/pacman.log | ./pacrecover >files.list 2>pkglist.orig
このコマンドで2つのファイルが作成されます: マシンに存在するパッケージファイルが載った files.list
と、ダウンロードするべきパッケージが載った pkglist.orig
です。後者ではマシンに存在する、古いバージョンのパッケージのファイルと、新しいバージョンのファイルでミスマッチが発生することがあります。ミスマッチは手動で修正する必要があります。
以下のコマンドで自動的に後者のリストをリポジトリに存在するパッケージだけに絞ることができます:
$ { cat pkglist.orig; pacman -Slq; } | sort | uniq -d > pkglist
重要な base パッケージが欠けていないか確認して、リストに加えます:
$ comm -23 <(pacman -Sgq base) pkglist.orig >> pkglist
両方のリストの中身が問題ないようでしたら、次に進んでください。リストを使用して pacman のパッケージデータベースを復旧します: /var/lib/pacman/local/
。
リカバリを実行する
リカバリのための bash エイリアスを定義してください:
recovery-pacman() { sudo pacman "$@" \ --log /dev/null \ --noscriptlet \ --dbonly \ --force \ --nodeps \ --needed }
--log /dev/null
は不必要に pacman のログを生成することを避け、--needed
は既にデータベースに存在するパッケージを省略し、--nodeps
はキャッシュされているパッケージのインストールを許可します。他のオプションはファイルシステムを読み書きすることなく pacman を操作できるようにします。
同期データベースを作成:
# pacman -Sy
files.list
からローカルで利用可能なパッケージファイルをインストールしてデータベースの生成を開始:
# recovery-pacman -U $(< files.list)
pkglist
から残りをインストール:
# recovery-pacman -S $(< pkglist)
ローカルデータベースを更新して、他のパッケージから必要とされてないパッケージを「明示的にインストールした」とし、他のパッケージを「依存パッケージ」とします。パッケージを削除するときは特別な注意が必要になりますが、データベースが壊れている以上これがベストです。
# pacman -D --asdeps $(pacman -Qq) # pacman -D --asexplicit $(pacman -Qtq)
任意でインストールされたパッケージに破損が存在しないかチェックします:
# pacman -Qk
任意でファイルがどのパッケージにも所有されていないことを確認してください。
全てのパッケージをアップデート:
# pacman -Su