在CentOS或RHEL下用yum命令安装软件,经常遇到报错的情况。
我摸索出了其中的原理和解决方法,与各位共享。
yum命令在运行时需要读取 /etc/yum.repos.d/目录下的所有后缀为 .repo 的仓库文件,而仓库文件里又写了url网址(比如mirrorlist.centos.org),因年代久远、国外的网址被X、或Linux主机自身网络配置等原因,造成无法访问这些url而报错,这又分为2种情况:
● 无法解析url为IP地址
● 能解析url,但在具体的路径上找不到元数据文件,而这是安装软件所必须的
对于这2种情况,在安装软件时(例如 yum install httpd)会有2种不同的报错信息。
一、无法解析url为IP地址
报错分析:顶部的英文是:“错误14:无法解析主机:mirrorlist.centos.org;未知错误”,明确指出了错误原因是无法解析mirrorlist.centos.org,对于这种因DNS解析失败导致的错误,yum会中断软件的安装过程,不再解析其它的仓库文件,哪怕它们工作正常且可以从中安装软件。
解决方法:
首先确保Linux主机自身以及外部网络环境无问题,可以访问外网。
如果网络无问题,就根据报错信息找出包含无效 url 的 .repo文件:
cd /etc/yum.repos.d
grep 'http://mirrorlist.centos.org' *.repo
本例找出了多个文件,需要具体分析:
CentOS7-Base-163.repo找出3行,但url之前都带有#,说明该文件的url全是注释,所以忽略该文件
CentOS-fasttrack.repo找出1行,CentOS-x86_64-kernel找出2行,url之前没有#,但cat这2个文件,发现使用无效url仓库的enable=0,仓库是禁用状态,所以也忽略;
1.repo找出2行,分别带#和不带#,编辑该文件:vim 1.repo,找到了http://www.mirrorlist.centos.org之前不带#,且enable=1的仓库,就是这个文件了:
解决方法有3种:
① 编辑1.repo,在所有涉及到http://mirrorlist.centos.org的仓库ID之下写enabled=0 也就是禁用仓库
②1.repo改名为1
③ 删除1.repo
另外,错误提示也给出了4条解决问题的命令格式:
①是临时禁止仓库id,②,③是永久禁止仓库id,④是略过错误,但对于DNS解析失败的情况该命令无效。
把包含字符串“http://mirrorlist.centos.org”的仓库id填入<repoid>字段执行。
二、能解析url,但在具体的路径上找不到元数据文件
比如下图提示在路径http://mirrors.163.com/centos/7/os/x86_64/repodata无法下载repomd.xml:
顶部提示HTTP的404错误,而HTTP是应用层协议,这表明网络层能够解析mirrors.163.com的IP地址,但在应用层无法下载xms元数据文件,这会导致软件安装过程中断,哪怕其它仓库工作正常且可以从中安装软件。
解决方法:
报错信息里已经给出解决问题的4条命令(已经填入了仓库id),直接复制和执行即可:
临时禁止仓库:yum --disablerepo=base163 子命令 #其中base163是系统给出的仓库ID,后面必须要跟子命令
永久禁止仓库:yum-config-manager --disable base163
或者
subscription-manager repos --disable=base163
忽略错误,使用其它的仓库安装软件:yum-config-manager --save --setopt=base163.skip_if_unavailable=true
比如运行④命令,这会在对应的 .repo文件的仓库ID下添加skip_if_unavailable = 1,作用是忽略错误,继续从其它仓库安装软件(会输出很多信息,不用理会)。如果执行后安装软件还出现类似的提示是因为有多个问题仓库ID,不停的复制和运行④命令,直到把所有问题仓库都置为忽略。
如果想要知道是哪个 .repo文件错误,可以在 .repo文件里查找由报错信息列出的仓库ID:
grep 'base163' *.repo| sort -t: -k1,1 -u|awk -F: '{print "\033[35m" $1 "\033[0m:" $2}'
如果可以正常从仓库安装软件就重新生成缓存:
yum clean all
yum makecache