apt-get update が 404 エラーで失敗する

apt-get update コマンドでリポジトリを更新しようとしたら 404 エラーで失敗。

今までは、ずっと問題なく使えてたのに。。

Ubuntu とか Debian 環境などで apt-get を使ってる人なら一度は経験したであろう apt-get 404 問題 です。

今まで問題なく使えてた apt-get コマンドがある日突然、 404 エラーで使えなくなったら、今現在使っている Ubuntu の OS バージョンがもう古くなったという証拠 です。

apt-get 404 エラー (utopic の例)
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
# apt-get update
無視 http://jp.archive.ubuntu.com utopic InRelease
無視 http://jp.archive.ubuntu.com utopic-updates InRelease
無視 http://jp.archive.ubuntu.com utopic-backports InRelease
 
・・・
 
エラー http://jp.archive.ubuntu.com utopic-backports/restricted i386 Packages
  404  Not Found
エラー http://jp.archive.ubuntu.com utopic-backports/universe i386 Packages
  404  Not Found
エラー http://jp.archive.ubuntu.com utopic-backports/multiverse i386 Packages
  404  Not Found
 
・・・
 
W: http://security.ubuntu.com/ubuntu/dists/utopic-security/restricted/binary-i386/Packages の取得に失敗しました  404  Not Found
W: http://security.ubuntu.com/ubuntu/dists/utopic-security/universe/binary-i386/Packages の取得に失敗しました  404  Not Found
W: http://security.ubuntu.com/ubuntu/dists/utopic-security/multiverse/binary-i386/Packages の取得に失敗しました  404  Not Found
 
E: いくつかのインデックスファイルのダウンロードに失敗しました。これらは無視されるか、古いものが代わりに使われます。

場合によっては、404 だけではなく、503 エラーで失敗するときもあります。

apt-get 503 エラー (vivid の例)
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# apt-get update
無視 http://jp.archive.ubuntu.com|security.ubuntu.com vivid Release
無視 http://jp.archive.ubuntu.com|security.ubuntu.com vivid-updates Release
無視 http://jp.archive.ubuntu.com|security.ubuntu.com vivid-backports Release
無視 http://jp.archive.ubuntu.com|security.ubuntu.com vivid-security Release
 
・・・
 
エラー http://jp.archive.ubuntu.com|security.ubuntu.com vivid/main amd64 Packages
  503  Service Unavailable
エラー http://jp.archive.ubuntu.com|security.ubuntu.com vivid/restricted amd64 Packages
  503  Service Unavailable
エラー http://jp.archive.ubuntu.com|security.ubuntu.com vivid/universe amd64 Packages
  503  Service Unavailable
エラー http://jp.archive.ubuntu.com|security.ubuntu.com vivid/multiverse amd64 Packages
 
・・・
 
W: http://jp.archive.ubuntu.com|security.ubuntu.com/ubuntu/dists/vivid-updates/main/binary-amd64/Packages の取得に失敗しました  503  Service Unavailable
W: http://jp.archive.ubuntu.com|security.ubuntu.com/ubuntu/dists/vivid-updates/restricted/binary-amd64/Packages の取得に失敗しました  503  Service Unavailable
W: http://jp.archive.ubuntu.com|security.ubuntu.com/ubuntu/dists/vivid-updates/universe/binary-amd64/Packages の取得に失敗しました  503  Service Unavailable
W: http://jp.archive.ubuntu.com|security.ubuntu.com/ubuntu/dists/vivid-updates/multiverse/binary-amd64/Packages の取得に失敗しました  503  Service Unavailable
 
E: いくつかのインデックスファイルのダウンロードに失敗しました。これらは無視されるか、古いものが代わりに使われます。

対策方法

Ubuntu の場合、サポート期限が終了したバージョンに関しては、リポジトリの URL が 「old-releases.ubuntu.com」 に変わります

そのため、上記の例でいうと、http://jp.archive.ubuntu.comhttp://security.ubuntu.com からそんなパッケージは見つからないよーと怒られたんですね。

解決方法は、リポジトリリスト管理ファイル /etc/apt/sources.list 内に記載されている jp.archive.ubuntu.comsecurity.ubuntu.comold-releases.ubuntu.com に置換えると今まで通りに、apt-get コマンドが使えるようになります。

リポジトリ・リストを変更するべきか判断する

しかし、apt-get が失敗する理由は、必ずしも sources.list にあるとは限りません。

実際に、古いリリースを使ってるわけでもないのに、発生することもあります。

なので、むやみに sources.list を置換えるよりは、まずは 自分か使ってる環境で、sources.list を置換えるべきか確かめる必要があります。

判断ポイント その1. メタリリース (meta-release) の URL を確認する

