CentOS系统中yum和dnf本质上是同一套包管理体系的不同版本工具,yum是CentOS 7及之前版本的默认包管理器,dnf则是CentOS 8及之后版本的默认包管理器,两者底层都依赖RPM包格式和仓库配置。在实际运维中,你可能需要在CentOS 7上升级到dnf,或者在CentOS 8中强制使用yum,又或者需要管理本地仓库、第三方仓库、镜像源切换等操作。下面直接给你讲清楚怎么切换、怎么管理仓库、遇到问题怎么解决。
一、yum和dnf的核心区别到底在哪很多人以为yum和dnf是两套完全不同的东西,其实不是。dnf是yum的下一代,它解决了yum在依赖解析、内存占用、API设计上的老问题。具体来说:yum用Python 2编写,dnf用Python 3编写;yum的依赖解析算法比较慢,dnf用libsolv库重新实现了解析器,速度快很多;dnf的API更规范,支持插件扩展更方便。但在日常使用命令上,两者几乎一模一样,dnf甚至完全兼容yum的命令格式,你输入dnf install和yum install效果一样。
需要注意的是,CentOS 7默认只有yum,CentOS 8默认只有dnf(yum命令其实是指向dnf的软链接)。如果你在CentOS 7上想用dnf,需要手动安装;在CentOS 8上想用yum,虽然有兼容链接,但底层跑的还是dnf。
二、CentOS 7上升级安装dnf的具体步骤CentOS 7默认没有dnf,你需要先启用EPEL仓库,然后安装dnf。操作如下:
yum install -y epel-release yum install -y dnf
安装完成后,你可以直接用dnf命令替代yum。如果你想彻底切换,可以做一个别名或者直接替换:
alias yum='dnf' echo "alias yum='dnf'" >> /etc/profile.d/alias.sh
这样以后输入yum实际执行的就是dnf。但我个人建议不要完全替换,因为某些老脚本可能依赖yum的特定行为,保留两者共存更稳妥。
三、CentOS 8中强制使用yum的方法CentOS 8中yum命令其实已经是dnf的别名了,你直接输入yum install nginx,底层跑的就是dnf。如果你的脚本或者习惯一定要用yum,不需要额外操作。但如果你想确认当前用的到底是哪个,可以执行:
yum --version dnf --version
如果两个命令都能输出版本信息,说明系统同时支持。在CentOS 8 Stream中,yum 4.x本质上就是dnf 4.x的包装层。
四、仓库配置文件的位置和结构不管是yum还是dnf,仓库配置文件都放在/etc/yum.repos.d/目录下,文件后缀是.repo。每个.repo文件就是一个仓库的定义。一个典型的repo文件结构如下:
[baseos] name=CentOS Linux $releasever - BaseOS baseurl=https://mirrors.aliyun.com/centos/$releasever/BaseOS/$basearch/os/ enabled=1 gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
关键字段解释:方括号里的是仓库ID;name是显示名称;baseurl是仓库地址;enabled=1表示启用,0表示禁用;gpgcheck=1表示校验签名。你要切换镜像源,本质上就是修改baseurl这一行。
五、国内常用镜像源切换方法CentOS官方源在国内访问速度慢,运维中几乎都要换成国内镜像。常用的有阿里云、腾讯云、华为云、中科大等。以阿里云为例,CentOS 7的切换方法:
cd /etc/yum.repos.d/ sed -i 's|mirrorlist=|#mirrorlist=|g' CentOS-Base.repo sed -i 's|#baseurl=http://mirror.centos.org|baseurl=https://mirrors.aliyun.com|g' CentOS-Base.repo
CentOS 8的操作类似,但repo文件名可能是CentOS-Linux-BaseOS.repo和CentOS-Linux-AppStream.repo:
sed -i 's|mirrorlist=|#mirrorlist=|g' /etc/yum.repos.d/CentOS-* sed -i 's|#baseurl=http://mirror.centos.org|baseurl=https://mirrors.aliyun.com|g' /etc/yum.repos.d/CentOS-*
换完之后记得清理缓存并重建:
yum clean all yum makecache
或者用dnf:
dnf clean all dnf makecache六、本地仓库搭建和管理
在内网环境或者无法联网的服务器上,你需要搭建本地仓库。步骤很简单:找一台能联网的同版本CentOS机器,把所有安装包下载下来,然后用createrepo工具生成元数据。
首先在联网机器上安装下载工具:
yum install -y yum-utils createrepo
创建本地目录并下载BaseOS和AppStream的包:
mkdir -p /data/centos7-local/{BaseOS,AppStream}
reposync --repoid=base --download_path=/data/centos7-local/BaseOS
reposync --repoid=updates --download_path=/data/centos7-local/BaseOS
reposync --repoid=extras --download_path=/data/centos7-local/AppStream
然后生成仓库元数据:
createrepo /data/centos7-local/BaseOS createrepo /data/centos7-local/AppStream
把这个目录通过NFS或者HTTP共享出去。在目标机器上创建本地repo文件:
[local-base] name=Local BaseOS baseurl=file:///data/centos7-local/BaseOS enabled=1 gpgcheck=0 [local-appstream] name=Local AppStream baseurl=file:///data/centos7-local/AppStream enabled=1 gpgcheck=0
保存为/etc/yum.repos.d/local.repo,然后yum clean all && yum makecache就能用了。
七、第三方仓库的添加与管理除了系统自带仓库,你还需要加EPEL、Remi、Docker等第三方仓库。以EPEL为例:
yum install -y epel-release
Remi仓库常用于安装高版本PHP:
yum install -y https://rpms.remirepo.net/enterprise/remi-release-7.rpm
Docker仓库:
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
添加完第三方仓库后,建议禁用不需要的仓库来避免冲突。比如你不需要某个仓库,直接在对应repo文件里把enabled改成0,或者用命令:
yum-config-manager --disable remi-php74八、仓库优先级设置和冲突处理
当多个仓库提供同一个包时,系统会选择优先级高的。默认情况下,系统自带仓库优先级是99,第三方仓库通常是99或者更低。你可以在repo文件里手动设置priority:
[myrepo] name=My Custom Repo baseurl=https://example.com/repo/ enabled=1 gpgcheck=0 priority=1
priority数值越小优先级越高。如果遇到包冲突,可以用yum list available包名查看所有来源,或者用dnf downgrade包名降级到指定仓库的版本。
九、yum和dnf的缓存管理与故障排查有时候yum或dnf报错,大多数情况是缓存损坏或者仓库元数据过期。最直接的解决办法:
yum clean all rm -rf /var/cache/yum yum makecache
如果还是报错,检查网络连通性和DNS解析:
curl -I https://mirrors.aliyun.com ping mirrors.aliyun.com
如果是SSL证书问题,临时关闭gpgcheck测试:
sed -i 's/gpgcheck=1/gpgcheck=0/g' /etc/yum.repos.d/*.repo
但生产环境不建议长期关闭gpgcheck,这会带来安全风险。
十、实战建议和总结在实际运维中,我的建议是:CentOS 7能装dnf就装dnf,体验更好;CentOS 8直接用dnf就行,yum只是兼容层。仓库管理方面,至少配两个镜像源做备份,本地仓库在内网环境是刚需。不要随意禁用base和updates仓库,否则系统安全补丁都打不上。定期执行yum update或dnf update保持系统安全,但生产服务器建议先在测试环境验证再更新。
最后提醒一点,CentOS 7已经在2024年6月30日停止维护(EOL),CentOS 8 Stream也将在2024年底结束。如果你还在用这两个版本,建议尽快规划迁移到Rocky Linux或AlmaLinux,这两个是CentOS的社区接替版本,yum/dnf操作完全兼容,迁移成本最低。
