1. 先搞懂yum源是啥,再动手配
很多刚接触Linux的朋友都会遇到同一个尴尬场景:新装完系统,高高兴兴执行yum install nginx,结果屏幕上刷刷刷弹出几十个依赖错误。明明刚才还能联网,怎么装个包就这么费劲?其实问题多半不在网速,而是系统的软件仓库,也就是yum源没有正确配置。
先花两分钟说清楚yum源的本质。yum(在RHEL 8之后的版本叫dnf,但习惯上还是统称yum)本质上是一个软件包管理器,它自己不会凭空变出软件包,而是从配置文件里写的镜像仓库地址去拉取rpm包和元数据。所谓“配置yum源”,就是告诉系统“该去哪里下载软件”。这个过程和我们手机应用商店里切换下载源是同一个道理,官方源在国外,访问慢、易超时,那就换成国内镜像源;单位内网隔离了外网,那就自己搭建一个本地源。搞懂了这一点,后面的所有操作就都顺理成章了。
这篇文章会覆盖绝大多数实际场景:网络yum源配置、本地yum源搭建、混合源和第三方源,最后是高频问题排查。不管你是刚装上CentOS 7的虚拟机,还是手里有一台必须离线安装软件的生产服务器,都能在这里找到直接抄作业的答案。
2. 最常用的网络yum源配置(以阿里云为例)
2.1 为什么首选国内镜像源
配置网络源的思路很简单:系统默认的base源是指向CentOS官方镜像站的,服务器在国外。从国内访问,下载速度可能只有几十KB每秒,还经常在中途断开,yum会直接报“ connection timeout”。换用国内镜像源之后,速度基本都是几十MB每秒起步,体感差距非常明显。
国内比较稳定的镜像站有阿里云、清华TUNA、中科大USTC、腾讯云等。我自己的习惯是:生产环境优先用阿里云,因为它的源更新及时、带宽充足,而且提供了针对不同系统和版本的一键式repo文件,省去手动改URL的麻烦。清华源和中科大源也很好,作为备选完全没有问题。
2.2 CentOS 7系统完整操作流程
先备份源文件,这是最稳妥的第一步操作,改坏了还能退回原样:
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup然后下载阿里云的repo文件。这里有一个常见的认知误区:很多人以为必须用curl命令下载,其实直接用wget也可以,两种工具都是系统自带的。如果你实在不放心,可以先用cat确认一下文件内容再使用。
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo下载完成后,强烈建议先查看一下这个文件的内容,确认路径是否匹配:
cat /etc/yum.repos.d/CentOS-Base.repo你会看到baseurl写成http://mirrors.aliyun.com/centos/$releasever/os/$basearch/这种格式。这里面的$releasever和$basearch是两个变量,yum会自动替换成系统的版本号和架构。这就是一个典型的一次配置、全局生效的设计。
最后清理缓存并生成新的缓存:
yum clean all yum makecache看到“Metadata cache created”这类提示,就说明源已经生效了。这时候再执行yum install,速度会非常快。
2.3 CentOS 8/9和Rocky Linux的差异点
CentOS 8之后的系统用dnf替代了yum,但命令基本兼容。阿里云的repo文件地址也有所变化。CentOS 8仓库已经进入EOL状态,官方源下线后,阿里云对旧版本也做了一些归档处理,配置时需要注意使用vault地址。CentOS 9的配置方式和8类似。
红帽系的新版本系统(包括Rocky Linux 9、AlmaLinux 9)我更推荐用dnf config-manager来管理源。比如在Rocky Linux 9上配置阿里云源,可以这样操作:
dnf install -y dnf-plugins-core dnf config-manager --add-repo http://mirrors.aliyun.com/rocky/9/BaseOS/x86_64/os/当然也可以直接下载阿里云为Rocky生成的官方repo文件:
curl -o /etc/yum.repos.d/rocky-base.repo http://mirrors.aliyun.com/repo/rocky-base.repo注意一个细节:阿里云提供的一键repo文件是通过sed自动替换变量之后生成的,里面已经写死了实际路径。如果你在里面看到http://mirrors.aliyun.com/rocky/$releasever/...,需要手动确认$releasever在你的系统上会被替换成什么,不放心的话就直接把版本号写死,比如改成9,这是最保险的做法。
2.4 配置过程中的关键注意事项
第一,不要把EPEL源和base源混为一谈。EPEL是Fedora社区维护的扩展软件包集合,里面装的是一些官方源里没有的软件,比如htop、iftop这类工具。配置EPEL也可以使用阿里云的一键repo文件,命令类似:
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo但EPEL源不能替代base源,它只是补充,两者是配合关系,不是替代关系。
第二,不要轻易删除原有的repo文件。有些快速教程会引导你把所有repo文件都删掉,只留一个阿里云源的文件。这样做短期内没问题,但后续如果需要用yum install epel-release、安装第三方软件时会非常被动。正确的做法是先把文件备份或禁用,确认新源没有问题之后,再决定是否清理。
第三,注意gpgcheck参数。repo文件里一般都有gpgcheck=1,这个参数会校验软件包的GPG签名,防止软件包被篡改。在内网环境配置离线源时,因为rpm包都是自己放的,或者来自可信渠道,可以临时设置为gpgcheck=0。但如果是访问外网源,不要动这个值,安全校验是有必要的。
提示:如果你改了repo文件之后执行
yum makecache一直卡在“Could not resolve host”,优先检查DNS配置。cat /etc/resolv.conf看看nameserver是不是正常,ping mirrors.aliyun.com测试一下域名解析。
3. 离线环境必备:本地yum源搭建
3.1 哪些场景需要自己搭本地源
本地yum源的价值体现在两个典型的场景里。一个是你有一台服务器,因为安全要求断开了外网,或者只有内网带宽,这时候通过光盘或者拷贝的rpm包来搭一个源,就能让内网里的所有机器正常安装软件。另一个是你在虚拟机上做实验,系统光盘就在手边,直接挂载成本地yum源,完全不依赖外网,也不会遇到源失效的问题。
实际工作中我还遇到过一种更头疼的情况:生产环境有几十台机器,每台机器都要安装同一个软件包,而外网下载速度又很慢。如果一台一台执行yum install,半天时间就耗在等待上了。这时候在一台管理机上搭建本地源,把rpm包集中存放,局域网内其他机器直接从这个源安装,效率会高很多,这是我在实际项目中经常用的方法。
3.2 快速复用系统光盘搭建本地源
这个方法最简单,适合虚拟机实验环境。把CentOS系统光盘挂载到一个目录,然后把这个目录作为baseurl。挂载操作如下:
mkdir -p /mnt/cdrom mount /dev/cdrom /mnt/cdrom如果你是使用ISO镜像文件,也可以用mount -o loop挂载:
mount -o loop /path/to/CentOS-7-x86_64-DVD.iso /mnt/cdrom挂载成功之后,先确认一下目录里的内容:
ls /mnt/cdrom df -h正常情况下你会看到Packages、repodata、BaseOS等目录。注意到有repodata目录了吗?这个目录非常重要,它就是yum元数据所在的位置,里面保存着每个软件包的名称、版本、依赖关系等关键信息。只要一个目录里有repodata,这个目录就是一个可用的yum源。
然后写一个本地源的repo文件,我喜欢命名为local.repo,以示与官方源文件区分:
[local] name=Local CDROM Repository baseurl=file:///mnt/cdrom enabled=1 gpgcheck=0写完之后执行:
yum clean all yum makecache这样系统就能从光盘安装软件了。有一个细节值得注意:光盘挂载重启后会失效,如果你希望开机自动挂载,需要写入/etc/fstab。比如:
echo "/dev/cdrom /mnt/cdrom iso9660 defaults 0 0" >> /etc/fstab下次重启系统,光盘就能自动挂载了。
3.3 自己创建rpm包仓库,适用于离线分发
如果你的场景是几十台机器都要安装某个离线分发的软件,那就得自己建一个仓库,把所有rpm包放在一个目录里,然后生成元数据。生成元数据需要用到createrepo这个工具,非常关键:
yum install -y createrepo mkdir -p /data/rpm # 把需要分发的rpm包拷贝到 /data/rpm 目录下 cp /path/to/*.rpm /data/rpm/ # 生成repodata元数据 createrepo /data/rpm执行完成后,/data/rpm目录下就会多出一个repodata文件夹,这个目录现在就是一个标准的本地yum源了。然后像前面一样新建repo文件:
[local-rpm] name=Local RPM Repository baseurl=file:///data/rpm enabled=1 gpgcheck=0之后内网其他机器想要使用这个源,可以把整个/data/rpm目录通过NFS、HTTP或者FTP共享出去。比如用HTTP方式共享时,baseurl就写成http://192.168.1.100/rpm/,其他机器直接访问这个地址即可。在这种情况下,仓库所在的那台机器上需要部署一个简单的web服务,可以用python3 -m http.server 80 --directory /data/rpm快速起一个。
有一点必须提醒:如果后续往目录里新增了rpm包,一定要重新执行createrepo /data/rpm来更新元数据。否则yum在安装时仍会使用旧的repodata信息,找不到新添加的包,这是一个容易被忽视的坑。我见过不少人把包拷进去后安装失败,到处排查原因,最后发现只是忘了重新生成repodata,这个细节真的要注意。
3.4 本地源和网络源混用的优先级策略
本地源和网络源不是互斥关系,实际环境中经常两者共存。比如系统光盘源提供基础包,阿里云源提供更新包,内网自建源提供定制化软件包。但要小心的是,如果不同源里存在同名但不同版本的软件,yum可能会随机选择其中一个,有时会装到你不想要的版本。
解决办法是给源设置优先级。CentOS 7及之前版本可以安装yum-plugin-priorities插件:
yum install -y yum-plugin-priorities然后在repo文件里给每个源配置priority参数,数值越小优先级越高:
[local] name=local baseurl=file:///mnt/cdrom enabled=1 gpgcheck=0 priority=1 [aliyun] name=aliyun baseurl=http://mirrors.aliyun.com/centos/$releasever/os/$basearch/ enabled=1 gpgcheck=1 priority=2这样系统会先从本地源找包,本地源没有再去网络源找,逻辑非常清晰。CentOS 8之后的dnf自带优先级支持,不需要额外装插件,直接在repo文件里配置priority即可,这一点比旧版方便了不少。
4. 扩展玩法:从标准源到第三方源
4.1 EPEL源和官方源的配合逻辑
前面提过EPEL源,值得展开细说。很多常用的Linux运维工具,比如htop、iftop、jq、python3-pip等,在默认base源里要么没有,要么版本很老。EPEL源正好补上这个空缺,而且它本身也是红帽系生态的官方扩展源,安全性和兼容性都有保障。
配置EPEL源最省事的方式是直接用epel-release包:
yum install -y epel-release这个包安装时会在/etc/yum.repos.d/下生成对应的repo文件。如果你希望默认走阿里云加速,可以先生成阿里云EPEL源文件,再安装epel-release,或者装完后再替换。注意区分不同系统的仓库状态:CentOS 7和CentOS 8的EPEL源地址结构不一样,下载时要选对版本,弄混了会出现“failed to download metadata”的报错。
4.2 从ELRepo到软件厂商源
还有一些场景,你需要比官方源更新版本的内核或驱动。这时ELRepo源就派上用场了,它提供的是主线内核、文件系统驱动、显卡驱动这类超出官方仓库维护范围的组件。安装方式:
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm另一个常见需求是安装特定厂商的软件源,比如MySQL官方源、Nginx官方源、Docker官方源。这些源通常由厂商官网提供一条安装命令,直接执行即可。需要注意的关键点是:第三方独立源和系统base源之间可能存在依赖库的版本冲突。启用第三方源之后,最好用yum repolist确认一下当前启用的仓库列表,避免未预期的更新。
4.3 国产Linux发行版的源配置现状
聊到国产化替代,这里顺便说下openEuler、麒麟、统信UOS这类系统的软件源配置。openEuler基于CentOS/RHEL生态,用的也是dnf/yum体系,源配置目录同样是/etc/yum.repos.d/。openEuler官方提供了自己的软件源,也有多个镜像站可以加速。配置方式和CentOS基本一致,把repo文件里的baseurl指向对应的镜像地址,再执行dnf clean all && dnf makecache即可。
麒麟和统信UOS虽然是商业发行版,但底层同样是rpm/dnf体系,系统里已经预置了官方的软件源配置。在用户侧通常不需要手动修改,是否需要更换镜像需要根据具体部署环境来评估。如果你在内网用麒麟系统搭yum源,方法与我上文提到的本地源模式完全一样,核心思路是一致的:准备一个包含repodata的目录,写好repo文件,开启HTTP或NFS共享,其他机器配置baseurl指向它。这套方法论在几乎所有rpm系发行版上都通用。
4.4 使用不同镜像站的取舍
我习惯把镜像站分为两类来看待。一类是全量级镜像站,比如阿里云、清华TUNA、中科大USTC,这些站通常提供了完整的发行版仓库同步,更新及时,带宽也稳定。另一类是小而快的专属源,比如部分高校镜像站只同步几个特定发行版,速度反而更快。
选择镜像站时候可以参考一个原则:离你的网络环境越近越好。如果服务器在阿里云上,直接用阿里云源;如果办公室网络到清华大学延迟很低,用清华源也是好选择。相比纠结哪个源最好,更重要的是找到速度能接受、能稳定访问、长时间不会频繁变更地址的源。镜像站偶尔会有同步延迟或临时故障,所以同时配置两个同级别的源,也是一个比较稳妥的做法。
5. 高频问题与排查技巧实录
5.1 缓存损坏引发的元数据错误
这个问题我遇到过很多次。现象是执行yum install时报“Error: Failed to download metadata for repo 'base'”,或者提示“Cannot retrieve repository metadata (repomd.xml) for repository: base”。很多人第一反应是源地址挂了,其实大多数情况是缓存损坏。
处理办法很简单,清理缓存再重建:
yum clean all rm -rf /var/cache/yum yum makecache如果还是不行,检查一下repo文件里的mirrorlist和baseurl。注意mirrorlist是动态返回镜像列表的机制,有些情况下会因为DNS解析或网络限制导致不可用,而baseurl是直接指定固定地址。在配置阿里云源时,建议直接把repo文件里的mirrorlist注释掉,只保留baseurl,这是一个非常实用的技巧。不然每次执行yum命令,系统都会先尝试访问mirrorlist去获取镜像列表,一旦这步失败,即使baseurl是对的也会报错。
5.2 版本号变量导致的404错误
一种非常隐蔽的报错是:yum makecache时提示404,但直接访问repo文件里的URL又是可以打开的。这通常是因为$releasever变量在你的系统上没有正确解析。比如你在CentOS 7上用curl下载了CentOS 8的repo文件,yum会把$releasever替换成8,结果访问的是不存在的路径。
排查方法:
# 查看系统版本 cat /etc/redhat-release # 查看yum实际请求的地址 yum -v repolist 2>&1 | grep repo_baseurl如果发现地址中的版本号和系统对不上,直接把repo文件里的$releasever改成实际版本号即可。比如CentOS 7就明文改成7,Rocky 9就明文改成9。写死版本号虽然少了一点通用性,但换来的是稳定和确定,在生产环境里值得这样做。
5.3 gpgcheck与密钥导入问题
配置外网源时最常见的报错是“Public key for xxx.rpm is not installed”。原因很简单:rpm包有GPG签名,而系统里没有对应的公钥,无法验证包的来源。
解决办法是把对应源的公钥导入系统。以阿里云CentOS 7源为例:
rpm --import http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7或者从系统自带目录导入:
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7这里要提醒一下:不建议为了省事把所有repo文件的gpgcheck都改为0。GPG校验是软件供应链安全的重要防线,一旦关闭,系统将无法检测被篡改的软件包。如果某个源的密钥一直导入失败,应该去官方文档查正确的密钥地址,而不是直接关掉校验。
5.4 本地源文件访问权限问题
配置本地源时,还有一个容易被忽略的环节:文件权限。当你通过file://方式访问本地仓库时,yum进程使用的用户必须对目录和文件有读权限。默认情况下root用户可以访问一切路径,没什么问题。但如果目录是NFS挂载、权限收得比较严,或者普通用户执行yum命令,就可能出现“Permission denied”。
排查方法是先手动验证:
ls -l /data/rpm/repodata/repomd.xml curl -I file:///data/rpm/repodata/repomd.xml如果目录权限没有问题,再看SELinux。SELinux处于Enforcing模式下,即使文件权限正常,也可能拦截HTTPD进程读取非标准目录的文件。这种问题排查起来比较费时间,需要查看/var/log/audit/audit.log里是否有相关的AVC记录。
5.5 问题排查速查表
| 现象 | 可能原因 | 排查思路 |
|---|---|---|
| makecache超时 | DNS解析异常/网络不通 | ping mirrors.aliyun.com,检查/etc/resolv.conf |
| 404 Not Found | 版本号变量/路径写错 | 用yum -v repolist查看实际URL |
| BDB锁问题 | 多个yum进程并发/缓存损坏 | rm -rf /var/cache/yum,重试 |
| Error: Nothing to do | 软件包名称错误/源里没有 | yum search关键字确认包名 |
| GPG密钥缺失 | 公钥未导入 | rpm --import对应密钥文件 |
| 源冲突导致版本错乱 | 多个源包含同名软件 | 设置priority,禁用不必要源 |
6. 配好源之后还能做点什么
源配置完成只是第一步,之后可以做几个小事情来验证和优化整个软件管理环境。
先查看当前所有repo源的启用状态:
yum repolist再查看系统软件包的更新情况:
yum update -n这两条命令能帮你确认哪些源在正常工作,哪些源已经失效或需要禁用。据我观察,很多服务器配置好源之后就没有再管过,过了几个月才发现某个repo源早已失效,导致新软件装不上。定期跑一遍yum repolist是个好习惯,可以及时发现并处理这类问题。
如果要查看某个软件包能装的具体版本,以及它来自哪个源,可以用:
yum list --showduplicates nginx这个操作在排查软件版本问题时很好用。比如你发现装了软件之后启动失败,怀疑版本和预期不符,这条命令能立刻告诉你当前有哪些可用的版本。
最后再分享一个小经验:配好yum源并测试通过后,如果是虚拟机环境,建议立刻做一次快照。这样后续在测试环境里安装软件、调整依赖时如果出了问题,可以随时回滚到“源刚配置好”的干净状态,省时省力。我在自己练习时也经常采用这个流程,效率会高很多。
配置yum源这件事,本质上就是解决“从哪里来、信任谁给的包、怎么管好依赖”这几个问题。把源文件的结构、变量的含义、缓存和密钥的工作机制都吃透了,不管系统是CentOS、Rocky,还是十年后出的新发行版,你都能快速上手。至于那些具体命令和镜像地址,忘了随时查就行,不需要死记硬背。