【原因と解決策】cannot find a valid baseurl for repo base 7 x86_64【CentOS yumエラー】

VirtualboxとVagrantで構築したCentOS7にて、yum updateyum install をしようとしたら、以下のようなエラーが発生したことはないでしょうか。

Cannot find a valid baseurl for repo: base/7/x86_64

Could not retrieve mirrorlist xxxxx

Could not resolve host: xxxxx

このようなエラーが発生した場合の原因・解決方法について説明します。

【解決方法とエラー詳細】cannot find a valid baseurl for repo base 7 x86_64

【解決方法1】インターネットに接続されているか確認する

まずping 8.8.8.8 などで正常にインターネットに接続できているか確認しましょう。

【解決方法2】DNS(ドメイン名の名前解決)が設定されているか確認する

インターネット接続に問題がないのであれば、ドメイン名の名前解決(ドメイン名からIPアドレスへの変換)が出来ていない可能性が高いです。

nmcli(Network Manager CLI)コマンドでDNS設定を行いましょう。

【エラー詳細】cannot find a valid baseurl for repo base 7 x86_64

yum update  や yum install [パッケージ名] でアップデートやインストールをしようとしたら、エラーが発生。

長々と書かれたエラーメッセージの最後に、

Cannot find a valid baseurl for repo: base/7/x86_64

とありました。

[root@somehost]# yum update
Loaded plugins: fastestmirror
Determining fastest mirrors
Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=7&arch=x86_64&repo=os&infra=vag error was
14: curl#6 - "Could not resolve host: mirrorlist.centos.org; Unknown error"


 One of the configured repositories failed (Unknown),
 and yum doesn't have enough cached data to continue. At this point the only
 safe thing yum can do is fail. There are a few ways to work "fix" this:

     1. Contact the upstream for the repository and get them to fix the problem.

     2. Reconfigure the baseurl/etc. for the repository, to point to a working
        upstream. This is most often useful if you are using a newer
        distribution release than is supported by the repository (and the
        packages for the previous distribution release still work).

     3. Run the command with the repository temporarily disabled
            yum --disablerepo= ...

     4. Disable the repository permanently, so yum won't use it by default. Yum
        will then just ignore the repository until you permanently enable it
        again or use --enablerepo for temporary usage:

            yum-config-manager --disable 
        or
            subscription-manager repos --disable=

     5. Configure the failing repository to be skipped, if it is unavailable.
        Note that yum will try to contact the repo. when it runs most commands,
        so will have to try and fail each time (and thus. yum will be be much
        slower). If it is a very temporary problem though, this is often a nice
        compromise:

            yum-config-manager --save --setopt=.skip_if_unavailable=true

Cannot find a valid baseurl for repo: base/7/x86_64
[root@somehost]# 

【環境】CentOS7

  • OS:CentOS7
    CentOS Linux release 7.6.1810 (Core))
  • OSについて
    – VirtualBox と Vagrant で構築した仮想マシン
    – ホストOSはWindows10

【原因】DNS設定(ドメイン名の名前解決)ができてない

CentOSがパッケージのアップデート先やインストール先のIPアドレスが分からないと怒っているためです。

専門的に言うと、DNS設定をしていない or DNS設定が正しくできていないため、ドメイン名の名前解決ができないことが原因です。

今回の場合、

"Could not retrieve mirrorlist http://mirrorlist.centos.org/?"

"Could not resolve host: mirrorlist.centos.org; Unknown error"

というエラーメッセージもあります。

mirrorlist.centos.orgというドメイン名の名前解決ができていないのですね。

ドメイン名の名前解決とは?

ドメイン名をIPアドレスに変換することです。

例えば、google.com は 216.58.197.174 です。

ドメイン名を名前解決する際には、クライアントからDNSサーバーに問い合わせを行います。

【動作確認】pingで接続確認してみる

IPアドレスでpingはOKだけど・・・

[root@somehost]# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=114 time=67.9 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=114 time=61.7 ms
^C
--- 8.8.8.8 ping statistics ---
3 packets transmitted, 2 received, 33% packet loss, time 2004ms

ドメイン名だとNGです。

