CentOS 8.0 在软件包管理上的变化,核心就两点:换引擎和改逻辑。
简单说,就是从 yum + rpm 的传统组合,变成了 dnf + rpm。这不仅仅是换个命令名字,而是底层架构和依赖解决机制的根本性改变。对于从 CentOS 7 迁移过来的老手来说,最大的痛点往往不是语法差异,而是对“模块(Module)”和“流(Stream)”概念的不适应。
下面从几个关键维度拆解这些不同:
1. 默认包管理器:DNF 取代 YUM
在 CentOS 7 中,我们习惯用 yum。虽然 CentOS 8 依然保留了 yum 命令作为兼容层(调用的是 dnf),但真正的后端引擎是 DNF (Dandified YUM)。
- 性能提升:DNF 使用 Python 编写,多线程处理依赖解析,速度比基于 C 语言编写的旧版 yum 快得多,尤其是在处理大型依赖树时。
- API 统一:在 CentOS 7 中,
yum和yum-config-manager等工具分散在不同包里。CentOS 8 将所有功能整合到dnf命令下,比如配置管理现在用dnf config-manager。 - 兼容性注意:你依然可以输入
yum install nginx,系统会自动重定向到dnf。但在写脚本或自动化运维时,建议直接使用dnf,因为未来版本可能会彻底移除 yum 的兼容壳。
2. 核心架构变化:模块化(Modularity)与 AppStream
这是 CentOS 8 最显著、也最容易让老用户困惑的变化。
CentOS 7 的逻辑:
- 一个软件只有一个版本(通常是稳定版)。
- 例如:
httpd就是 Apache 2.4.x,你想装 Apache 2.2 几乎不可能,除非编译源码。 - 仓库结构相对扁平,主要分 BaseOS 和 Extras。
CentOS 8 的逻辑:
- 引入了 AppStream 仓库概念。
- 支持 多版本共存 和 侧向升级(Side-by-side installation)。
- 通过 Module(模块) 和 Stream(流) 来管理不同版本的软件。
举个例子,如果你想安装 MySQL,在 CentOS 7 上你可能只能装系统默认的 5.7。而在 CentOS 8 上,你可以选择不同的 Stream:
# 查看可用的 MySQL 模块
dnf module list mysql
# 启用 MySQL 8.0 的流
dnf module enable mysql:8.0
dnf module install mysql:8.0
这意味着,你可以在同一台服务器上同时运行 PHP 7.2 和 PHP 7.4,或者 Nginx 1.14 和 Nginx 1.16,只要它们属于不同的模块流。这对于需要测试新版本或保持特定旧版本环境的场景非常有用,但也增加了配置的复杂度。
3. 仓库结构重组:BaseOS vs AppStream
CentOS 7 的仓库主要分为 base, updates, extras。
CentOS 8 将仓库明确划分为两部分:
- BaseOS:包含操作系统核心组件,如内核、glibc、systemd 等基础库。这部分变更频率低,稳定性高。
- AppStream:包含所有应用程序包,如 Web 服务器、数据库、编程语言运行时、开发工具等。
这种分离使得基础系统的更新和应用软件的更新可以解耦。当你执行 dnf update 时,它会同时检查这两个仓库。
4. 扩展模块(EPEL)的集成方式
在 CentOS 7 时代,我们通常需要手动添加 EPEL 源:
yum install epel-release
在 CentOS 8 中,EPEL 不再是独立的 RPM 包,而是作为 额外模块(Extra Modules) 的一部分,通过 dnf 直接启用:
# 启用 EPEL 模块
dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
# 或者更推荐的方式,如果已安装 epel-release,则直接启用模块
dnf module enable epel
此外,CentOS 8 还引入了 PowerTools 仓库(以前叫 Development Tools),里面包含了大量编译工具和头文件,方便开发者构建软件。
5. GPG 签名验证更严格
CentOS 8 对软件包的 GPG 签名验证更加严格。默认情况下,dnf 会强制验证所有包的签名。如果遇到签名问题,你需要确保你的 /etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial 文件存在且有效。
在 CentOS 7 中,有时会因为签名过期或密钥问题导致安装失败,需要手动导入密钥。在 CentOS 8 中,这个过程更自动化,但如果遇到网络问题或镜像源同步延迟,可能会看到更多的签名错误提示。
6. 实际影响与建议
对普通用户的影响:
- 基本命令不变:
install,remove,update,search等用法一致。 - 查询命令略有不同:
yum info变成dnf info,yum repolist变成dnf repolist。 - 配置文件路径基本不变:
/etc/yum.repos.d/依然存在,.repo文件格式兼容。
对运维和开发者的影响:
- 依赖解析更智能:DNF 能更好地处理冲突,减少“依赖地狱”。
- 版本选择灵活:可以利用 Module 特性部署多版本应用,但需要理解 Stream 的概念。
- 自动化脚本需调整:如果使用 Ansible、Puppet 等工具,需确认其支持的 DNF 模块。部分旧版工具可能只识别
yum而忽略module操作。
总结
CentOS 8 的软件包管理从“单版本、扁平化”转向了“多版本、模块化”。dnf 带来了性能和功能上的提升,但要求用户适应新的模块和流管理机制。
迁移建议:
- 熟悉
dnf module命令的使用。 - 理解 BaseOS 和 AppStream 的区别。
- 在自动化脚本中使用
dnf而非yum。 - 如果需要旧版软件,优先考虑使用容器(Docker/Podman)而非强行在主机上安装旧版本,以保持系统整洁。
最后提醒:CentOS 8 已于 2021 年底停止维护(EOL),官方不再提供安全更新。在生产环境中,建议迁移至 Rocky Linux、AlmaLinux 或 Ubuntu LTS 等持续更新的发行版。
云技术博客