【yum】yumが動かないときの簡易対処方法集（IOError、Trying other mirror、Determining fastest mirrors、フリーズ等）

#何か昔同じタイトルの記事を見たことあるって人へ
この記事は昔やってたブログの記事の移植です。
昔の内容で有用そうなものをQiitaに少し修正を加えて移植してます(現在進行形で)。

#概要
yumが正常に動作しない場合には様々な理由がある。

ちゃんと学べば判るといってもとりあえずinstallしたいものがあってyum installしたいのに、
全く動かないから１から全てyumについて学ぶのは場合によっては最善とは言い難い。
というより大抵の場合は適当に、例えばキャッシュクリアしたら動くならそれだけやって特に原因は判らないけれど動かせれば良いというケースが多いと思う。

この記事はそんな人の為の簡易対処方法集、助けになれば幸い。
まぁ主に自分用というか動かなくなったときひたすら手を尽くした際のメモだったりする・・・

#rootで実行する
yumはrootで実行すべき。

**その際sudo yumでは駄目。必ずsudo -s等で先にrootになった状態でyumすること。**

理由は判らないけどこれで一度はまったことがあるので少なくとも上記が原因でyumが動かないケースがあるのは間違いない。

(追記)
後ろの方に追記したけど、rootにした際に環境変数のhttp_proxyが設定が引き継がれていないとか引き継がれているとかが問題だったことが判明したので、正しく設定できてればrootでなくてもいいのかもしれない。

#yumで見に行くミラーの変更

CentOSの場合ミラーの指定先ファイルは

> etc/yum.repos.d/CentOS-Base.repo

にある

詳しくは判らないけどこのファイルのbase urlを変更すれば良い。

日本にいる人なら日本のリポジトリの方が繋がりやすいのでタイムアウトを防ぎやすいんじゃないだろうか。
タイムアウト系でbase urlが海外のリポジトリになってると割とこの手のエラーが起こりやすく何度かこれで治った事がある。

以下参考までにyumがフリーズするようになり修正して動くようになった CentOS-Base.repo を上げておく。

```CentOS-Base.repo
# CentOS-Base.repo
#
# The mirror system uses the connecting IP address of the client and the
# update status of each mirror to pick mirrors that are updated to and
# geographically close to the client.  You should use this for CentOS updates
# unless you are manually picking other mirrors.
#
# If the mirrorlist= does not work for you, as a fall back you can try the 
# remarked out baseurl= line instead.
#
#

[base]
name=CentOS-$releasever - Base
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
baseurl=http://ftp.riken.jp/Linux/centos/$releasever/os/$basearch/
　　　　http://ftp.jaist.ac.jp/Linux/centos/$releasever/os/$basearch/
　　　　http://ftp.iij.ad.jp/Linux/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5
priority=1

#released updates 
[updates]
name=CentOS-$releasever - Updates
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates
#baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/
baseurl=http://ftp.riken.jp/Linux/centos/$releasever/os/$basearch/
　　　　http://ftp.jaist.ac.jp/Linux/centos/$releasever/os/$basearch/
　　　　http://ftp.iij.ad.jp/Linux/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5
priority=1

#additional packages that may be useful
[extras]
name=CentOS-$releasever - Extras
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras
#baseurl=http://mirror.centos.org/centos/$releasever/extras/$basearch/
baseurl=http://ftp.riken.jp/Linux/centos/$releasever/os/$basearch/
　　　　http://ftp.jaist.ac.jp/Linux/centos/$releasever/os/$basearch/
　　　　http://ftp.iij.ad.jp/Linux/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5
priority=2

#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-$releasever - Plus
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus
#baseurl=http://mirror.centos.org/centos/$releasever/centosplus/$basearch/
baseurl=http://ftp.riken.jp/Linux/centos/$releasever/os/$basearch/
　　　　http://ftp.jaist.ac.jp/Linux/centos/$releasever/os/$basearch/
　　　　http://ftp.iij.ad.jp/Linux/centos/$releasever/os/$basearch/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5
priority=1

#contrib - packages by Centos Users
[contrib]
name=CentOS-$releasever - Contrib
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=contrib
#baseurl=http://mirror.centos.org/centos/$releasever/contrib/$basearch/
baseurl=http://ftp.riken.jp/Linux/centos/$releasever/os/$basearch/
　　　　http://ftp.jaist.ac.jp/Linux/centos/$releasever/os/$basearch/
　　　　http://ftp.iij.ad.jp/Linux/centos/$releasever/os/$basearch/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5
priority=2
```


