1台の FreeBSD10.3 サーバーを “pkg upgrade” コマンドで更新しようとしたところ、次のエラーで更新が失敗してしまいました。
# pkg upgrade Updating FreeBSD repository catalogue... FreeBSD repository is up to date. All repositories are up to date. Checking for upgrades (110 candidates): 100% Processing candidates (110 candidates): 100% Checking integrity...Assertion failed: (strcmp(uid, p->uid) != 0), function pkg_conflicts_check_local_path, file pkg_jobs_conflicts.c, line 386. Child process pid=86035 terminated abnormally: Abort trap
この現象は過去にも発生したことがあり、検索してみると過去のメモが見つかりました。
確かに、/var/log/messages に core dump の記録が残っていました。
kernel: pid 85920 (pkg), uid 0: exited on signal 6 (core dumped)
その時は、pkg コマンドを portupgrade コマンドで更新して解決したのですが、今回は解決せず。
Web検索してみると、/var/db/pkg 以下のファイルが壊れているのでは?と、ヒントが見つかったので、pkg check コマンドでチェックしてみたところ、trousers パッケージ破損が見つかりました。
# pkg check -s -a Checking all packages: 94% trousers-0.3.14_1: missing file /usr/local/man/man3/Tspi_Key_GetPubKey.3.cz Checking all packages: 100%
こんなパッケージの破損で、pkg upgrade が失敗する?と疑問に感じながらも、対象パッケージを強制削除。
# pkg delete -f trousers Checking integrity... done (0 conflicting) Deinstallation has been requested for the following 1 packages (of 0 packages in the universe): Installed packages to be REMOVED: trousers-0.3.14_1 Number of packages to be removed: 1 The operation will free 2 MiB. Proceed with deinstalling packages? [y/N]: y [1/1] Deinstalling trousers-0.3.14_1... [1/1] Deleting files for trousers-0.3.14_1: 59% trousers-0.3.14_1: missing file /usr/local/man/man3/Tspi_Key_GetPubKey.3.cz [1/1] Deleting files for trousers-0.3.14_1: 100% ==> You should manually remove the "_tss" user. ==> You should manually remove the "_tss" group
再びインストールしようとすると、「お〜い」、別のエラーで入らないではないか。
# pkg install trousers Updating FreeBSD repository catalogue... FreeBSD repository is up to date. All repositories are up to date. Checking integrity... done (0 conflicting) The following 1 package(s) will be affected (of 0 checked): New packages to be INSTALLED: trousers: 0.3.14_2 Number of packages to be installed: 1 The process will require 2 MiB more space. Proceed with this action? [y/N]: y [1/1] Installing trousers-0.3.14_2... pkg: sqlite error while executing iterator in file pkgdb_iterator.c:1035: database disk image is malformed pkg: sqlite error while executing INSERT OR REPLACE INTO files (path, sha256, package_id) VALUES (?1, ?2, ?3) in file pkgdb.c:1791: database disk image is malformed
今度は pkg が使っている sqlデータベースが壊れているとのこと。
これもまた検索してみると、キャッシュファイルの破損なので、ファイルを消してしまえばいいとのこと。
#ll /var/db/pkg/repo-FreeBSD.sqlite -rw-r--r-- 1 root wheel 43589632 2月 2 07:17 /var/db/pkg/repo-FreeBSD.sqlite
では、消しましょう。
再び、pkg install コマンドを発行したところ、消去したファイルをダウンロードしてくれました。
#pkg install trousers Updating FreeBSD repository catalogue... pkg: Repository FreeBSD load error: access repo file(/var/db/pkg/repo-FreeBSD.sqlite) failed: No such file or directory Fetching meta.txz: 100% 940 B 0.9kB/s 00:01 Fetching packagesite.txz: 100% 6 MiB 6.1MB/s 00:01
気持ち悪いので、pkgデータベースを強制アップデート。
#pkg update -f Updating FreeBSD repository catalogue... Fetching meta.txz: 100% 940 B 0.9kB/s 00:01 Fetching packagesite.txz: 100% 6 MiB 6.1MB/s 00:01 Processing entries: 100% FreeBSD repository update completed. 28723 packages processed.
その後で、再度 pkg upgrade コマンドを発行しました。
#pkg upgrade Updating FreeBSD repository catalogue... FreeBSD repository is up to date. All repositories are up to date. Checking for upgrades (109 candidates): 100% Processing candidates (109 candidates): 100% Checking integrity... done (0 conflicting) The following 5 package(s) will be affected (of 0 checked): New packages to be INSTALLED: trousers: 0.3.14_2 Installed packages to be UPGRADED: tiff: 4.0.9 -> 4.0.9_1 glib: 2.50.2_7,1 -> 2.50.3_1,1 curl: 7.57.0 -> 7.58.0 ca_root_nss: 3.34.1 -> 3.35 Number of packages to be installed: 1 Number of packages to be upgraded: 4 The process will require 2 MiB more space. Proceed with this action? [y/N]: y [1/5] Upgrading ca_root_nss from 3.34.1 to 3.35... [1/5] Extracting ca_root_nss-3.35: 100% [2/5] Upgrading tiff from 4.0.9 to 4.0.9_1... [2/5] Extracting tiff-4.0.9_1: 100% [3/5] Upgrading glib from 2.50.2_7,1 to 2.50.3_1,1... [3/5] Extracting glib-2.50.3_1,1: 100% スキーマファイルが見つかりません: 何もしません。 [4/5] Upgrading curl from 7.57.0 to 7.58.0... [4/5] Extracting curl-7.58.0: 100% [5/5] Installing trousers-0.3.14_2... pkg: sqlite error while executing iterator in file pkgdb_iterator.c:1035: database disk image is malformed pkg: sqlite error while executing INSERT OR REPLACE INTO files (path, sha256, package_id) VALUES (?1, ?2, ?3) in file pkgdb.c:1791: database disk image is malformed
なんか、trousers パッケージだけ入りませんけど、依存関係で入っているだけのパッケージですし、pkg upgrade では、その後はエラーが出なくなりました。
pkg delete コマンドを途中まで発行して、依存関係をチェックしてみたのが次の結果。
# pkg delete trousers Checking integrity... done (0 conflicting) Deinstallation has been requested for the following 6 packages (of 0 packages in the universe): Installed packages to be REMOVED: trousers-0.3.14_2 gnutls-3.5.16 gnupg-2.2.4 ffmpeg-3.4.1_3,1 gpgme-1.9.0_1 mutt-1.9.2 Number of packages to be removed: 6 The operation will free 74 MiB.
心当たりがあるのが、ffmpeg と mutt コマンド。とりあえず放置して、次回 ffmpeg/mutt の更新時にエラーが出るようであれば調査を進めようと考えているところです。