FreeBSD 9.3 のパッケージを管理していたところ、1台のサーバーでビルド済みパッケージのダウンロード失敗が発生してしまい、パッケージ更新が出来なくなってしまいました。(下記)
# pkg upgrade Updating FreeBSD repository catalogue... FreeBSD repository is up-to-date. All repositories are up-to-date. 中略 Processing candidates (5 candidates): 100% The following 4 package(s) will be affected (of 0 checked): Installed packages to be UPGRADED: squid: 3.5.15_1 -> 3.5.16 p5-DateTime-TimeZone: 1.96 -> 1.97 p5-DateTime-Format-Strptime: 1.65,1 -> 1.67,1 llvm37: 3.7.1 -> 3.7.1_1 The process will require 2 MiB more space. 30 MiB to be downloaded. Proceed with this action? [y/N]: y Fetching squid-3.5.16.txz: 100% 2 MiB 408.2kB/s 00:06 pkg: cached package squid-3.5.16: size mismatch, fetching from remote Fetching squid-3.5.16.txz: 100% 2 MiB 349.9kB/s 00:07 pkg: cached package squid-3.5.16: size mismatch, cannot continue
それに、更新すべきパッケージのリストが、正常にパッケージ更新できるサーバーのものと異なり、ちょっとおかしい。
最初は、サーバー側の情報更新遅れかと思って放置していたのですが、3日経っても改善されないことから、このサーバーだけ pkg に何かトラブルが起きていると気づきました。確かに以前から ports 関係のデータベースが壊れることがあり、1年に1度くらい ports を初期化しています。ただし、今回は症状が少し違っています。
今回も ports が壊れたかと思い、ports を初期化するために ports と portsnap を初期化してみました。
しかし、pkg upgrade を再度行ってみても症状に変化無し。よく考えると、ports, portsnap はソースレベルのメンテナンスで、pkg はバイナリメンテナンスなので、ソースメンテナンス側のデータベースを更新してもダメなのは当たり前。
バイナリパッケージのデータベースを初期化する方法を検索してみると
https://forums.freebsd.org/threads/47444/
が見つかりました。pkg update コマンドを使えば良いようです。ただし、force オプション付き。
# pkg update -f Updating FreeBSD repository catalogue... Fetching meta.txz: 100% 968 B 1.0kB/s 00:01 Fetching packagesite.txz: 100% 5 MiB 349.4kB/s 00:16 Processing entries: 100% FreeBSD repository update completed. 24819 packages processed.
このあとで、pkg update コマンドを発行してみたところ、pkg コマンド自体が更新され、そのあと更新すべきパッケージの数が増えてる増えてる。PHP5.6系のアップデートが丸々発生していました。
# pkg upgrade Updating FreeBSD repository catalogue... FreeBSD repository is up-to-date. All repositories are up-to-date. New version of pkg detected; it needs to be installed first. The following 1 package(s) will be affected (of 0 checked): Installed packages to be UPGRADED: pkg: 1.7.1 -> 1.7.2 2 MiB to be downloaded. Proceed with this action? [y/N]: y Fetching pkg-1.7.2.txz: 100% 2 MiB 446.3kB/s 00:05 Checking integrity... done (0 conflicting) [1/1] Upgrading pkg from 1.7.1 to 1.7.2... [1/1] Extracting pkg-1.7.2: 100% Updating FreeBSD repository catalogue... FreeBSD repository is up-to-date. All repositories are up-to-date. Checking for upgrades (28 candidates): 100% 中略 Processing candidates (28 candidates): 100% The following 29 package(s) will be affected (of 0 checked): New packages to be INSTALLED: ruby21: 2.1.8,1 ruby22-bdb: 0.6.6_4 Installed packages to be UPGRADED: squid: 3.5.15_1 -> 3.5.16 ruby: 2.1.8,1 -> 2.2.4,1 php56-zlib: 5.6.19 -> 5.6.20 php56-zip: 5.6.19 -> 5.6.20 php56-xml: 5.6.19 -> 5.6.20 php56-tokenizer: 5.6.19 -> 5.6.20 php56-session: 5.6.19 -> 5.6.20 php56-openssl: 5.6.19 -> 5.6.20 php56-mysqli: 5.6.19 -> 5.6.20 php56-mysql: 5.6.19 -> 5.6.20 php56-mcrypt: 5.6.19 -> 5.6.20 php56-mbstring: 5.6.19_1 -> 5.6.20 php56-json: 5.6.19 -> 5.6.20 php56-hash: 5.6.19 -> 5.6.20 php56-gd: 5.6.19 -> 5.6.20 php56-filter: 5.6.19 -> 5.6.20 php56-curl: 5.6.19 -> 5.6.20 php56-ctype: 5.6.19 -> 5.6.20 php56-bz2: 5.6.19 -> 5.6.20 php56: 5.6.19 -> 5.6.20 perl5: 5.20.3_8 -> 5.20.3_9 pcre: 8.38 -> 8.38_1 p5-DateTime-TimeZone: 1.96 -> 1.97 p5-DateTime-Format-Strptime: 1.65,1 -> 1.67,1 mod_php56: 5.6.19 -> 5.6.20 llvm37: 3.7.1 -> 3.7.1_1 Installed packages to be REINSTALLED: portupgrade-2.4.14,2 (direct dependency changed: ruby22-bdb) The process will require 41 MiB more space. 64 MiB to be downloaded. Proceed with this action? [y/N]:
Yes, Yesと Y, Y を押し続けて、20分くらいでインストールが完了。(大型パッケージの数が多いので結構時間が掛かりました。)この後で、起動中のプロセスを再起動して作業が完了。
まだメンテナンスサイクルにあるOSなので、とりあえずサポートされているコマンドで復旧できました。なぜか時々パッケージが壊れるんですよ。不思議です。