#日本のミラーだけ見に行くように設定する

include_only=.jpを指定する事でfastestmirrorで日本のミラーだけを取得する方法もある。
試しても良いけど自分の場合これは解決には至らず意味が無かった。
CentOS5の場合次のファイル

> /etc/yum/pluginconf.d/fastestmirror.conf

の一番最後の行に

> include_only=.jp

を追加すれば良い。

#fastestmirrorを切る

> Determining fastest mirrors

ってエラーが出ている場合fastestmirrorが原因で動かなくなってる可能性があるのでこれでうまく行くことがあると思う。
CentOS5の場合次のファイル

> /etc/yum/pluginconf.d/fastestmirror.conf

のenabledを

> enabled=0

にすればよい。
まぁ意味なかったけど。Determining fastest mirrorsはでなくなったけどその後でフリーズしたし。

#ポートが開いてない
稀にあるのかなぁ。port 80が開いていないとyumできない。
ファイヤーウォールの設定を見直せば良い。
自分のとこは普通に開いてたけどね・・・

#IPで規制されてる
社内のネットワークの管理にもよるけどIPで規制されてる場合があるというのを見たことがある。
確認した方が良いかもしれない。
自分は問題なかったけどね・・・

#タイムアウトを長くする
接続中に時間が掛かり過ぎてtime outって文字が出てきてたらタイムアウトしてる。
この際の対処として有効な場合があるらしい。自分の場合そもそも全く通信できて無い様子だったで数値をどれだけ長くしても何の意味もなかった・・・

というかこの場合はタイムアウトを長くするのではなく上述のミラーを変更する対処を行ったほうが良いと思う。

> /etc/yum.conf

の

> timeout=なんたら

のなんたらの数値を変更する。無い場合は追加する。


#キャッシュやロックファイルのクリア
最もよく言われているもの。
とりあえず先にこれを試した方が良いけど、こんな辺境の地にある記事を見るってことは相当色々手を尽くして駄目だった人なはずなので説明する必要もない気がする。

まぁこれやってもだめだよね、判る。もう手を尽くし切った最後の方ではクリアする事に苛立ちすら覚えたのでこれで動くだなんて絶対に期待しないこと。

以下CentOS5の場合。

```bash
# 削除
$ sudo rm -f /var/run/yum.pid

# ロックファイルっぽい何かを削除.
$ sudo rm -rf /var/lib/rpm/__db.00?
$ sudo rpm --rebuilddb
$ sudo yum clean all
```

#xen環境では最もrootに近いアカウントで実行する事
今回最大の原因、これではまった。それも半年くらい悩みに悩み続けた。

xen環境ではどうやらある特定のユーザーではsudoでrootをとってもyumに失敗し続ける事がある。事があるというか実際に起きていてこの問題の為に半年近く悩まされたわけで・・・

アカウントの権限に問題があるのでは？と思うかもしれないがyumに成功する日もあれば何をしてもダメな日もあるので原因は違う模様。まぁ最終的には何をしても動かなくなったんだけど。

んで何をすれば良いかと言うとxen環境を構築した人のアカウントでyumすれば何の問題も無く実行できる。構築したアカウントというかrootというか、確かな情報では無いけどyumができないアカウントと別のアカウントならもしかしたらどのアカウントでもyumできるんじゃないか？とも思わなくも無い。

そしてこれに気づいてからは今のところ一度としてエラーが起きていない。
今まで動かなかったのがウソのようだ・・・

というわけでxen環境でyumに失敗する人は上記の点に要注意。

#追記
yumだけでなくwget等も動かないことに気付き、色々とあった結果、最終的に環境変数のhttp_proxyが設定されていないのが原因だということが判りました・・・