FreeBSD: pkg_add: can’t stat package file

FreeBSDサーバーの、BINDに更新がありました。

bind99-9.9.5_4              <  needs updating (port has 9.9.5_5)

セカンダリーサーバーのBINDから更新しようと考え、リモートサーバーにログインして portupgrade コマンドをかけたところ、エラーが発生。

install  -o root -g wheel -m 444 /usr/ports/dns/bind99/work/bind-9.9.5/bin/rndc/rndc.conf  /usr/ports/dns/bind99/work/stage/usr/local/etc/rndc.conf.sample
====> Compressing man pages (compress-man)
===>  Building package for bind99-9.9.5_5
Creating package /usr/ports/dns/bind99/work/pkg/bind99-9.9.5_5.tbz
Registering depends: libxml2-2.8.0_3 libiconv-1.14_2.
Registering conflicts: bind9*-9.[45678].* bind9*-sdb-9.[45678].* bind-tools-9.* bind-tools-9.*.
Creating bzip'd tar ball in '/usr/ports/dns/bind99/work/pkg/bind99-9.9.5_5.tbz'
===>  Installing for bind99-9.9.5_5
pkg_add: can't stat package file '/usr/ports/dns/bind99/bind99-9.9.5_5.tbz'
*** Error code 1

Stop in /usr/ports/dns/bind99.
*** Error code 1

Stop in /usr/ports/dns/bind99.
** Command failed [exit code 1]: /usr/bin/script -qa /tmp/portupgrade20140324-2675-4246kf env UPGRADE_TOOL=portupgrade UPGRADE_PORT=bind99-9.9.5_4 UPGRADE_PORT_VER=9.9.5_4 make reinstall
--->  Restoring the old version
中略
** Fix the installation problem and try again.
[Updating the pkgdb <format:bdb_btree> in /var/db/pkg ... - 242 packages found (-0 +1) . done]
** Listing the failed packages (-:ignored / *:skipped / !:failed)
        ! dns/bind99 (bind99-9.9.5_4)   (install error)

/usr/ports 以下でのビルド作業は正常に終了し、ビルドしたパッケージをインストールしようとして何かの要因でこけているような感じです。エラー出力に含まれる情報も、あまり役に立つものがなくて、もう一度 portupgrade コマンドを試してみたのですが結果は同じ。さてどうしたものやら。

DNSは動かしていないものの、BINDを入れている他のサーバーで確認してみたところ、こんな症状は発生しません。

やむを得ず手動でインストールを試すことにしてみました。

# cd /usr/ports/dns/bind99/
# make deinstall reinstall

不思議なことに、このコマンドだと何の障害もなくインストールが完了しました。もし、旧バージョンが削除だけされてインストールできなかったらどうしようかと若干びびりましたが、無事に完了しました。

しかし、原因は何だったんだろう?

BINDは動作中のプログラムであるため、他のパッケージとは別に更新しましたが、残りの更新パッケージを入れようとしたら、、、、、、再度 pkg_addがエラーを吐いて同様の症状となりました。

** Listing the failed packages (-:ignored / *:skipped / !:failed)
        ! converters/libiconv (libiconv-1.14_2) (install error)
        ! devel/p5-Class-Load (p5-Class-Load-0.20)      (install error)
        ! devel/p5-Devel-PPPort (p5-Devel-PPPort-3.21)  (install error)

どうも、pkg_add コマンド関係に何らかの原因があるようです。

早速検索してみたところ、同様の症状に出会った人がいることがわかりました。

http://www.opendevs.org/mszpz/staging-without-usr-ports-packages.html

残念ながら、対策情報はなし。

とりあえず、問題がないサーバーと、エラーが出るサーバーのRubyのバージョンを比較してみたところ、問題がないサーバーでは、

ruby-1.9.3.484_2,1  Object-oriented interpreted scripting language

問題のサーバーでは、

ruby-1.9.3.484_1,1  Object-oriented interpreted scripting language

と若干異なります。ひょっとしたら、、、、ということで、Rubyを最初に更新してみました。当然 portupgrade では入らないので手動で再インストールしましたが、結果は症状に変化無し。

その他、シェルを切り替えてみるとか、別のターミナルエミュレーターから操作してみるとかやってみたものの、pkg_add がエラーになる症状に変化無し。

手動インストールではあるもののセカンダリーサーバーにはBINDが入ったので、今度はマスターDNSサーバーである、このサーバーでBINDを portupgrade コマンドで入れてみることにしました。