メタリリースファイルには、Ubuntu 04.01 (warty) を始め、最新のリリースまで、主に以下の情報が含まれています。

  • コード名
  • バージョン
  • リリース日
  • サポートの有無
  • ディスクリプション
  • リリースファイルの URL
  • リリースノートの URL
  • アップグレードツールの URL
  • アップグレードツールの URL (証明書)

特に、Ubuntu をアップグレードする際には、OS 側でこのメタリリース情報を参照するようになっています。

もし、上記のメタリリースファイルを確認した結果、自分が使ってるバージョンの URL が old-releases に変わっていたら、/etc/apt/sources.list をそれに合わせて変更するべきです。

また、メタリリースファイル上の URL が old-releases に変わっていなくても、ブラウザから接続したときに Not Found が表示されたら old-releases に移動されたことになるので、これに関しても /etc/apt/sources.list を置換える必要があります。

  • line 08,10,11 : URL 自体が old-releases なので、100% old-releases
  • line 19,21,22 : 見た目は archive、ブラウザ接続してみると 404 なので、old-releases
Codename 確認
1
2
3
4
5
6
# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 14.10
Release:        14.10
Codename:       utopic
changelogs : meta-release
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
・・・
Dist: utopic
Name: Utopic Unicorn
Version: 14.10
Date: Thu, 23 Oct 2014 14:10:00 UTC
Supported: 0
Description: This is the 14.10 release
Release-File: http://old-releases.ubuntu.com/ubuntu/dists/utopic/Release    #### 100% old-releases
ReleaseNotes: http://changelogs.ubuntu.com/EOLReleaseAnnouncement
UpgradeTool: http://old-releases.ubuntu.com/ubuntu/dists/utopic/main/dist-upgrader-all/current/utopic.tar.gz    #### 100% old-releases
UpgradeToolSignature: http://old-releases.ubuntu.com/ubuntu/dists/utopic/main/dist-upgrader-all/current/utopic.tar.gz.gpg    #### 100% old-releases
 
Dist: vivid
Name: Vivid Vervet
Version: 15.04
Date: Thu, 23 April 2015 15:04:00 UTC
Supported: 0
Description: This is the 15.04 release
Release-File: http://archive.ubuntu.com/ubuntu/dists/vivid/Release    #### 接続 → 表示されなかったら old-releases
ReleaseNotes: http://changelogs.ubuntu.com/EOLReleaseAnnouncement
UpgradeTool: http://archive.ubuntu.com/ubuntu/dists/vivid-updates/main/dist-upgrader-all/current/vivid.tar.gz    #### 接続 → 表示されなかったら old-releases
UpgradeToolSignature: http://archive.ubuntu.com/ubuntu/dists/vivid-updates/main/dist-upgrader-all/current/vivid.tar.gz.gpg    #### 接続 → 表示されなかったら old-releases
・・・

アーカイブの URL がちゃんと archive.ubuntu.com/hoge-hoge になっているものの、いざ接続してみると Not Found という落とし穴

archive.ubuntu.com → old-releases.ubuntu.com に書換えて接続してみると ちゃんと表示されることが分かりますので、くれぐれもご注意を。

判断ポイント その2. 直接 Archive と Old-Releases の URL を確認する

一番手っ取り早いのは、直接 アーカイブ サイトオールド・リリース サイト の URL へ接続してみることです。

Ubuntu : Codename 確認
1
2
# lsb_release -c
Codename:       utopic

もし、archive.ubuntu.com に自分が使っている OS の Codename が入ってなくて、さらに、 old-releases.ubuntu.com に移動されてる場合には、sources.list の書換えが必要です。

対策 その1. リポジトリ・リストの置換えは不要と判断した場合

メタリリースファイルを確認した結果、sources.list の置換えは不要と判断した場合には、他に原因があるので、以下を試して見てください。

Step 1. apt-get キャッシュクリア

通常、apt-get はパッケージ情報を以下のディレクトリ内にキャッシュします。

apt-get dist-upgrade のようなコマンドでアップグレードを実行すると ここに数多くのファイルがダウンロードされることになります。

apt-get によってキャッシュされたファイル
1
2
3
4
5
6
# ls -l /var/cache/apt/archives
total 188812
-rw-r--r-- 1 root root    60012  5月 14  2015 accountsservice_0.6.37-1ubuntu10.1_amd64.deb
-rw-r--r-- 1 root root    37876 10月 24  2014 acl_2.2.52-2_amd64.deb
-rw-r--r-- 1 root root    36656 11月  3  2014 acpid_1%3a2.0.23-1ubuntu1_amd64.deb
・・・

アップグレード時には、このキャッシュを元にファイルをダウンロードしますが、このキャッシュが原因で apt-get update がうまく行かない場合もあります。

なので、切り分けのためにも、キャッシュはキレイに削除します。

一応、以下の 2種類ありますが、後者の方が宜しいかと。

  • apt-get autoclean (アーカイブファイルの削除 : 使ってないパッケージのみ削除)
  • apt-get clean (アーカイブファイルの削除 : 全て削除)
