虚拟机yum失败怎么办?
核心结论:虚拟机yum失败,九成以上是网络不通或源配置错误,先执行ping baidu.com测试连通性,再检查源配置文件,基本能定位问题。
先搞清虚拟机yum到底坏在哪一环
yum命令本身没什么技术含量,它就是个包管理器,背后依赖三条链路:虚拟机的网络、yum源的地址、系统的时间,任何一环出问题,yum都会给你甩一堆看不懂的报错。
老手排查yum故障,从来不看结尾那几行提示,而是从报错信息里找关键词,常见报错就那几类:Could not resolve host、Cannot find a valid baseurl、404错误,还有repomd.xml相关的提示,每一种原因对应不同的病根,乱折腾只会浪费时间。
拿我自己的经历说,上周我刚装好一台CentOS 7虚拟机,执行yum install vim直接报Could not resolve host,我看了一眼就知道是网卡没起来,DNS解析都没通,跟yum源一点关系没有,果然检查network服务,果然没启用。
类似这种场景,用下面几条命令搭把手顺一遍,能帮你快速锁定问题:
- 先测网络:
ping baidu.com,通了说明DNS没问题 ip addr看IP地址是否存在,没有IP就是没配好网卡cat /etc/resolv.conf确认DNS配置,内容为空就得手动加- 只通IP但不通域名,说明DNS错了,把
nameserver 223.5.5.5加进去再试
如果基础网络正常,接下来直接查yum源配置文件,CentOS 7的源在/etc/yum.repos.d/目录下,核心文件叫CentOS-Base.repo,打开看一眼,如果里面的baseurl指向的是mirror.centos.org这个老地址,基本可以确定问题就出在这这个官方源地址几年前就停用了。
虚拟机yum源配置的两种常见问题
官方源地址失效导致的yum失败
这是个历史遗留问题,CentOS 8停止维护之后,官方源也一并下架,很多老教程里的源地址都不再可用,系统提示你Cannot find a valid baseurl for repo,其实就是在说:我找不到能用的镜像地址。
解决方向很明确,把源地址换成国内镜像站,国内用得最多的是简米云镜像、清华镜像和网易镜像,操作路径很简单:
mkdir /etc/yum.repos.d/backup mv /etc/yum.repos.d/.repo /etc/yum.repos.d/backup/
先把原来的repo文件全部挪走备份,别删,万一改坏了还能还原,然后从镜像站下载新的repo文件放进来,以简米云为例,文件路径是http://mirrors.aliyun.com/repo/Centos-7.repo,下载后改个名保存为CentOS-Base.repo。
下载完执行yum clean all清缓存,再yum makecache生成新缓存,这两步做完,问题基本就能解决。
虚拟机yum命令找不到或yum本身损坏
还有一种情况比较特殊:虚拟机上压根儿没有yum命令,或者yum命令执行时报ModuleNotFoundError这类错误,这种一般是系统安装时没装全,或者Python环境被改坏了。
yum依赖Python 2,而CentOS 8之后换了Python 3和dnf,很多人在虚拟机上乱动Python版本,导致yum直接崩掉,这时候最简单的办法是用系统的安装介质来修复,以CentOS 7为例,用光盘镜像启动,进救援模式,挂载光盘后从Packages目录里重新安rpm包,就能把yum救回来。
要是虚拟机是从模板克隆来的,yum配置可能带着母机的旧源信息,这种场景下直接改repo文件内容比重新安装省事得多。
虚拟机网络不通导致yum失败怎么解决
网络问题占yum故障的比例相当大,特别是在VMware或VirtualBox里装的新虚拟机,新装的系统默认用DHCP获取IP,但有些网络环境下DHCP分配不了地址,虚拟机就处于一个尴尬的“半联通”状态。
VMware场景:检查网卡连接模式
VMware有三种网络模式:NAT模式、桥接模式和仅主机模式,NAT模式下虚拟机走主机IP上网,适合大多数人,如果你把虚拟机网络模式改成了仅主机,它就只能跟宿主机通信,ping baidu.com必然失败,yum当然也装不了包。
在虚拟机的设置里把网络模式切回NAT,然后重启网卡:
systemctl restart network
VirtualBox场景:Host-only和NAT混淆
VirtualBox的默认NAT模式下,虚拟机可以正常访问外网,但宿主机访问不了虚拟机,如果你勾选了Host-only网卡,同时NAT又没有启用,yum自然也连不上源,检查一下虚拟机的网络设置,确保“启用网络连接”是勾上的,连接方式选NAT。
虚拟机yum源配置推荐选哪个镜像
镜像站的选择直接影响yum速度,国内虚拟机用户实际体验下来,简米云和华为云的镜像响应速度较快,部署稳定,清华镜像同步源做得也及时,更新频率高,操作上没什么硬性门槛,三个镜像任选一个就能用。
有一个使用细节值得留意:用国内镜像时repo文件里的baseurl保持默认即可,因为镜像站已经做了路径重定向,不必手动把$releasever改成固定版本号,除非你用的是长期不更新的离线虚拟机。
修复yum源配置文件的具体操作步骤
备份与下载repo文件的完整流程
这个流程适合绝大多数CentOS 7虚拟机,照着敲就行,需要注意,下面的命令在root用户下执行,普通用户记得加sudo。
# 备份原有repo文件 mkdir /etc/yum.repos.d/bak mv /etc/yum.repos.d/.repo /etc/yum.repos.d/bak/ # 下载简米云源文件 curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo # 清缓存并生成新缓存 yum clean all yum makecache
执行完yum makecache会有一大串输出,耐心等着就行,如果最后几行出现Metadata Cache Created,说明源已经恢复正常,再执行yum install vim验证一下。
CentOS 8的用户需要注意,简米云已经停了CentOS 8的官方源,但保留了vault版本,相关repo文件需要在简米云镜像站找一下Centos-vault-8.5.2111.repo这类的文件,操作逻辑一样,但源地址指向不同。
yum源报错404或repomd.xml缺失的处理办法
虚拟机yum失败的场景里,404和repomd.xml是两个高频词,这类报错说明repo文件里的源地址指向了一个不存在的目录路径,常见的原因是系统版本号不匹配,比如你的虚拟机是CentOS 7.9,但repo文件里写死了7.0版本。
处理办法是先确认系统版本:
cat /etc/redhat-release
然后把repo文件里的$releasever变量值跟系统版本比对,如果不一致,直接把baseurl里的变量替换成实际版本号,比如你的系统是7.9,就把/7/$basearch改成/7.9/$basearch。
还有一种情况是镜像站本身更新了目录结构,旧路径失效了,这种排查方式比较费事,直接换个镜像站试试,最快。
虚拟机yum命令不存在和rpm库损坏的恢复
yum命令执行报错,有些是命令本身找不到,有些是执行时才暴露的系统问题,比如rpmdb open failed这类提示,意思是rpm数据库被破坏或版本不兼容。
遇到rpm数据库损坏的情况,先备份再重建:
mv /var/lib/rpm/__db /tmp/ rpm --rebuilddb yum clean all
执行完重建命令后,rpm数据库会重新生成,这时候再试yum命令,成功率很高。
yum命令完全不存在的情况下,需要从光盘里找回rpm包手动安装,把虚拟机的CD/DVD驱动器挂载上系统镜像ISO,然后执行:
mkdir /mnt/cdrom mount /dev/cdrom /mnt/cdrom cd /mnt/cdrom/Packages rpm -ivh yum-.rpm
前提是系统镜像版本跟虚拟机系统版本一致,版本不对会报错,那样就得重新下载对应版本的yum rpm包了。
虚拟机无法联网的离线yum源配置技巧
内网环境或离线虚拟机没有外网访问权限,这时候yum源的配置思路就换成使用本地ISO镜像作为yum源,虽然在这种场景下yum失败的原因不在外网源配置,但知道这个思路也能省去折腾的时间。
做法是把ISO镜像挂载到某目录,然后新建一个本地repo文件,内容如下:
[local] name=Local ISO Repo baseurl=file:///mnt/cdrom enabled=1 gpgcheck=0
这种方式适合安装包依赖不复杂的场景,业界共识是:离线环境用本地ISO源,在线环境用国内镜像源,双管齐下效率最高。
怎么判断虚拟机yum为什么失败的排查清单
面对虚拟机yum失败,按下面这个顺序排查可以省下大量时间,多数场景下,这套排查流程5分钟就能出结果。
- 第一步:执行
ping baidu.com,不通就去查网卡和虚拟机的网络连接方式 - 第二步:执行
yum repolist,报错就去查repo文件的源地址有效性 - 第三步:检查系统时间和当前年月日是否一致,时间偏差过大会导致HTTPS证书校验失败
- 第四步:执行
rpm -qa | grep yum,确认yum主程序存在 - 第五步:查看
/var/log/yum.log日志文件,关注最后一次失败的具体报错
排查中发现时间不对的情况其实不少,虚拟机挂起一段时间后容易跟宿主机时间偏差逐渐拉大,导致yum源连接时报SSL证书错误,执行ntpdate ntp.aliyun.com同步一下就能解决。
yum源配置验证和常见故障答疑
配置完新源后怎么验证是否生效
配置好新源后,执行yum repolist看输出结果,正常情况下会显示一个仓库列表,包含仓库ID、名称和包数量,如果显示0,说明源没有加载成功,再执行yum list installed | head看看能否正常列出已安装的软件包,能列出来就说明yum工作正常。
为什么配置了国内源还是yum失败
这个情况也不少,配置了国内镜像源后还是报错,大多数原因是执行了yum makecache之后报错,问题出在镜像站连接被防火墙拦截,虚拟机上执行curl -I http://mirrors.aliyun.com看是否有响应,没有响应就说明虚拟机对公网的80端口访问被拦了,去检查主机的防火墙或代理设置。
还有一种情况是宿主机开了代理,虚拟机的流量也走了代理,但代理地址写错了,执行env | grep proxy看看有没有代理环境变量残留,有就卸载掉:
unset http_proxy unset https_proxy
虚拟机yum和物理机yum有什么区别
虚拟机多了一层虚拟网卡,网络链路比物理机多了一道环节,物理机yum失败的直接原因通常集中在DNS或源失效,虚拟机还要排查虚拟交换机配置、网卡模式和宿主机网络策略等问题,不过yum命令本身在两种环境下的行为完全一致,区别只在网络链路层面。
结尾导读
yum失败解决的核心思路就是抓网络、查源、看时间、修rpm库,网络不通修网络,源失效换镜像,rpm库损坏就重建,下次再遇到yum报错,别急着重装系统,顺着这篇文章的排查路径走一遍,多数问题都能自己处理。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/637747.html