結果は、portupgrade による更新作業はエラーなしで終了。ruby のバージョンを比較してみたところ、エラーが発生するセカンダリーサーバーと同じバージョン。ということは、何らかの原因で /usr/ports の一部が壊れているの?手動では問題ないということで、壊れていないとは思うのですが、それ以外に疑うものがない!
考えたことは、

  1. /usr/ports 自体を再構築する
  2. 問題がある ports を tar でアーカイブして、テストマシンで再現調査してみる
  3. 同じく、WordPress 用に作った仮想サーバーで再現テストをしてみる

というものですが、残念ながらOSのバージョンが一致する上記2,3 のマシンは手持ちがないため、面倒ですが /usr/ports を再構築してみるしか切り分け方法がありません。これには2,3時間掛かります。やるしかありませんが、その前にとりあえず最新の portsnap を試してみた後に、/usr/ports を再構築することにしました。
そうしたら、これ。
/usr/ports/Mkの下が更新されるじゃない!おい!元が悪かったのかよ〜。

# portsnap fetch && portsnap update && portversion -vL=
Looking up portsnap.FreeBSD.org mirrors... 7 mirrors found.
Fetching snapshot tag from ec2-ap-northeast-1.portsnap.freebsd.org... done.
Fetching snapshot metadata... done.
Updating from Mon Mar 24 03:23:38 JST 2014 to Mon Mar 24 19:53:31 JST 2014.
Fetching 4 metadata patches... done.
Applying metadata patches... done.
Fetching 0 metadata files... done.
Fetching 78 patches.....10....20....30....40....50....60....70.... done.
Applying patches... done.
Fetching 6 new ports or files... done.
Removing old files and directories... done.
Extracting new files:
/usr/ports/Mk/bsd.port.mk
/usr/ports/Mk/bsd.qt.mk
/usr/ports/Mk/bsd.wx.mk

まさかと思いながらも、残りの更新が必要なパッケージの一つに portupgrade コマンドを発行してみると、、、、、通るじゃない!

# portupgrade p5-Class-Load-0.20
--->  Upgrading 'p5-Class-Load-0.20' to 'p5-Class-Load-0.21' (devel/p5-Class-Load)
--->  Building '/usr/ports/devel/p5-Class-Load'
===>  Cleaning for p5-Class-Load-0.21
中略
Installing /usr/ports/devel/p5-Class-Load/work/stage/usr/local/lib/perl5/site_perl/5.16/Class/Load.pm
Installing /usr/ports/devel/p5-Class-Load/work/stage/usr/local/lib/perl5/site_perl/5.16/Class/Load/PP.pm
Installing /usr/ports/devel/p5-Class-Load/work/stage/usr/local/lib/perl5/5.16/man/man3/Class::Load.3
====> Compressing man pages (compress-man)
===>  Building package for p5-Class-Load-0.21
Creating package /usr/ports/devel/p5-Class-Load/work/pkg/p5-Class-Load-0.21.tbz
Registering depends: p5-Data-OptList-0.109 p5-Package-Stash-0.36 p5-Dist-CheckConflicts-0.09 p5-Module-Implementation-0.07 p5-Module-Runtime-0.014 p5-Package-Stash-XS-0.28 p5-Params-Util-1.07 p5-Sub-Install-0.927 p5-List-MoreUtils-0.33 p5-Try-Tiny-0.18 perl5-5.16.3_8.
Creating bzip'd tar ball in '/usr/ports/devel/p5-Class-Load/work/pkg/p5-Class-Load-0.21.tbz'
===>  Installing for p5-Class-Load-0.21
pkg_install EOL is scheduled for 2014-09-01. Please consider migrating to pkgng
http://blogs.freebsdish.org/portmgr/2014/02/03/time-to-bid-farewell-to-the-old-pkg_-tools/
===>  Cleaning for p5-Class-Load-0.21
--->  Cleaning out obsolete shared libraries
[Updating the pkgdb <format:bdb_btree> in /var/db/pkg ... - 242 packages found (-0 +1) . done]

portsnap は cron で動かしているため、他のFreeBSDサーバーと portsnap 実行時刻が異なり、不具合があるファイルを取ってきた、または修正が施されたファイルが置かれる前にfetchしてしまったなどの原因が考えられますが、本当の原因は不明のまま。

たまにはこういうこともありますが、ロスした数時間は痛い。メモする題材が出来たと考えることにします。

コメントを残す