山pの楽しいお勉強生活

勉強の成果を垂れ流していきます

通信速度が原因で「apt-get」が失敗する事がある

タイトルだけ見るとそりゃそうだろという話ではあるのですが、いきなり失敗するようになってかなりハマったのでメモ。 そもそも通信速度が原因という事に気づくまでにかなりの時間がかかった。

参考までに、状況が発生した環境で通信速度を調べたところ、1Mbps位でした。( fast.com で測定)

解決方法

apt-getのオプションでタイムアウトを指定する。

apt-get -o Acquire::http::Timeout="300" update

※指定時間の単位は「秒」との事

設定ファイルに書く場合

設定ファイルでの指定も可能(後述するがコマンドでのオプション指定よりこちらの方が良い)

  • ファイルPATH : /etc/apt/apt.conf.d
  • ファイル名 : 99timeout 何でも良いと思われる
Acquire::http::Timeout "300";
Acquire::ftp::Timeout "300";

Dockerfile

今回はdocker内で発生したため、Dockerfileのサンプルをメモ

FROM ubuntu:18.04

RUN /bin/echo -e "Acquire::http::Timeout \"300\";\n\
Acquire::ftp::Timeout \"300\";" >> /etc/apt/apt.conf.d/99timeout

RUN rm -rf /var/lib/apt/lists/* \
    && apt-get update \
    && apt-get -y install wget

※参考 : Dockerfileで複数行を改行付きでechoする際にハマったので共有しておきますubuntuのデフォルトシェルであるdashのbuild inされているechoだと echo -e は使えないので注意。(-e がそのままファイルに出力されてoptionエラーになる)

ログ

C:\Users\yamap55>docker run --rm -it ubuntu:18.04 /bin/bash
root@0bbdb818123f:/# apt-get update
Get:1 http://security.ubuntu.com/ubuntu bionic-security InRelease [88.7 kB]
Get:2 http://security.ubuntu.com/ubuntu bionic-security/restricted amd64 Packages [31.0 kB]
Get:3 http://security.ubuntu.com/ubuntu bionic-security/multiverse amd64 Packages [7641 B]
Get:4 http://security.ubuntu.com/ubuntu bionic-security/universe amd64 Packages [824 kB]
Get:5 http://security.ubuntu.com/ubuntu bionic-security/main amd64 Packages [836 kB]
Get:6 http://archive.ubuntu.com/ubuntu bionic InRelease [242 kB]
Get:7 http://archive.ubuntu.com/ubuntu bionic-updates InRelease [88.7 kB]
Get:8 http://archive.ubuntu.com/ubuntu bionic-backports InRelease [74.6 kB]
Get:9 http://archive.ubuntu.com/ubuntu bionic/multiverse amd64 Packages [186 kB]
Get:10 http://archive.ubuntu.com/ubuntu bionic/main amd64 Packages [1344 kB]
Ign:11 http://archive.ubuntu.com/ubuntu bionic/universe amd64 Packages
Get:12 http://archive.ubuntu.com/ubuntu bionic/restricted amd64 Packages [13.5 kB]
Get:13 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 Packages [1128 kB]
Get:14 http://archive.ubuntu.com/ubuntu bionic-updates/restricted amd64 Packages [44.7 kB]
Get:15 http://archive.ubuntu.com/ubuntu bionic-updates/multiverse amd64 Packages [11.7 kB]
Get:16 http://archive.ubuntu.com/ubuntu bionic-updates/universe amd64 Packages [1351 kB]
Get:17 http://archive.ubuntu.com/ubuntu bionic-backports/main amd64 Packages [2496 B]
Get:18 http://archive.ubuntu.com/ubuntu bionic-backports/universe amd64 Packages [4247 B]
Ign:11 http://archive.ubuntu.com/ubuntu bionic/universe amd64 Packages
Ign:11 http://archive.ubuntu.com/ubuntu bionic/universe amd64 Packages
Err:11 http://archive.ubuntu.com/ubuntu bionic/universe amd64 Packages
  Connection failed [IP: 91.189.88.24 80]
Fetched 6278 kB in 3min 24s (30.8 kB/s)
Reading package lists... Done
E: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/bionic/universe/binary-amd64/Packages  Connection failed [IP: 91.189.88.24 80]
E: Some index files failed to download. They have been ignored, or old ones used instead.

※ミラーに変更してもほぼ変わりませんでした

メモ

ログに出力されているURLについて

ログに出ている http://archive.ubuntu.com/ubuntu/dists/bionic/universe/binary-amd64/Packages にアクセスすると404になるため、サーバ側のエラーとかURLが変わったとか考えてしまった。 どうやら内部的には「Packages.gz」(もしくは「Packages.xz」)を取得しているようでこちらは存在する。( 親ディレクトリを確認するとわかる)

updateだけオプション指定してもinstallで同じように落ちるかも

updateで現象が発生した場合、コマンド実行時のオプションで解決したくなるが、実際にはupdateだけで終わる事はなく、その後installで同じように現象が発生する事となる。 勿論install 時にもオプション指定すれば解決ではあるが、このオプションが必要な場合は設定ファイルを配置するのがベターと思われる。(httpで指定が必要な場合、ftpも指定しておいた方が無難)

参考