当前位置:首页>Linux>Linux 系统运维工程师必备工具箱(第8篇)之软件包管理对比:apt vs yum vs dnf

Linux 系统运维工程师必备工具箱(第8篇)之软件包管理对比:apt vs yum vs dnf

  • 2026-10-11 08:38:17
Linux 系统运维工程师必备工具箱(第8篇)之软件包管理对比:apt vs yum vs dnf

从早期的rpm与dpkg手动处理依赖的“黑暗时代”,到如今apt、yum、dnf三大主流工具各显神通,我们的工作方式发生了翻天覆地的变化。结合日常工作中的实际场景,为大家梳理一下这三款工具的特点、使用心得以及那些年我踩过的“坑”。

一、 初识:三位主角的出身与定位

首先,让我们快速认识一下它们:

  • APT (Advanced Package Tool): 主要服务于Debian及其衍生系统(如Ubuntu)。它并非一个单独的命令,而是一个工具集,我们最常打交道的是apt-get和后来更友好的apt命令。它的后端是dpkg包管理器。在我的经验里,Debian系的稳定性和庞大的软件仓库,让它在服务器和容器基础镜像领域占据半壁江山。
  • YUM (Yellowdog Updater, Modified): 曾是Red Hat Enterprise Linux (RHEL)、CentOS 7及以前版本、Fedora(早期)的默认包管理器。它基于RPM包格式,最大的贡献是优雅地解决了令人头疼的依赖关系问题。在很长一段时间里,它是企业级Linux运维的“标准答案”。

  • DNF (Dandified YUM): 可以看作是YUM的现代化继承者,用C、C++和Python重写,解决了YUM长期存在的性能瓶颈和依赖解析的一些固有问题。从Fedora 22和RHEL 8/CentOS 8开始,它正式取代YUM成为默认包管理器。它的出现,标志着RPM系包管理进入了一个更高效、更健壮的新阶段。

二、 实战对比:从日常操作看异同

理论说再多,不如动手敲几条命令。下面我通过几个最常见的运维场景,来展示它们的用法。

场景一:系统更新与升级

这是保持系统健康的基础操作。

  • APT (Ubuntu 22.04):

    # 更新本地软件包索引(相当于刷新软件列表)
    sudo apt update

    # 升级所有可升级的软件包
    sudo apt upgrade

    # 进行发行版升级(谨慎操作!)
    sudo apt dist-upgrade

    经验谈:apt update是必须的第一步,否则你操作的可能是过时的软件信息。upgrade和dist-upgrade的区别在于后者会处理因依赖关系变化而需要新增或删除的包,在跨大版本升级时常用。

  • YUM (CentOS 7):

    # 检查并更新所有包
    sudo yum update

    # 也可以使用 upgrade(对于CentOS 7,两者在更新系统时通常等价)
    sudo yum upgrade

    踩坑记:在早期版本的YUM中,update和upgrade的行为有细微差别,但现在基本一致。但在生产环境,我强烈建议先yum check-update查看有哪些更新,再评估影响后执行。

  • DNF (Rocky Linux 9):

    # 更新所有包
    sudo dnf update

    # 或者使用 upgrade,两者是别名
    sudo dnf upgrade

    体验提升:DNF的命令输出更清晰,依赖解析速度明显快于YUM,尤其是在元数据庞大的系统中。