キャッシュされた全てのアーカイブファイルの削除
1
# apt-get clean

Step 2. パッケージリスト削除

実際に、キャッシュをクリアするだけで直る場合もありますが、念のため、追加でパッケージリストも削除します。

以下のパッケージリスト削除コマンドは、パッケージリスト削除のみならず、たまに発生する E: ロック /var/lib/apt/lists/lock が取得できませんでした - open (11: リソースが一時的に利用できません) というエラー対策時にも使えます。

パッケージリスト削除
1
# rm -rf /var/lib/apt/lists/*

Step 3. apt-get update してみる

後は、apt-get を実行し、パッケージリストの更新を試してみてください。

パッケージリスト更新
01
02
03
04
05
06
07
08
09
10
11
12
# apt-get update
取得:1 http://old-releases.ubuntu.com utopic Release.gpg [933 B]
取得:2 http://old-releases.ubuntu.com utopic-updates Release.gpg [933 B]
取得:3 http://old-releases.ubuntu.com utopic-backports Release.gpg [933 B]
 
・・・
 
取得:76 http://old-releases.ubuntu.com utopic-security/multiverse Translation-en [2,038 B]
取得:77 http://old-releases.ubuntu.com utopic-security/restricted Translation-en [2,268 B]
取得:78 http://old-releases.ubuntu.com utopic-security/universe Translation-en [46.3 kB]
32.5 MB を 1分 3秒 で取得しました (514 kB/s)
パッケージリストを読み込んでいます... 完了

対策 その2. リポジトリ・リストの置換えが必要と判断した場合

メタリリースファイルを確認した結果、sources.list の置換えが必要と判断した場合には、以下を実施します。

Step 1. 変更前のリポジトリ確認

まずは、現在のリポジトリリストを確認します。

変更前 : /etc/apt/sources.list
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# cat /etc/apt/sources.list | grep -v "^#"
deb http://jp.archive.ubuntu.com/ubuntu/ utopic main restricted
deb-src http://jp.archive.ubuntu.com/ubuntu/ utopic main restricted
 
deb http://jp.archive.ubuntu.com/ubuntu/ utopic-updates main restricted
deb-src http://jp.archive.ubuntu.com/ubuntu/ utopic-updates main restricted
 
deb http://jp.archive.ubuntu.com/ubuntu/ utopic universe
deb-src http://jp.archive.ubuntu.com/ubuntu/ utopic universe
deb http://jp.archive.ubuntu.com/ubuntu/ utopic-updates universe
deb-src http://jp.archive.ubuntu.com/ubuntu/ utopic-updates universe
 
deb http://jp.archive.ubuntu.com/ubuntu/ utopic multiverse
deb-src http://jp.archive.ubuntu.com/ubuntu/ utopic multiverse
deb http://jp.archive.ubuntu.com/ubuntu/ utopic-updates multiverse
deb-src http://jp.archive.ubuntu.com/ubuntu/ utopic-updates multiverse
 
deb http://jp.archive.ubuntu.com/ubuntu/ utopic-backports main restricted universe multiverse
deb-src http://jp.archive.ubuntu.com/ubuntu/ utopic-backports main restricted universe multiverse
 
deb http://security.ubuntu.com/ubuntu utopic-security main restricted
deb-src http://security.ubuntu.com/ubuntu utopic-security main restricted
deb http://security.ubuntu.com/ubuntu utopic-security universe
deb-src http://security.ubuntu.com/ubuntu utopic-security universe
deb http://security.ubuntu.com/ubuntu utopic-security multiverse
deb-src http://security.ubuntu.com/ubuntu utopic-security multiverse

Step 2. バックアップ、及び置換

念のため、sources.list をバックアップしてから全ての jp.archive.ubuntu.comsecurity.ubuntu.comold-releases.ubuntu.com に置換えます。

ちなみに、この例では、アーカイブの URL が jp.archive.ubuntu.com になっているのですが、環境によっては jp. が付いてなかったりします

というわけで、置換えは jp. 有り無し関係なく使えるようにしたので、以下の sed コマンドを一発実行するだけで良いです。 (正規表現的にもっと短くすることも可能ですが、一つ一つ明示的に記述ました)

リポジトリ置換
1
2
3
# cp -p /etc/apt/sources.list /etc/apt/sources.list.org
 
# sed -i -e 's/jp.archive.ubuntu.com\|archive.ubuntu.com\|security.ubuntu.com/old-releases.ubuntu.com/g' /etc/apt/sources.list

Step 3. 変更後のリポジトリ確認

置換えが終わったら問題なく置換えられたか確認します。

