2011年9月7日水曜日

FreeBSD packageの依存関係の修復



K*BUGの会合で話したネタなのだけれども、有用なのでこちらにもメモ書きを残しておく。


ちゃんと/usr/ports/UPDATEを読まずにportupgradeを適当にやってたりすると、依存関係がおかしくなる時がある。そのときに対処方法。


前提


前提としてportupgrade(or portmaster)とbsdadminscriptsがインストール済みであるとします。


そして適当なバージョンの最新のpackageを取ってくるように環境変数を設定しておきます



setenv PACKAGESITE ftp://ftpミラーサイト.jp.freebsd.org/pub/FreeBSD/ports/amd64/packages-[バージョン]-stable/Latest/



一番簡単だけど、負け犬な気分


一番簡単なのはパッケージ一覧を取っといて、全部最新を入れ直す事。以下のようなコマンドでパッケージの一覧がgetできるので、必要なもの拾って



pkg_info -E|sed 's/-[^\-].*$//'



頑張る人向けの処方(壊れたパッケージが少数)


まず、自動で修復できる情報を修復させます。



pkgdb -Fa



次に手動で修復



pkgdb -F





  • 足りない依存関係が見つかったよと言われたら


依存関係をpkg_add -rなりportinstall -Pなりでインストールします。なお、pkg_add -rでインストールすると環境変数で指定したパッケージサイトでのバージョンを持ってくるので/usr/portsのバージョンと違う可能性があります。




  • 同じパッケージで複数のバージョンが入ってるよって怒られたら


C-cでpkgdbで終了して、''両方の''パッケージを削除してから、新しいほうのバージョンをインストールします。pkgdbが言うことを鵜呑みにして片方だけ消すと、多くの場合ファイルを中途半端に消されます。


次ぎに忘れてる依存関係がないかチェックします。-Lでチェックして-Fで再び修正します。



pkgdb -L


pkgdb -F



ここまで終わったら一段落です。次ぎにライブラリの依存関係がファイル単位で壊れてないかチェックします。



pkg_libck



壊れている依存関係があった場合、可能性は大きく2つです。




  1. 依存している方が古い(依存するライブラリのバージョンが新しくなってしまっている)

  2. 依存されている方のファイルがない。(何らかの理由でファイルが消えてしまっている)


面倒な事考えずに、依存している方も依存されている方も入れ直すのが楽ですが、それとは別に何らかの儀式が必要なのに抜けている(/etc/libmap.confの記述など)可能性があるので、/usr/ports/UPDATEも再チェックです。


pkg_libchkでもエラーが出なくなったら、もうほぼ心配ないです。念のためpkgdb -L;pkgdb -Fを確認し、portauditでセキュリティホールも無いことを確認したら終了です。


それでも、なんか調子悪いときは/usr/local/etc/rc.dを覗いてみて、起動していないサービスを確認してみてください。例えばdbusやhaldが起動してないとX環境のみならずNetatalkも満足にうごかなかったりします。