FreeBSDでパッケージを更新しようとしたときに、以下のようなエラーが出て、うまくいかないときがあります。

pkg: sqlite error while executing PRAGMA user_version; in file pkgdb.c:2372: database is locked

これは、パッケージのデータベースディレクトリに、ロックのための空ディレクトリが残ってしまっていることが原因です。なので、このサイトに書かれているとおり、空ディレクトリを削除してやると更新がうまくいきます。

sudo rmdir /var/db/pkg/local.sqlite.lock

エラーがたまにしか起きないときは、いちいち手動で空ディレクトリを削除すればよいのですが、パッケージデータベースディレクトリがNFSマウントされているときには、このエラーが頻繁に起きてしまいます。(例えば、NFSルートでディスクレス運用しているマシンのパッケージを更新するときが該当しますね。)

このようなときには、pkgコマンドが「ちゃんとした」ロックを行なうように、/usr/local/etc/pkg.confに以下の一行を追加するとうまくいきます。

NFS_WITH_PROPER_LOCKING = true;

参考文献