変更後 : /etc/apt/sources.list
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# cat /etc/apt/sources.list | grep -v "^#"
deb http://old-releases.ubuntu.com/ubuntu/ utopic main restricted
deb-src http://old-releases.ubuntu.com/ubuntu/ utopic main restricted
 
deb http://old-releases.ubuntu.com/ubuntu/ utopic-updates main restricted
deb-src http://old-releases.ubuntu.com/ubuntu/ utopic-updates main restricted
 
deb http://old-releases.ubuntu.com/ubuntu/ utopic universe
deb-src http://old-releases.ubuntu.com/ubuntu/ utopic universe
deb http://old-releases.ubuntu.com/ubuntu/ utopic-updates universe
deb-src http://old-releases.ubuntu.com/ubuntu/ utopic-updates universe
 
deb http://old-releases.ubuntu.com/ubuntu/ utopic multiverse
deb-src http://old-releases.ubuntu.com/ubuntu/ utopic multiverse
deb http://old-releases.ubuntu.com/ubuntu/ utopic-updates multiverse
deb-src http://old-releases.ubuntu.com/ubuntu/ utopic-updates multiverse
 
deb http://old-releases.ubuntu.com/ubuntu/ utopic-backports main restricted universe multiverse
deb-src http://old-releases.ubuntu.com/ubuntu/ utopic-backports main restricted universe multiverse
 
deb http://old-releases.ubuntu.com/ubuntu utopic-security main restricted
deb-src http://old-releases.ubuntu.com/ubuntu utopic-security main restricted
deb http://old-releases.ubuntu.com/ubuntu utopic-security universe
deb-src http://old-releases.ubuntu.com/ubuntu utopic-security universe
deb http://old-releases.ubuntu.com/ubuntu utopic-security multiverse
deb-src http://old-releases.ubuntu.com/ubuntu utopic-security multiverse

Step 4. apt-get update してみる

後は、apt-get コマンドが使えるかどうか確認するために、# apt-get update を実行し、パッケージリストを更新します。

パッケージリスト更新
01
02
03
04
05
06
07
08
09
10
11
12
# apt-get update
取得:1 http://old-releases.ubuntu.com utopic Release.gpg [933 B]
取得:2 http://old-releases.ubuntu.com utopic-updates Release.gpg [933 B]
取得:3 http://old-releases.ubuntu.com utopic-backports Release.gpg [933 B]
 
・・・
 
取得:76 http://old-releases.ubuntu.com utopic-security/multiverse Translation-en [2,038 B]
取得:77 http://old-releases.ubuntu.com utopic-security/restricted Translation-en [2,268 B]
取得:78 http://old-releases.ubuntu.com utopic-security/universe Translation-en [46.3 kB]
32.5 MB を 1分 3秒 で取得しました (514 kB/s)
パッケージリストを読み込んでいます... 完了

apt-get update は、一回実行しておくことをオススメ

全ての URL を old-releases.ubuntu.com に変更したにも関わらず、パッケージをインストールしようとすると以下のようなエラーで失敗することがあります。

# apt-get install <package-name>

以下のパッケージには満たせない依存関係があります:

・・・

E: 問題を解決することができません。壊れた変更禁止パッケージがあります。

そのときには、パッケージリストを更新すると直るので、URL の変更が終わったら # apt-get update を一回実行しておくことか、または パッケージをインストールする際には、直前に # apt-get update を実行することをオススメします。

もし、これでダメだったら 追加で 対策 その1. を試してみると良いと思います。

終わりに

これで、今まで通りに apt-get コマンドが使えるようになりましたが、あくまで一時的な処置として考えたほうが良いです。

そんなことはないと思いますが、もし ある日を境に old-releases.ubuntu.com が使えなくなってしまった場合には、他の Mirror サイトを探す必要があるかなと思います。

そう簡単に最新バージョンにアップデートできない環境もあると思いますが、そうでない場合には、なるべく、最新バージョンにアップデートすることをオススメします。

5年間に渡りセキュリティアップデートを提供する LTS 版 (長期サポート版) を使うのも一つの手かもしれないですね。

Ubuntu のリリース時期とサポート期間については、以下の URL から確認できます。

また、現在使っている Ubuntu のバージョン情報は lsb_release コマンドで確認できますので、ご参考までに。

lsb_release オプション確認
01
02
03
04
05
06
07
08
09
10
11
12
# lsb_release -help
Usage: lsb_release [options]
 
Options:
  -h, --help         show this help message and exit
  -v, --version      show LSB modules this system supports
  -i, --id           show distributor ID
  -d, --description  show description of this distribution
  -r, --release      show release number of this distribution
  -c, --codename     show code name of this distribution
  -a, --all          show all of the above information
  -s, --short        show requested information in short format
Ubuntu バージョン確認
1
2
3
4
5
6
# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 14.10
Release:        14.10
Codename:       utopic

以上、apt-get が 404 Not Found エラーで失敗する でした。