FreeBSD pkg installのダウンロードの調子が悪かったので対処した

ここ一週間ほどpkg installを実行するとパッケージのダウンロードが途中で止まりTimeoutすることでインストール失敗する現象が何度も発生しました。

下記がその出力です。下の方にOperation timed outと表示されてインストールが失敗します。

% sudo pkg -d install -y git
DBG(1)[3040]> pkg initialized
Updating FreeBSD repository catalogue...
DBG(1)[3040]> PkgRepo: verifying update for FreeBSD
DBG(1)[3040]> Pkgrepo, begin update of '/var/db/pkg/repo-FreeBSD.sqlite'
DBG(1)[3040]> Fetch: fetching from: http://pkgmir.geo.FreeBSD.org/FreeBSD:12:amd64/quarterly/meta.txz with opts "i"
DBG(1)[3040]> Fetch: fetching from: http://pkgmir.geo.FreeBSD.org/FreeBSD:12:amd64/quarterly/packagesite.txz with opts "i"
FreeBSD repository is up to date.
All repositories are up to date.
DBG(1)[3040]> want to get an advisory lock on a database
The following 17 package(s) will be affected (of 0 checked):

New packages to be INSTALLED:
        git: 2.23.0
        p5-CGI: 4.44
        p5-HTML-Parser: 3.72
        p5-HTML-Tagset: 3.20_1
        p5-IO-Socket-SSL: 2.066
        p5-Mozilla-CA: 20180117
        p5-Net-SSLeay: 1.85
        p5-IO-Socket-INET6: 2.72_1
        p5-Socket6: 0.29
        p5-Authen-SASL: 2.16_1
        p5-GSSAPI: 0.28_1
        p5-Digest-HMAC: 1.03_1
        python36: 3.6.9_1
        readline: 8.0.0
        libffi: 3.2.1_3
        p5-Error: 0.17028
        cvsps: 2.1_2

Number of packages to be installed: 17

The process will require 142 MiB more space.
22 MiB to be downloaded.
DBG(1)[3040]> Fetch: fetching from: http://pkgmir.geo.FreeBSD.org/FreeBSD:12:amd64/quarterly/All/git-2.23.0.txz with opts "i"
[1/17] Fetching git-2.23.0.txz: 100%    5 MiB 167.3kB/s    00:32
pkg: http://pkg.FreeBSD.org/FreeBSD:12:amd64/quarterly/All/git-2.23.0.txz: Operation timed out
DBG(1)[3040]> release an advisory lock on a database
%

全くダウンロードできないわけではないのでpkg installを繰り返すとインストールを完了させることは可能ですが、依存関係の多いパッケージをインストールする場合は面倒です。下記はgitのインストールを実行していますが、調査の過程でこれに限らずxorgやmysql57-serverなどでも同様の現象が発生したことを確認しました。

最初はネットワーク設定が悪いのかなと思いましたが、curl, portsnapコマンドは正常に動きますし、port collectionからmakeコマンド経由でインストールするとうまくいくんですよね。。

ということで、pkg周りの何かがうまくいってなさそうなので、とりあえずTimeoutするまでの時間を延ばすことに

pkg設定ファイル(/usr/local/etc/pkg.conf)を開いて FETCH_TIMEOUTの値をデフォルトの30から600に変更

FETCH_TIMEOUT = 600; # コメントアウトを外すことを忘れずに

もう一度トライするとメッセージがConnection reset by peerに変わりました。サーバー側からコネクションが切られたようです。今度は向こう側でTimeoutしたのかな?

% sudo pkg -d install -y git
DBG(1)[14180]> pkg initialized
Updating FreeBSD repository catalogue...

...(省略)

DBG(1)[14180]> Fetch: fetching from: http://pkgmir.geo.freebsd.org/FreeBSD:12:amd64/quarterly/All/p5-HTML-Tagset-3.20_1.txz with opts "i"
[4/19] Fetching p5-HTML-Tagset-3.20_1.txz: 100%   12 KiB  12.0kB/s    00:01
DBG(1)[14180]> Fetch: fetching from: http://pkgmir.geo.freebsd.org/FreeBSD:12:amd64/quarterly/All/expat-2.2.8.txz with opts "i"
[5/19] Fetching expat-2.2.8.txz: 100%  119 KiB   0.4kB/s    05:00
pkg: http://pkg.FreeBSD.org/FreeBSD:12:amd64/quarterly/All/expat-2.2.8.txz: Connection reset by peer
DBG(1)[14180]> release an advisory lock on a database
%

pkg用のリモートリポジトリの設定ファイル/etc/pkg/FreeBSD.confに記載のあるurl: "pkg+http://pkg.FreeBSD.org/${ABI}/quarterly"pkg.FreeBSD.orgにブラウザからアクセスしてみると

