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