努力
加油

CentOS 8.0 相较于 7.x 版本在软件包管理上有何不同?

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 带来了性能和功能上的提升,但要求用户适应新的模块和流管理机制。

迁移建议:

  1. 熟悉 dnf module 命令的使用。
  2. 理解 BaseOS 和 AppStream 的区别。
  3. 在自动化脚本中使用 dnf 而非 yum。
  4. 如果需要旧版软件,优先考虑使用容器(Docker/Podman)而非强行在主机上安装旧版本,以保持系统整洁。

最后提醒:CentOS 8 已于 2021 年底停止维护(EOL),官方不再提供安全更新。在生产环境中,建议迁移至 Rocky Linux、AlmaLinux 或 Ubuntu LTS 等持续更新的发行版。