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 では同問題はおきませんでしたが、ただネットで調べた感じ、ぽろぽろと同じ問題を踏んでいるかたもいらっしゃいましたので、そこそこ遭遇率は高そうです。
そのうち対策されそうな気もしますが、ひとまず回避しないと仕事にならないかと思いますので、同問題でこまっているかたは試してみてください。
コメント
ありがとうございます。
おかげさまで解決いたしました。