场景二:软件包的安装、查询与移除

  • 安装一个软件(以Nginx为例):

    # APT
    sudo apt install nginx

    # YUM
    sudo yum install nginx

    # DNF
    sudo dnf install nginx

    三者语法高度相似,非常友好。

  • 查询软件包信息:

    # APT:搜索
    apt search nginx
    # 查看详细信息
    apt show nginx

    # YUM:搜索(也支持通配符)
    yum search nginx
    # 列出详细信息
    yum info nginx

    # DNF:搜索(速度更快)
    dnf search nginx
    # 查看信息
    dnf info nginx
  • 移除软件包:

    # APT:移除软件包但保留设置文件
    sudo apt remove nginx
    # 彻底移除软件包及其设置文件
    sudo apt purge nginx

    # YUM/DNF:移除软件包(默认不移除设置文件,但依赖包可能被清理)
    sudo yum remove nginx
    sudo dnf remove nginx

    重要提醒:apt purge和yum/dnf remove在对待设置文件的行为上略有不同。在Debian系中,purge是清理设置文件的明确操作。而在RPM系中,常规remove不删除用户修改过的设置文件(通常以.rpmsave后缀保留),但依赖的库文件如果没其他包使用会被移除,这点需要注意。

场景三:处理依赖与仓库管理

  • 清理缓存与孤儿包:

    # APT:清理已下载的.deb包
    sudo apt clean
    # 自动移除不再需要的依赖包
    sudo apt autoremove

    # YUM:清理所有缓存
    sudo yum clean all
    # 移除孤儿包(需要安装 yum-utils)
    sudo package-cleanup --orphans

    # DNF:清理所有缓存
    sudo dnf clean all
    # 自动移除不再需要的依赖(非常实用的特性)
    sudo dnf autoremove

    排坑重点:定期autoremove或清理孤儿包可以释放磁盘空间,但在生产环境执行前务必确认列表,防止误删仍有用的库。

  • 仓库管理: 三者的仓库设置文件都位于/etc下:

    • APT: /etc/apt/sources.list 和 /etc/apt/sources.list.d/目录。
    • YUM/DNF: /etc/yum.repos.d/ 目录下的.repo文件。 设置示例(DNF/RHEL系添加EPEL仓库):
    sudo dnf install epel-release

    或者手动创建.repo文件。相比之下,APT的sources.list格式更简洁,而YUM/DNF的.repo文件区块化更清晰。

三、 深度思考:如何选择与高效使用?

经过多年的实践,我形成了以下观点:

  1. 性能与未来:DNF无疑是RPM系的未来,其依赖解析算法(基于SAT求解器)和模块化特性(RHEL8+的AppStream)带来了更好的性能和灵活性。新项目或新系统应优先考虑使用DNF的环境。

  2. 稳定与习惯:对于仍需维护的CentOS 7或老系统,YUM依然是可靠的工具。它的命令与DNF高度兼容,学习成本低。而APT在Debian/Ubuntu世界已经非常成熟稳定,其庞大的社区仓库和清晰的包命名规范是巨大优势。

  3. “坑”与最佳实践:

    • 仓库一致性:无论哪种工具,切勿混用多个第三方仓库,极易导致依赖地狱。优先使用发行版官方仓库和少数可信的第三方仓库(如EPEL)。
    • 变更控制:在生产环境进行任何upgrade或大量安装移除前,先在测试环境验证。使用apt-mark hold 或yum versionlock锁定关键软件包的版本。
    • 理解操作含义:清楚知道dist-upgrade、autoremove等命令的潜在影响。apt命令相比apt-get提供了更友好的进度提示和颜色输出,但对脚本而言,apt-get的稳定输出更可靠。
    • 善用本地缓存:在内网环境中,搭建本地镜像仓库(如apt-mirror, createrepo)可以极大加速软件搭建,并减少对外网依赖。

结语

工具本身没有绝对的高下之分,只有是否适合当下的场景。作为一名运维工程师,我的“工具箱”里同时容纳了apt、yum和dnf。理解它们的设计哲学,掌握其核心命令和设置方法,再结合严格的变更管理流程,就能让软件包管理从“麻烦源”变为保障系统稳定运行的坚实基石。希望我的这些经验分享,能帮助你在运维道路上少走弯路,更加从容地应对各种挑战。

👨‍💻 运维老兵经验:根据实际生产环境,以上步骤建议先在测试环境验证,并做好备份。参数值需根据服务器设置调整,不要盲目照搬。

如果喜欢,点个「在看」分享给朋友吧。

最新文章

随机文章