This is pkg0.kwc.freebsd.org - a Japan regional mirror for pkg(8).

It is generously hosted by KDDI Web Communications Inc in Tokyo, Japan.

We use MaxMind GeoLite based geo-dns to choose a close mirror for you.

IMPORTANT: We do NOT guarantee uptime of any particular mirror. We provide SRV fallbacks for redundancy.

日本にあるpkg向けミラーに繋がったみたいです。このサーバが何かおかしいのかもしれないとアタリをつけてページ下部に他のミラーのurlがあったので

Other mirrors:

    pkg0.bme.freebsd.org
    pkg0.cyb.freebsd.org
    pkg0.isc.freebsd.org
    pkg0.jinx.freebsd.org
    pkg0.nyi.freebsd.org
    pkg0.twn.freebsd.org 

pingを打って一番近そうだったpkg0.twn.freebsd.orgに直接アクセスするように設定ファイルを編集したいと思います。

mkdir -p /usr/local/etc/pkg/repos
echo 'FreeBSD: { url: "pkg+http://pkg0.twn.FreeBSD.org/${ABI}/quarterly" }' > /usr/local/etc/pkg/repos/FreeBSD.conf

設定変更したのでトライ

% sudo pkg -d install -y git
DBG(1)[3484]> pkg initialized
Updating FreeBSD repository catalogue...
DBG(1)[3484]> PkgRepo: verifying update for FreeBSD
DBG(1)[3484]> Pkgrepo, begin update of '/var/db/pkg/repo-FreeBSD.sqlite'
DBG(1)[3484]> Fetch: fetching from: http://pkg0.twn.FreeBSD.org/FreeBSD:12:amd64/quarterly/meta.txz with opts "i"
DBG(1)[3484]> Fetch: fetching from: http://pkg0.twn.FreeBSD.org/FreeBSD:12:amd64/quarterly/packagesite.txz with opts "i"
FreeBSD repository is up to date.
All repositories are up to date.
DBG(1)[3484]> want to get an advisory lock on a database
The following 19 package(s) will be affected (of 0 checked):

New packages to be INSTALLED:
        git: 2.23.0
        p5-CGI: 4.44
        p5-HTML-Parser: 3.72
        p5-HTML-Tagset: 3.20_1
        expat: 2.2.8
        p5-IO-Socket-SSL: 2.066
        p5-Mozilla-CA: 20180117
        p5-Net-SSLeay: 1.85
        p5-IO-Socket-INET6: 2.72_1
        p5-Socket6: 0.29
        p5-Authen-SASL: 2.16_1
        p5-GSSAPI: 0.28_1
        p5-Digest-HMAC: 1.03_1
        python36: 3.6.9_1
        readline: 8.0.0
        libffi: 3.2.1_3
        p5-Error: 0.17028
        pcre: 8.43_2
        cvsps: 2.1_2

Number of packages to be installed: 19

The process will require 150 MiB more space.
23 MiB to be downloaded.
DBG(1)[3484]> Fetch: fetching from: http://pkg0.twn.FreeBSD.org/FreeBSD:12:amd64/quarterly/All/git-2.23.0.txz with opts "i"
[1/19] Fetching git-2.23.0.txz: 100%    5 MiB   1.1MB/s    00:05

...(省略)

DBG(1)[3484]> Fetch: fetching from: http://pkg0.twn.FreeBSD.org/FreeBSD:12:amd64/quarterly/All/cvsps-2.1_2.txz with opts "i"
[19/19] Fetching cvsps-2.1_2.txz: 100%   44 KiB  44.6kB/s    00:01
Checking integrity...DBG(1)[3484]> Binary> loading /var/cache/pkg/git-2.23.0-b10e56920a.txz

...(省略)

DBG(1)[3484]> Binary> loading /var/cache/pkg/cvsps-2.1_2-0d3f2f1c58.txz
DBG(1)[3484]> check integrity for 19 items added
 done (0 conflicting)
DBG(1)[3484]> want to upgrade advisory to exclusive lock
[1/19] Installing p5-HTML-Tagset-3.20_1...
[1/19] Extracting p5-HTML-Tagset-3.20_1: 100%

...(省略)

[18/19] Installing cvsps-2.1_2...
[18/19] Extracting cvsps-2.1_2: 100%

DBG(1)[3484]> release an advisory lock on a database
%

うまくインストールできました。

まとめ: pkgのリモートリポジトリの日本向けミラーの調子が良くなかったのかなと思いました。この症状が発生するまでは問題なく利用できていたため一時的なものと思われるので、うまくダウンロードできるようになったら変更した設定ファイルを元に戻したいと思います。