Windows7 64bit 環境に MSYS2 をインストールしたとき、パッケージマネージャの pacman がうまく動いてくれないことがあります(2017-10-24 現在)。
pacman -Syu などでデータベースを更新しようとしても「データベースをロックできません」という旨のエラーメッセージが表示されます。さらに「/var/lib/pacman/db.lck を削除してみて」という旨のメッセージが表示され、実際に削除して再度更新してみても、やはりできません。また「データベースろロックできません」といわれ「/var/lib/pacman/db.lck を削除してみて」といわれます。無間地獄です……。
今回はその回避方法について説明します。
問題の pacman の挙動
下記の公式サイトの説明に沿って、msys2 をインストールした後にパッケージのデータベースを更新するために pacman -Syu を行います。

下記のような感じになります。
username@hostname MSYS ~
$ pacman -Syu
:: パッケージデータベースの同期中...
mingw32 361.4 KiB 1964K/s 00:00 [####################] 100%
mingw32.sig 96.0 B 0.00B/s 00:00 [####################] 100%
mingw64 361.2 KiB 1220K/s 00:00 [####################] 100%
mingw64.sig 96.0 B 93.8K/s 00:00 [####################] 100%
msys 155.9 KiB 1878K/s 00:00 [####################] 100%
msys.sig 96.0 B 0.00B/s 00:00 [####################] 100%
:: Starting core system upgrade...
警告: terminate other MSYS2 programs before proceeding
依存関係を解決しています...
衝突するパッケージがないか確認しています...
パッケージ (5) bash-4.4.012-1 filesystem-2017.05-1 mintty-1~2.7.9-1
msys2-runtime-2.9.0-2 pacman-5.0.1-4
合計ダウンロード容量: 11.49 MiB
合計インストール容量: 54.60 MiB
最終的なアップグレード容量: 3.00 MiB
:: インストールを行いますか? [Y/n] Y
:: パッケージを取得します...
msys2-runtime-2.9.0... 2.4 MiB 1371K/s 00:02 [####################] 100%
bash-4.4.012-1-x86_64 1969.4 KiB 1818K/s 00:01 [####################] 100%
filesystem-2017.05-... 40.0 KiB 1819K/s 00:00 [####################] 100%
mintty-1~2.7.9-1-x86_64 198.1 KiB 3.79M/s 00:00 [####################] 100%
pacman-5.0.1-4-x86_64 6.9 MiB 414K/s 00:17 [####################] 100%
(5/5) キーリングのキーを確認 [####################] 100%
(5/5) パッケージの整合性をチェック [####################] 100%
(5/5) パッケージファイルのロード [####################] 100%
(5/5) ファイルの衝突をチェック [####################] 100%
(5/5) 空き容量を確認 [####################] 100%
警告: opt/ のファイル情報を取得できませんでした
:: パッケージの変更を処理しています...
(1/5) 更新 msys2-runtime [####################] 100%
(2/5) 更新 bash [####################] 100%
(3/5) 更新 filesystem [####################] 100%
(4/5) 更新 mintty [####################] 100%
(5/5) 更新 pacman [####################] 100%
警告: terminate MSYS2 without returning to shell and check for updates again
警告: for example close your terminal window instead of calling exit
実行が終わったのちに msys2 を終了しようとすると 「Hangup signal received」 怒られて msys2 がフリーズしてしまいます。しかたなしにタスクマネージャから殺します。
気を取り直して再度 msys2 を起動し、 データベースアップデートのために pacman -Su を実行します。するとうまく実行できません。なにやらパッケージを取得しにいったときにデータベースをロックしてしまう模様。ロックファイルを削除して再度やってみても同じ結果です。
username@hostname MSYS ~
$ pacman -Su
:: Starting core system upgrade...
何も行うことがありません
:: システム全体の更新を開始...
依存関係を解決しています...
衝突するパッケージがないか確認しています...
パッケージ (61) bash-completion-2.5-1 bsdcpio-3.3.2-1 bsdtar-3.3.2-1
ca-certificates-20170717-2 coreutils-8.26-2 curl-7.55.1-3
file-5.32-1 flex-2.6.4-1 gawk-4.1.4-2 gcc-libs-6.3.0-1
gettext-0.19.8.1-1 gmp-6.1.2-1 gnupg-1.4.22-2 grep-3.0-1
icu-59.1-1 inetutils-1.9.4-1 info-6.3-1 libarchive-3.3.2-1
libasprintf-0.19.8.1-1 libassuan-2.4.3-1 libcrypt-2.1-1
libcurl-7.55.1-3 libedit-3.1-20170329 libexpat-2.2.4-1
libgcrypt-1.8.1-1 libgettextpo-0.19.8.1-1 libgpg-error-1.27-1
libidn2-2.0.4-2 libintl-0.19.8.1-1 liblzma-5.2.3-1
liblzo2-2.10-1 libmetalink-0.1.3-1 libnghttp2-1.24.0-1
libopenssl-1.0.2.l-2 libp11-kit-0.23.8-1 libpcre-8.40-2
libpcre16-8.40-2 libpcre32-8.40-2 libpcrecpp-8.40-2
libpcreposix-8.40-2 libpsl-0.18.0-2 libreadline-7.0.003-1
libsqlite-3.19.3.0-2 libssh2-1.8.0-1 libtasn1-4.12-1
libunistring-0.9.7-2 libxml2-2.9.5-1 libxslt-1.1.30-1
m4-1.4.18-1 mpfr-3.1.5.1-3 ncurses-6.0.20170708-2
openssl-1.0.2.l-2 p11-kit-0.23.8-1 pax-git-20161104.2-1
pcre-8.40-2 pkgfile-17-1 sed-4.4-2 tzcode-2017.b-1
wget-1.19.1-3 xz-5.2.3-1 zlib-1.2.11-1
合計ダウンロード容量: 29.61 MiB
合計インストール容量: 134.94 MiB
最終的なアップグレード容量: 10.52 MiB
:: インストールを行いますか? [Y/n] Y
:: パッケージを取得します...
username@hostname MSYS ~
$ pacman -Su
エラー: 処理を始められませんでした (データベースをロックできません)
エラー: データベースをロックできませんでした: File exists
パッケージマネージャを動かしてないのなら
/var/lib/pacman/db.lck を削除することができます
username@hostname MSYS ~
$ rm /var/lib/pacman/db.lck
rm: 書き込み保護されたファイル 通常の空ファイル '/var/lib/pacman/db.lck' を削除しますか?y
username@hostname MSYS ~
$ pacman -Su
:: Starting core system upgrade...
何も行うことがありません
:: システム全体の更新を開始...
依存関係を解決しています...
衝突するパッケージがないか確認しています...
パッケージ (61) bash-completion-2.5-1 bsdcpio-3.3.2-1 bsdtar-3.3.2-1
ca-certificates-20170717-2 coreutils-8.26-2 curl-7.55.1-3
file-5.32-1 flex-2.6.4-1 gawk-4.1.4-2 gcc-libs-6.3.0-1
gettext-0.19.8.1-1 gmp-6.1.2-1 gnupg-1.4.22-2 grep-3.0-1
icu-59.1-1 inetutils-1.9.4-1 info-6.3-1 libarchive-3.3.2-1
libasprintf-0.19.8.1-1 libassuan-2.4.3-1 libcrypt-2.1-1
libcurl-7.55.1-3 libedit-3.1-20170329 libexpat-2.2.4-1
libgcrypt-1.8.1-1 libgettextpo-0.19.8.1-1 libgpg-error-1.27-1
libidn2-2.0.4-2 libintl-0.19.8.1-1 liblzma-5.2.3-1
liblzo2-2.10-1 libmetalink-0.1.3-1 libnghttp2-1.24.0-1
libopenssl-1.0.2.l-2 libp11-kit-0.23.8-1 libpcre-8.40-2
libpcre16-8.40-2 libpcre32-8.40-2 libpcrecpp-8.40-2
libpcreposix-8.40-2 libpsl-0.18.0-2 libreadline-7.0.003-1
libsqlite-3.19.3.0-2 libssh2-1.8.0-1 libtasn1-4.12-1
libunistring-0.9.7-2 libxml2-2.9.5-1 libxslt-1.1.30-1
m4-1.4.18-1 mpfr-3.1.5.1-3 ncurses-6.0.20170708-2
openssl-1.0.2.l-2 p11-kit-0.23.8-1 pax-git-20161104.2-1
pcre-8.40-2 pkgfile-17-1 sed-4.4-2 tzcode-2017.b-1
wget-1.19.1-3 xz-5.2.3-1 zlib-1.2.11-1
合計ダウンロード容量: 29.61 MiB
合計インストール容量: 134.94 MiB
最終的なアップグレード容量: 10.52 MiB
:: インストールを行いますか? [Y/n] Y
:: パッケージを取得します...
username@hostname MSYS ~
$ pacman -Su
エラー: 処理を始められませんでした (データベースをロックできません)
エラー: データベースをロックできませんでした: File exists
パッケージマネージャを動かしてないのなら
/var/lib/pacman/db.lck を削除することができます
何度やっても同じです。さてこまりましたね。
回避方法
pacman の設定ファイルを修正することで回避可能です。
pacman の設定ファイルは下記です。PATH はMSYS2をインストールした場所によって異なりますが、下記はデフォルト設定でインストールした場合です。
c:/msys64/etc/pacman.conf
そのファイルの20行目あたりに「XferCommand」に関する設定があるはずです。コメントアウトされた状態で wget もしくはcurl での取得方法が書いてあります。
#XferCommand = /usr/bin/curl -C - -f %u > %o #XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u
このうちwgetのほうを有効に(つまり行頭の#を削除)します。こんな感じ。
#XferCommand = /usr/bin/curl -C - -f %u > %o XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u
あとはロックファイル /var/lib/pacman/db.lck があればそれを削除し、 いったん MSYS2 を終了します。
そして再度起動したのち pacman -Su を実行します。すると今度はデータベースの更新に成功します!やったね!
username@hostname MSYS ~
$ pacman -Su
:: Starting core system upgrade...
何も行うことがありません
:: システム全体の更新を開始...
依存関係を解決しています...
衝突するパッケージがないか確認しています...
パッケージ (61) bash-completion-2.5-1 bsdcpio-3.3.2-1 bsdtar-3.3.2-1
ca-certificates-20170717-2 coreutils-8.26-2 curl-7.55.1-3
file-5.32-1 flex-2.6.4-1 gawk-4.1.4-2 gcc-libs-6.3.0-1
gettext-0.19.8.1-1 gmp-6.1.2-1 gnupg-1.4.22-2 grep-3.0-1
icu-59.1-1 inetutils-1.9.4-1 info-6.3-1 libarchive-3.3.2-1
libasprintf-0.19.8.1-1 libassuan-2.4.3-1 libcrypt-2.1-1
libcurl-7.55.1-3 libedit-3.1-20170329 libexpat-2.2.4-1
libgcrypt-1.8.1-1 libgettextpo-0.19.8.1-1 libgpg-error-1.27-1
libidn2-2.0.4-2 libintl-0.19.8.1-1 liblzma-5.2.3-1
liblzo2-2.10-1 libmetalink-0.1.3-1 libnghttp2-1.24.0-1
libopenssl-1.0.2.l-2 libp11-kit-0.23.8-1 libpcre-8.40-2
libpcre16-8.40-2 libpcre32-8.40-2 libpcrecpp-8.40-2
libpcreposix-8.40-2 libpsl-0.18.0-2 libreadline-7.0.003-1
libsqlite-3.19.3.0-2 libssh2-1.8.0-1 libtasn1-4.12-1
libunistring-0.9.7-2 libxml2-2.9.5-1 libxslt-1.1.30-1
m4-1.4.18-1 mpfr-3.1.5.1-3 ncurses-6.0.20170708-2
openssl-1.0.2.l-2 p11-kit-0.23.8-1 pax-git-20161104.2-1
pcre-8.40-2 pkgfile-17-1 sed-4.4-2 tzcode-2017.b-1
wget-1.19.1-3 xz-5.2.3-1 zlib-1.2.11-1
合計ダウンロード容量: 29.61 MiB
合計インストール容量: 134.94 MiB
最終的なアップグレード容量: 10.52 MiB
:: インストールを行いますか? [Y/n] Y
:: パッケージを取得します...
--2017-10-27 15:28:35-- http://repo.msys2.org/msys/x86_64/bash-completion-2.5-1-any.pkg.tar.xz
長さ: 192564 (188K) [application/octet-stream]
`/var/cache/pacman/pkg/bash-completion-2.5-1-any.pkg.tar.xz.part' に保存中
/var/cache/pacman/pkg 100%[======================>] 188.05K --.-KB/s in 0.05s
2017-10-27 15:28:37 (4.01 MB/s) - `/var/cache/pacman/pkg/bash-completion-2.5-1-any.pkg.tar.xz.part' へ保存完了 [192564/192564]
--2017-10-27 15:28:38-- http://repo.msys2.org/msys/x86_64/gcc-libs-6.3.0-1-x86_64.pkg.tar.xz
長さ: 838728 (819K) [application/octet-stream]
`/var/cache/pacman/pkg/gcc-libs-6.3.0-1-x86_64.pkg.tar.xz.part' に保存中
/var/cache/pacman/pkg 100%[======================>] 819.07K 117KB/s in 7.0s
2017-10-27 15:28:47 (117 KB/s) - `/var/cache/pacman/pkg/gcc-libs-6.3.0-1-x86_64.pkg.tar.xz.part' へ保存完了 [838728/838728]
(略)
(61/61) キーリングのキーを確認 [#########################] 100%
(61/61) パッケージの整合性をチェック [#########################] 100%
(61/61) パッケージファイルのロード [#########################] 100%
(61/61) ファイルの衝突をチェック [#########################] 100%
(61/61) 空き容量を確認 [#########################] 100%
:: パッケージの変更を処理しています...
( 1/61) 更新 bash-completion [#########################] 100%
( 2/61) 更新 gcc-libs [#########################] 100%
(略)
(59/61) 更新 pkgfile [#########################] 100%
(60/61) 更新 tzcode [#########################] 100%
(61/61) 更新 wget [#########################] 100%
これでパッケージのデータベース更新ができるようになりました。めでたしめでたし。
まとめ
今回は Windows7 64bit 環境で msys2 pacman のデータベースが更新できない場合の回避方法を説明しました。手元で試した限り Windows7 32bit では同問題はおきませんでしたが、ただネットで調べた感じ、ぽろぽろと同じ問題を踏んでいるかたもいらっしゃいましたので、そこそこ遭遇率は高そうです。
そのうち対策されそうな気もしますが、ひとまず回避しないと仕事にならないかと思いますので、同問題でこまっているかたは試してみてください。


コメント
ありがとうございます。
おかげさまで解決いたしました。