[root@somehost]# ping google.com
ping: google.com: Name or service not known

[root@somehost]# ping mirrorlist.centos.org
ping: mirrorlist.centos.org: Name or service not known

【解決方法を詳しく】nmcliコマンドでDNS設定

DNS設定を行ってドメイン名の名前解決ができるようにしてあげましょう。

ネットワークに関する設定ファイルを直接編集でも出来ますが、CentOS7ではnmcli (Network Manager CLI)コマンドを使うことが推奨されてます。

DNSサーバーのIPアドレスには「8.8.8.8」を使います。

MEMO

IPアドレス「8.8.8.8」は、Googleが2009年にスタートしたパブリックDNSサービス(Google Public DNS)です。

このDNSアドレスを設定す ると速度向上やセキュリティ対策に良いとされています。

インタフェース名から「Connection」の名前を調べる

私の環境ではeth1のCONNECTION名、System eth1 でした。

[root@somehost]# nmcli device
DEVICE  TYPE      STATE      CONNECTION
eth0    ethernet  connected  System eth0
eth1    ethernet  connected  System eth1
lo      loopback  unmanaged  --

DNSサーバーのIPアドレスにGoogle Public DNSのIPアドレス「8.8.8.8」に設定する

先ほど調べたCONNECTIONの名前を指定してDNSサーバーのIPアドレスを設定します。

nmcli connection modify [コネクション名] ipv4.dns [IPアドレス]

[root@somehost]# nmcli connection modify "System eth1" ipv4.dns 8.8.8.8
[root@somehost]# nmcli connection modify "System eth1" ipv4.ignore-auto-dns yes

念のためipv4.ignore-auto-dns yes でDHCP設定を無効にします。

設定を反映させる

NetworkManagerサービスを再起動して設定を反映させます。

DNSサーバーのIPアドレスの設定ファイル /etc/resolv.conf を確認すると確かにIPアドレス「8.8.8.8」が反映されてます。

[root@somehost]# systemctl restart NetworkManager
[root@somehost]# cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 8.8.8.8

【動作確認】pingで接続確認

無事に疎通確認ができました。

[root@somehost]# ping mirrorlist.centos.org
PING mirrorlist.centos.org (147.75.69.225) 56(84) bytes of data.
64 bytes from packet04.centos.org (147.75.69.225): icmp_seq=1 ttl=49 time=159 ms
64 bytes from packet04.centos.org (147.75.69.225): icmp_seq=2 ttl=49 time=158 ms
64 bytes from packet04.centos.org (147.75.69.225): icmp_seq=3 ttl=49 time=199 ms
64 bytes from packet04.centos.org (147.75.69.225): icmp_seq=4 ttl=49 time=204 ms

【補足】解決方法として微妙なもの

レポジトリの設定ファイルを直接編集する

今回の場合、ドメイン名の名前解決ができていないことが原因だったので、レポジトリの設定ファイルを直接編集しても意味がありません。

まず、ネットワークに正常に接続できているか?、mirrorlist.centos.orgにpingできるか?といったことを確認しましょう。

vi /etc/yum.repos.d/CentOS-Base.repo
#baseurl=http://mirror.centos.org/centos/$releasever/extras/$basearch/
baseurl=http://ftp.riken.jp/Linux/centos/$releasever/extras/$basearch/

レゾルバ設定ファイル resolv.conf を直接編集する

nmcliコマンドからの設定ではなく、/etc/resolv.confを直接編集した方が手っ取り早いと思われるかもしれません。

vi /etc/resolv.conf
# Generated by NetworkManager
nameserver 8.8.8.8

ですが、この方法ですとOSを再起動するとNetworkManegerが編集前の状態に上書きしてしまうので解決方法としてはふさわしくありません。

まとめ

  • CentOS7でyum updateyum install時にCannot find a valid baseuとrl for repo: base/7/x86_64のエラーが発生したら、
    ・インターネット接続ができていない
    ・ドメイン名の名前解決ができていない
    ことを原因として疑いましょう。
  • DNS設定は/etc/resolv.confのファイルを直接編集するのではなく、nmcliコマンドで設定しましょう