古い CentOS で YumRepo Error が出た時の対処法

古い CentOS で `yum upgrade` などを実行した際、`YumRepo Error: ... (略) ... Cannot find a valid baseurl for repo: base` のようなエラーが発生してしまった場合の対処法です。

ググれば情報はたくさん見つかるのですが、色んな情報が錯綜していて分かりにくかったため、改めてまとめておきます。

記事は CentOS 6.10 を対象に書いていますが、他のバージョンでも応用が効くと思います。

--------------------------------------------------------------------------------

## エラー内容

Google 等から検索してくる人のために、エラー文を長めにコピペしておきます。

```bash
$ yum upgrade

YumRepo Error: All mirror URLs are not using ftp, http[s] or file.
 Eg. Invalid release/repo/arch combination/
removing mirrorlist with no valid mirrors: /var/cache/yum/x86_64/6/base/mirrorlist.txt
Error: Cannot find a valid baseurl for repo: base
```

--------------------------------------------------------------------------------

### 原因

Yum リポジトリの設定で、`[base]` に書かれたデータ取得先 URL がおかしいよ…と教えてくれています。

**CentOS 6 系 は 2020年11月30日にサポートが終了された**ため、デフォルトの設定が使えなくなってしまったわけです。

--------------------------------------------------------------------------------

### 対応

- http://vault.centos.org/

上記から適切な URL を探し、設定しなおせば良いです。

なお、この手の URL で `vault` というサブドメインが付いていたら、**サポートが終わった**データのスナップショットを保管している場所…みたいな意味になります。

例えば、私の大好きなゲーム Fallout シリーズに登場する地下核シェルターに Vault○○ という名前が付いていたり、地下にあるワイン貯蔵庫の事を Wine Vault と呼んだりもしますね。

--------------------------------------------------------------------------------

## 具体的な修正方法

Yum リポジトリの設定は、`/etc/yum.repos.d/` 以下にあります。

`[base]` の URL は `CentOS-Base.repo` というファイルに記述されていますので、元の URL を `#` でコメントアウトし、適切な URL を追記します。

```bash
$ vi /etc/yum.repos.d/CentOS-Base.repo

[base]
# mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
# baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
baseurl=http://vault.centos.org/centos/$releasever/os/$basearch/
```

--------------------------------------------------------------------------------

### 補足

なお、`$releasever` や `$basearch` といった変数の意味については、`yum info centos-release` の結果を見るのが手っ取り早いです。

```bash
$ yum info centos-release

Name        : centos-release
Arch        : x86_64
Version     : 6
From repo   : base
```

より詳細は、[適当な Red Hat 系のドキュメント](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/deployment_guide/sec-using_yum_variables)を参考にしてください。

つまり、修正後の `http://vault.centos.org/centos/$releasever/os/$basearch/` は、私の環境であれば http://vault.centos.org/centos/6/os/x86_64/ と同じ意味になり、アクセスすると実際にデータ存在する事が分かります。

逆に、修正前の `http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra` は、私の環境であれば http://mirrorlist.centos.org/?release=6&arch=x86_64&repo=os&infra=stock と同じ意味になり、アクセスすると無効である事が分かります。

--------------------------------------------------------------------------------

## 修正内容まとめ

修正後にもう一度コマンドを実行すると、今度は `Error: Cannot find a valid baseurl for repo: updates` といったエラー内容に変化すると思います。

この場合、`[updates]` の URL もおかしいという事になりますが、1 つ 1 つ確認＆修正するのは手間だと思いますので、まとめて書いておきます。

```bash
$ vi /etc/yum.repos.d/CentOS-Base.repo

[base]
# mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
# baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
baseurl=http://vault.centos.org/centos/$releasever/os/$basearch/

[updates]
# mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates&infra=$infra
# baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/
baseurl=http://vault.centos.org/centos/$releasever/updates/$basearch/

[extras]
# mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras&infra=$infra
# baseurl=http://mirror.centos.org/centos/$releasever/extras/$basearch/
baseurl=http://vault.centos.org/centos/$releasever/extras/$basearch/

[centosplus]
# mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus&infra=$infra
# baseurl=http://mirror.centos.org/centos/$releasever/centosplus/$basearch/
baseurl=http://vault.centos.org/centos/$releasever/centosplus/$basearch/

[contrib]
# mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=contrib&infra=$infra
# baseurl=http://mirror.centos.org/centos/$releasever/contrib/$basearch/
baseurl=http://vault.centos.org/centos/$releasever/contrib/$basearch/
```

--------------------------------------------------------------------------------

### 追加の修正

もし、上記の修正を行ってもなお `Error: Cannot find a valid baseurl for repo: centos-sclo-rh` といったエラーが出る際は、`[centos-sclo-rh]` の記述があるファイルを探して同様に修正します。

```bash
$ vi /etc/yum.repos.d/CentOS-SCLo-scl-rh.repo

[centos-sclo-rh]
# baseurl=http://mirror.centos.org/centos/6/sclo/$basearch/rh/
# mirrorlist=http://mirrorlist.centos.org?arch=$basearch&release=6&repo=sclo-rh
baseurl=http://vault.centos.org/centos/$releasever/sclo/$basearch/rh/
```

`Error: Cannot find a valid baseurl for repo: centos-sclo-sclo` というエラーであれば、`[centos-sclo-sclo]` の記述があるファイルを探して同様に修正します。

```bash
$ vi /etc/yum.repos.d/CentOS-SCLo-scl.repo

[centos-sclo-sclo]
# baseurl=http://mirror.centos.org/centos/6/sclo/$basearch/sclo/
# mirrorlist=http://mirrorlist.centos.org?arch=$basearch&release=6&repo=sclo-sclo
baseurl=http://vault.centos.org/centos/$releasever/sclo/$basearch/sclo/
```

エラーが出なくなるまで修正すれば OK です。