必须执行yum clean all && yum makecache --refresh,因clean all仅清除缓存但不更新元数据,不加--refresh会导致跳过下载旧未过期索引,无法识别新包或更新。

直接执行 yum clean all && yum makecache --refresh 就行,但必须用 root 权限,且要注意 makecache 不会自动启用被禁用的仓库。
为什么不能只用 yum clean all
它确实删光了 /var/cache/yum/ 下所有内容:rpm 包、repodata/ 元数据、dbcache、插件缓存。但清理完后:
- yum search 会报错 “No such file or directory: … repomd.xml”
- yum install 会卡在 “Loading mirror speeds” 十几秒以上,直到重下全部元数据
- 如果你之前用 --disablerepo=epel 临时关过某个源,makecache 默认不会重建它,后续 --enablerepo=epel 还是失败
yum makecache 必须加 --refresh
不加这个参数,makecache 会检查本地元数据的时间戳,如果发现“还没过期”,就跳过下载——哪怕镜像源已经更新了包列表,你的本地索引还是旧的。
常见后果:
- yum list available | grep nginx 看不到新版本
- yum update 提示“No packages marked for update”,实际有新版
所以固定组合是:
- yum clean all
- yum makecache --refresh
容易被忽略的权限和路径问题
这几个细节一漏,命令看似成功,其实什么都没删干净:
- 必须用 sudo 或切换到 root,否则 yum clean all 只提示 Permission denied,不报错也不退出,缓存原封不动
- RHEL/CentOS 6 不支持 clean dbcache,但 clean all 在它上面仍有效(只是少删一项)
- DNF 用户(RHEL 8+/Rocky 9+)请改用 dnf clean all && dnf makecache --refresh,语法一致,但 dnf 的元数据解析更快、并发更强
- 如果系统启用了 yum-cron,且配置里没设 makecache = yes,那即使定时清理了,也不会自动重建元数据
真正麻烦的不是命令本身,而是清理后第一次 makecache --refresh 耗时可能达 2–5 分钟——尤其当启用了 EPEL、PowerTools 等多个仓库,或网络延迟高时。这期间所有 yum 命令都会阻塞,别在生产环境高峰时段操作。











