pkgdb で修正できない問題を直す2007年05月06日 09時52分44秒

portupgrade は ports を最新状態にしておくのにとても都合がいい。全てが順調に動いている間はいいのだが、何か問題があった時の具体的な対処の仕方とかが、なかなか見つけられない。

今回、portupgrade が /var/db/pkg を更新している間に、止まってしまい、/var/db/pkg のいくつかが壊れてしまった。

見ただけでは /var/db/pkg の情報が壊れているのが判らない事も多い。pkg_info をやると、壊れているものがあるときには標準エラーに出力される。

まずは、現状。


# ls /var/db/pkg/xulrunner-1.8.0.4_6/
+COMMENT        +DESC           +MTREE_DIRS
+DEINSTALL      +INSTALL        +REQUIRED_BY

# pkg_info !$
pkg_info /var/db/pkg/xulrunner-1.8.0.4_6/
pkg_info: the package info for package 'xulrunner-1.8.0.4_6' is corrupt


そこで、pkgdb をやる。


# pkgdb -F
--->  Checking the package registry database
[Updating the pkgdb  in /var/db/pkg ... - 553 packages found (
-0 +0)  done]
Stale dependency: epiphany-2.18.0 -> xulrunner-1.8.0.4_6 (www/xulrunner):
Install stale dependency? ([y]es/[n]o/[a]ll) [yes]

実際には、xulrunner はインストール済なのだが、pkg 情報だけを入れる方法はない。もう一度、コンパイルし直す必要がある。

ここで、yes を押し、見つからない ports をインストールする。


# pkgdb -F
--->  Checking the package registry database
        [Updating the pkgdb  in /var/db/pkg ... - 553 packages
 found (-0 +0)  done]
Stale dependency: epiphany-2.18.0 -> xulrunner-1.8.0.4_6 (www/xulrunner):
Install stale dependency? ([y]es/[n]o/[a]ll) [yes] yes

--->  Installing 'xulrunner-1.8.0.4_6' from a port (www/xulrunner)
--->  Building '/usr/ports/www/xulrunner'
===>  Found saved configuration for xulrunner-1.8.0.4_6
===>  Extracting for xulrunner-1.8.0.4_6
=> MD5 Checksum OK for xulrunner-1.8.0.4-source.tar.bz2.
=> SHA256 Checksum OK for xulrunner-1.8.0.4-source.tar.bz2.
===>   xulrunner-1.8.0.4_6 depends on file: /usr/local/bin/perl5.8.8 - found

echo "libdata/pkgconfig/xulrunner-js.pc" >> /ports/tmp/usr/ports/www/xulrunner/w
ork/plist
echo "libdata/pkgconfig/xulrunner-xpcom.pc" >> /ports/tmp/usr/ports/www/xulrunne
r/work/plist
echo "libdata/pkgconfig/xulrunner-plugin.pc" >> /ports/tmp/usr/ports/www/xulrunn
er/work/plist
echo "@exec /usr/local/bin/update-desktop-database > /dev/null || true" >> /port
s/tmp/usr/ports/www/xulrunner/work/plist
echo "@unexec /usr/local/bin/update-desktop-database > /dev/null || true" >> /po
rts/tmp/usr/ports/www/xulrunner/work/plist
echo "@unexec /bin/rmdir %D/share/idl 2>/dev/null || true" >> /ports/tmp/usr/por
ts/www/xulrunner/work/plist
===>   Generating temporary packing list
===>  Checking if www/xulrunner already installed

...

pkg_info: the package info for package 'xulrunner-1.8.0.4_6' is corrupt

...

** Command failed [exit code 1]: /usr/bin/script -qa /tmp/portinstall.2871.0 env
 make reinstall
** Fix the installation problem and try again.
[Updating the pkgdb  in /var/db/pkg ... - 560 packages found (
-0 +7) ....... done]
** Listing the failed packages (*:skipped / !:failed)
        ! www/xulrunner (install error)
--->  Packages processed: 0 done, 0 ignored, 0 skipped and 1 failed
Command failed [exit code 1]: /usr/local/sbin/portinstall www/xulrunner

しかし、既に xulrunner は既にインストールされているので、make install、make reinstall 共に失敗するのだ。

残念ながら、pkgdb では修正は出来ない。手で以下のように直す。

なお、壊れている pkg は pkg_delete では消せない。


# pkg_delete /var/db/pkg/xulrunner-1.8.0.4_6
pkg_delete: the package info for package 'xulrunner-1.8.0.4_6' is corrupt (use -
f to force removal)

そこで、-f を付けて、強制的に削除する。

# pkg_delete -f /var/db/pkg/xulrunner-1.8.0.4_6
pkg_delete: the package info for package 'xulrunner-1.8.0.4_6' is corrupt (but I
'll delete it anyway)
pkg_delete: couldn't completely deinstall package 'xulrunner-1.8.0.4_6',
only the log entry in /var/db/pkg/xulrunner-1.8.0.4_6 was removed

しかし、これだけでは pkg 情報は消してくれるが、インストールされているファイルは残されているので、make reinstall は失敗する。

# pushd /usr/ports/www/xulrunner
# make -DFORCE_PKG_REGISTER install

そこで、FORCE_PKG_REGISTER を make に渡し、強制的にインストールする。

これで、xulrunner の pkg 情報が直った。