MSYS2 の pacman データベースの更新ができない時の回避方法

この記事は約19分で読めます。

Windows7 64bit 環境に MSYS2 をインストールしたとき、パッケージマネージャの pacman がうまく動いてくれないことがあります(2017-10-24 現在)。

pacman -Syu などでデータベースを更新しようとしても「データベースをロックできません」という旨のエラーメッセージが表示されます。さらに「/var/lib/pacman/db.lck を削除してみて」という旨のメッセージが表示され、実際に削除して再度更新してみても、やはりできません。また「データベースろロックできません」といわれ「/var/lib/pacman/db.lck を削除してみて」といわれます。無間地獄です……。

今回はその回避方法について説明します。

スポンサーリンク

問題の pacman の挙動

下記の公式サイトの説明に沿って、msys2 をインストールした後にパッケージのデータベースを更新するために pacman -Syu を行います。

MSYS2
Software Distribution and Building Platform for Windows

下記のような感じになります。

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

コメント

  1. yukkuriyutori より:

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