FreeBSD: pkg: cached package xxx: size mismatch, fetching from remote

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なので、とりあえずサポートされているコマンドで復旧できました。なぜか時々パッケージが壊れるんですよ。不思議です。

コメントを残す