tar: Unrecognized archive format: Inappropriate file type or format

FreeBSD 7.3で運用しているサーバーで、ports パッケージをアップデートしようとしたら、エラーが発生してパッケージをアップデートできないという症状が発生しました。

# portupgrade png-1.5.14
---> Upgrading 'png-1.5.14' to 'png-1.5.15' (graphics/png)
---> Building '/usr/ports/graphics/png'
===> Cleaning for png-1.5.15
===> Found saved configuration for png-1.5.10
===> Fetching all distfiles required by png-1.5.15 for building
===> Extracting for png-1.5.15
=> SHA256 Checksum OK for libpng-1.5.15.tar.xz.
=> SHA256 Checksum OK for libpng-1.5.15-apng.patch.gz.
===> png-1.5.15 depends on file: /usr/local/bin/xz - found
tar: Unrecognized archive format: Inappropriate file type or format
tar: Error exit delayed from previous errors.
*** Error code 1
Stop in /usr/ports/graphics/png.
*** Error code 1
Stop in /usr/ports/graphics/png.
** Command failed [exit code 1]: /usr/local/libexec/pkgtools/script -qa /tmp/portupgrade20130503-31542-1opasv3-0 env UPGRADE_TOOL=portupgrade UPGRADE_PORT=png-1.5.14 UPGRADE_PORT_VER=1.5.14 make
** Fix the problem and try again.
** Listing the failed packages (-:ignored / *:skipped / !:failed)
 ! graphics/png (png-1.5.14) (unknown build error)

エラーの内容から、ports サイトからダウンロードした .xz 拡張子のファイルをportupgrade コマンドが展開を依頼している tar コマンドが展開できないようです。
/usr/bin/tar のバージョンを確認してみたところ、

bsdtar 2.5.5 - libarchive 2.5.5

ということで、OS組み込みのtar のバージョンが古く xz アーカイブを扱えないものと推測します。

問題なく xz形式のアーカイブを展開してビルドできたFeeBSD 8.3の tar をチェックしてみると、

bsdtar 2.8.5 - libarchive 2.8.5

2.8.5 で確かに 2.5.5 より新しいものです。gtar を入れれば、xz を解凍できるかもと、インストールしようとしたら、これもまた xz 形式で供給されている!

# cd /usr/ports/archivers/gtar
# make
===> Found saved configuration for gtar-1.26
===> Fetching all distfiles required by gtar-1.26 for building
===> Extracting for gtar-1.26
=> SHA256 Checksum OK for tar-1.26.tar.xz.
===> gtar-1.26 depends on file: /usr/local/bin/xz - found
tar: Unrecognized archive format: Inappropriate file type or format
tar: Error exit delayed from previous errors.
*** Error code 1
Stop in /usr/ports/archivers/gtar.
*** Error code 1
Stop in /usr/ports/archivers/gtar.

問題が発生するホストには xz が入っているため、手動で解凍しようとすれば出来ますが、今後 xz でソースが供給される度に手動で作業をするというのは考えたくないところです。gtar を入れるのも png を入れるのも、同じxzアーカイブファイルの取り扱いのため、 gtar を入れることが出来て、ソースの展開に gtar を指定することが出来ればひょっとすると今回の問題を回避できるかもしれないため、png に優先して gtar をインストールしてみることにしました。

< xz アーカイブの gtar ソースを ports の下で make してみる >

FreeBSD ports ファイルは、Makefile と distinfo でソースダウンロード中にエラーや改変を検出するようになっているため、例えば tar-1.26.tar.xz ファイルを unxz で解凍し、gzip で再び圧縮し、ファイル名だけ .xz にして、tar には認識できるように修正したとしても distinfo ファイルの内容と一致しないため、このファイルは不正と見なされてしまいます。従ってさらに distinfo ファイルまで修正する必要があります。 distfile 自体はチェックサムとファイルサイズを記述してあるだけなので sha256 コマンドを使ってチェックサムを計算し直し、(オリジナルの distinfo をバックアップした後)distinfo に xz を解凍した非圧縮 tar ファイルで名前だけ .xz の新しいファイルの sha256 チェックサムとファイルサイズを書き込みます。こんな感じ。

SHA256 (tar-1.26.tar.xz) = 00856de177b8bd73777c06b78c98c83ca11069903939fb99ea4d844d2de93049
SIZE (tar-1.26.tar.xz) = 14899200

このあとで make install したところ無事に gtar をインストールできました。

次に、portupgrade コマンドからgtar が呼ばれるように環境変数をいじります。
portsで使用される tar コマンドを /usr/bin/tar から /usr/local/bin/gtar に置き換えるわけです。

# setenv TAR /usr/local/bin/gtar

そして、

# portupgrade png-1.5.14

とコマンド発行してみたところ、xz アーカイブを通過し、無事にビルドが始まりました。

今後

さて、今後はどうするか?

  1. /usr/bin/tar を /usr/local/bin/gtar へのリンクに変更する(システムワイド)
  2. root の環境変数に TAR を追加する(root のみ)
  3. portupgrade で xz がらみのエラーが発生したときだけ手動でTAR環境変数を設定して回避する(その場しのぎ)

など、方法は複数ありますが、ports ソースの動向も見ないといけませんから、しばらくは3 が濃厚と思います。根本的にはOSを 8か 9に上げるのが良さそうだと考えているところです。

コメントを残す