在使用基于Red Hat的Linux发行版(如CentOS、RHEL、Fedora)时,yum(Yellowdog Updater Modified)是管理软件包不可或缺的核心工具,为了高效地安装、更新和删除软件,yum依赖于仓库中预先处理好的元数据,这些元数据包含了软件包的列表、版本信息、依赖关系等。yum makecache命令的核心作用,就是将这些远程仓库的元数据下载到本地,并创建缓存,从而加快后续yum操作的速度,减少网络请求,在日常运维和开发工作中,执行yum makecache时遇到报错是一个非常普遍且令人头疼的问题,本文将系统性地剖析此问题的常见原因,并提供一套清晰、有效的排查与解决方案。

常见错误类型及其含义
当yum makecache失败时,终端通常会给出明确的错误信息,理解这些信息是定位问题的第一步,以下是一些最常见的错误类型:
- “404 Not Found”:这表明
yum无法访问仓库元数据文件(通常是repomd.xml),最直接的原因是仓库配置文件(.repo文件)中的baseurl地址错误、拼写失误,或者该仓库版本已被官方废弃,URL结构已发生变化。 - “Could not resolve host”:这是一个DNS解析问题,系统无法将配置的仓库域名(如
mirror.centos.org)解析为IP地址,通常由网络连接问题、DNS服务器配置错误或防火墙阻止DNS查询所致。 - “Error: Cannot retrieve repository metadata (repomd.xml)”:虽然与404类似,但这个错误更宽泛,它可能指
repomd.xml文件本身不存在,也可能是因为网络不稳定导致下载中断,或代理服务器配置有误,无法正确获取该文件。 - “GPG key retrieval failed” 或 “Public key for ... is not installed”:
yum使用GPG(GNU Privacy Guard)密钥来验证下载软件包的完整性和来源,防止恶意篡改,此错误意味着系统无法下载或验证仓库的GPG公钥,这通常是由于gpgkey配置错误或网络问题导致密钥无法获取。
系统性排查步骤
面对上述错误,不要慌张,按照以下逻辑顺序进行排查,可以高效地定位并解决问题。
检查网络连接与DNS解析
这是最基础也是首要的一步,确保服务器能够正常访问互联网。
# 测试与外网的连通性 ping www.baidu.com # 测试DNS解析是否正常 nslookup mirror.centos.org # 尝试直接访问仓库URL,检查是否返回200 OK curl -I http://mirror.centos.org/centos/7/os/x86_64/repodata/repomd.xml
如果ping或nslookup失败,应检查服务器的网络配置、/etc/resolv.conf文件中的DNS设置,以及防火墙规则是否限制了出站连接。
审查仓库配置文件
仓库配置文件位于/etc/yum.repos.d/目录下,以.repo错误的配置是导致makecache失败的最主要原因。
仔细检查每个.repo文件中的baseurl、enabled和gpgkey等参数,下面是一个常见的配置错误与正确示例的对比表:

| 配置项 | 错误示例 | 正确示例 | 说明 |
|---|---|---|---|
baseurl |
baseurl=http://exmple.com/centos/$releasever/os/$basearch/ |
baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/ |
URL拼写错误,example拼成了exmple。 |
enabled |
enabled=0 |
enabled=1 |
仓库被禁用,yum会直接跳过它。 |
gpgcheck |
gpgcheck=1 但未配置gpgkey |
gpgcheck=0 (测试时) 或 gpgcheck=1 且 gpgkey=... |
开启了GPG检查却未提供密钥路径,导致验证失败。 |
建议使用vim或nano编辑器,逐个检查这些文件,确保所有URL都是有效且可访问的。
清理旧缓存并重建
过时或损坏的本地缓存也可能引发问题。yum提供了清理缓存的命令。
# 清理所有缓存,包括软件包和元数据 yum clean all # 清理完毕后,重新生成缓存 yum makecache
这个组合操作相当于给yum一个全新的开始,能够解决因缓存文件损坏导致的大部分问题。
处理GPG密钥问题
如果错误与GPG密钥相关,首先确认.repo文件中的gpgkey路径是否正确,可以手动导入密钥。
# 以CentOS 7为例,导入官方GPG密钥 rpm --import https://www.centos.org/keys/RPM-GPG-KEY-CentOS-7
导入成功后,再次执行yum makecache,在企业环境中,如果使用内部仓库,请联系仓库管理员获取正确的GPG公钥。
更换为可靠的镜像源
有时,默认的官方镜像源因地理位置或网络状况,访问速度极慢或不稳定,更换为地理位置更近、速度更快的国内镜像源(如阿里云、清华大学、网易等开源镜像站)是立竿见影的解决方案。

操作通常包括:
- 备份原有的
.repo文件。 - 下载新镜像源提供的
.repo文件到/etc/yum.repos.d/目录。 - 执行
yum clean all和yum makecache。
相关问答 (FAQs)
问题1:yum clean all 和 yum makecache 有什么区别?为什么要一起使用?
解答:
yum clean all 是一个“破坏性”命令,它的作用是删除yum在本地存储的所有缓存数据,包括下载的软件包(/var/cache/yum/下的packages目录)和所有仓库的元数据,这相当于清空了yum的“记忆”。
而 yum makecache 则是一个“建设性”命令,它会根据/etc/yum.repos.d/目录下的配置文件,重新从远程仓库下载最新的元数据并建立缓存。
两者一起使用,通常是为了解决因缓存数据陈旧、损坏或与仓库配置不匹配而引发的问题,通过clean all强制清空旧的、可能错误的缓存,再用makecache基于当前最新的配置重建一个干净的缓存,可以确保yum后续操作的正确性和可靠性。
问题2:在企业内网环境中,即使配置了代理,yum makecache 仍然失败怎么办?
解答: 在企业内网,代理配置是常见需求,如果配置后依然失败,需要从以下几个方面进行深入排查:
- 代理配置语法:检查
/etc/yum.conf或.repo文件中的proxy设置,格式应为proxy=http://proxy_server_ip:port/,如果代理需要认证,还需配置proxy_username和proxy_password。 - 代理服务器本身:确认代理服务器是否正常运行,以及是否允许目标服务器通过其访问
yum仓库的URL(通常是HTTP/HTTPS的80/443端口)。 - SSL证书问题:如果使用HTTPS代理,企业可能有自己的CA证书,需要将企业的CA证书文件(如
company-ca.crt)放置到系统信任的证书路径下(如/etc/pki/ca-trust/source/anchors/),然后运行update-ca-trust extract命令使其生效。 - 防火墙策略:除了代理服务器,还要检查目标服务器和代理服务器之间的网络防火墙,以及代理服务器与外部互联网之间的防火墙,确保相关端口未被阻止。 通过以上步骤,可以定位到是配置问题、代理服务问题还是网络策略问题,从而进行针对性修复。