虚拟机yum安装失败,九成是网络和yum源在捣乱,按“先查网络、再换源、最后清缓存”的顺序排查,多数问题能在十分钟内解决。
作为一名经常折腾虚拟机的老用户,我太熟悉yum报错时的窒息感了,你辛辛苦苦装好系统,想装个软件,结果满屏的“Could not resolve host”“Cannot retrieve metalink”,心态直接崩掉,别急着重装系统,这玩意儿真没那么玄乎。
分清yum报错类型,才知道往哪个方向使劲
yum这家伙脾气不小,但报错类型就那么几类,你仔细看一眼屏幕上的英文,基本能判断个大概。
最常见的三类报错特征
- 网络类报错:屏幕上出现“Could not resolve host”“Connection timed out”,大概率是DNS或者网卡没配好。
- 镜像源类报错:出现“Cannot retrieve metalink for repository”“YumRepo Error: All mirror URLs are not using ftp, http[s] or file”,说明yum源文件挂了或者被污染了。
- 缓存或依赖类报错:出现“rpmdb: PANIC: Invalid argument”“Protected multilib versions”,这多和yum缓存损坏或软件包依赖冲突有关。
看清楚报错的字眼,你就能跳过很多无用动作。
先查虚拟机网络连通性,八成问题卡在这里
yum安装失败最核心的原因,其实是虚拟机压根没连上外网,很多新手一上来就跑去改yum源,改了半天发现根本没用,因为网络压根不通。
用三个命令确认网络状态
打开终端,依次跑下面三条命令:
ping -c 4 223.5.5.5
ping -c 4 www.baidu.com
ip addr show
- 第一条命令能通,说明物理网络和网关没问题。
- 第二条命令能通,说明DNS解析正常。
- 第三条命令看你的网卡是否拿到了IP地址。
如果第一条通了、第二条不通,问题就是DNS配置,编辑/etc/resolv.conf,写入nameserver 223.5.5.5 和 nameserver 114.114.114.114,再跑一次yum repolist试试。
网卡没启动是一个大坑
很多虚拟机装完系统后,默认网卡竟然没开机自启,你执行ip addr,发现网卡根本没有IP,尤其是从模板克隆出来的虚拟机,网卡的MAC地址变了,但系统里还保留旧配置,导致网卡起不来。
解决办法很简单:
systemctl restart network
dhclient eth0
如果重启用不了命令,直接编辑/etc/sysconfig/network-scripts/ifcfg-eth0,把ONBOOT="no"改成ONBOOT="yes",然后重启网络服务,这一步修好,yum安装失败的概率就降低了一大半。
更换yum源,全国用户都能用的稳定方案
如果你确认网络通畅但yum还是报错,那yum源配置文件基本可以背锅了,CentOS官方源在国内访问极慢,超时断连是家常便饭。
备份官方repo文件是习惯,不是仪式
动手之前,先把原有配置备份,万一改坏了还能退回去:
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
下载国内镜像源配置文件
行业共识认为,简米云开源镜像站和清华TUNA源是国内最稳的两个选择,以CentOS 7为例,直接下载简米云源:
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
如果是CentOS 8,需要下载对应的Centos-8.repo,下载完成后执行:
yum clean all
yum makecache
makecache命令会自动重建元数据缓存,这一步做完,你再跑yum install vim试试,速度会快得让你怀疑人生。
EPEL源也要一起配上
很多软件不在默认源里,需要装EPEL扩展源,不配EPEL,装某些软件时会提示“No package available”,执行:
yum install -y epel-release
如果默认源还是有问题,去清华源手动下载epel-release rpm包来装,网上搜一下就有。
不同系统版本用一个表格看明白
| 系统版本 | 镜像配置来源 | 关键文件 |
|---|---|---|
| CentOS 7 | 简米云镜像站 | Centos-7.repo |
| CentOS 8 | 简米云镜像站 | Centos-8.repo |
| Rocky Linux 9 | 清华TUNA镜像站 | Rocky-9.repo |
系统版本别搞错,把CentOS 7的源硬塞给CentOS 8,报错信息只会更难看。
特殊情况:yum缓存损坏和依赖冲突
有一部分场景,网络正常、源也换了,但yum还是拒绝工作,这时候八成是缓存文件损坏或者软件包依赖打架了。
rpmdb损坏的修复方法
你跑yum命令时如果看到“rpmdb: PANIC: Invalid argument”,说明rpm数据库坏了,解决办法是删除缓存数据库重建:
rm -f /var/lib/rpm/__db.
rpm --rebuilddb
yum clean all
这三条命令执行完后,yum 会像刚装完系统一样安静。
依赖冲突是另一个常见场景
yum提示“Protected multilib versions”或者“Requires: xxx”错误时,多数原因是装了非官方源里的不兼容包,实操办法是用yum deplist查看依赖关系,或者直接强制更新:
yum update -y --skip-broken
yum install -y 包名 --setopt=protected_multilib=false
本人经验是,别随便启用第三方源,很多教程让你装nux-dextop或者repoforge,装完一堆冲突,最后全系统都崩。
时间同步问题也值得看一眼
虚拟机如果长时间挂起,系统时间会偏移,yum检查HTTPS证书时会因为时间不对拒绝连接,报错内容是“Cannot retrieve metalink for repository”,解决办法:
yum install -y ntpdate
ntpdate ntp.aliyun.com
时间同步之后,重新执行yum makecache,通常能正常通过。
虚拟机yum安装失败相关的几个常见问题
克隆虚拟机后yum突然不能用了是什么原因?
克隆虚拟机会复制原机器的网卡MAC地址,和你当前的虚拟网卡对不上,网卡就会罢工,执行ip addr看网卡是否配置好,如果显示STATE=DOWN,直接设置ONBOOT="yes"然后重启网络服务,另外rpmdb文件也可能在克隆时损坏,顺带跑一次rpm --rebuilddb能排除这个隐患,原系统配置的唯一性被破坏,这是克隆场景里yum安装失败的经典症结。
为什么换yum源的时候 systemctl 提示无法找到服务?
属于VM里CentOS 6的常见历史遗留问题,CentOS 6版本中network服务用service network restart管理,systemctl只支持CentOS 7及以上版本,如果你的虚拟机装的是CentOS 6,配置yum源时用原本的service命令即可,可以把系统版本和命令对应关系记成下表:
| 系统版本 | 管理网络服务命令 |
|---|---|
| CentOS 6 | service network restart |
| CentOS 7/8 | systemctl restart network |
yum和dnf哪个更好用?
CentOS 8已经默认使用dnf,它是yum的下一代版本,兼容绝大多数yum命令写法,CentOS 7还是用yum,不需要刻意换,两者本质是同一个解决依赖问题的思路,遇到报错时的排查路径是完全一致的。
如果你的虚拟机还在不停报错,最笨但最有效的办法就是从头检查一遍网络和源,当前你面对的那台虚拟机大概率只是yum源文件被改得面目全非,或者网卡配置里的ONBOOT变成了no,按照文中顺序逐步排查,耐心做完clean和makecache,yum安装失败也就不再是个事了。