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

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

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

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

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

apt-get 404 エラーRaw Code(S)Raw Code(T)
# 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: いくつかのインデックスファイルのダウンロードに失敗しました。これらは無視されるか、古いものが代わりに使われます。

対策方法

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 コマンドが使えるようになります。

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

リポジトリ・リストファイルである /etc/apt/sources.list の中身をとりあえず、old-releases.ubuntu.com に変えてみて、それでもダメだったら元に戻せばいいだけの話ですが、むやみに変更するよりは、変更してもいいかどうかを事前に確認できるとより確実に作業できるかなと思います。

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

changelogs : meta-releaseRaw Code(S)Raw Code(T)
・・・
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
ReleaseNotes: http://changelogs.ubuntu.com/EOLReleaseAnnouncement
UpgradeTool: http://old-releases.ubuntu.com/ubuntu/dists/utopic/main/dist-upgrader-all/current/utopic.tar.gz
UpgradeToolSignature: http://old-releases.ubuntu.com/ubuntu/dists/utopic/main/dist-upgrader-all/current/utopic.tar.gz.gpg
・・・

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

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

変更前 : /etc/apt/sources.listRaw Code(S)Raw Code(T)
# 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 3. バックアップ、及び置換

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

置換えは、sed コマンド一発で実施します。

リポジトリ置換Raw Code(S)Raw Code(T)
# cp -p /etc/apt/sources.list /etc/apt/sources.list.org

# sed -i -e 's/jp.archive.ubuntu.com\|security.ubuntu.com/old-releases.ubuntu.com/g' /etc/apt/sources.list

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

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

変更後 : /etc/apt/sources.listRaw Code(S)Raw Code(T)
# 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 5. apt-get update してみる

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

リポジトリ置換Raw Code(S)Raw Code(T)
# 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 コマンドが使えるようになりましたが、あくまで一時的な処置として考えたほうが良いです。

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

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

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

lsb_release オプション確認Raw Code(S)Raw Code(T)
# 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 バージョン確認Raw Code(S)Raw Code(T)
# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 14.10
Release:        14.10
Codename:       utopic

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

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