从早期的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文件区块化更清晰。
-
三、 深度思考:如何选择与高效使用?
经过多年的实践,我形成了以下观点:
-
性能与未来:DNF无疑是RPM系的未来,其依赖解析算法(基于SAT求解器)和模块化特性(RHEL8+的AppStream)带来了更好的性能和灵活性。新项目或新系统应优先考虑使用DNF的环境。
-
稳定与习惯:对于仍需维护的CentOS 7或老系统,YUM依然是可靠的工具。它的命令与DNF高度兼容,学习成本低。而APT在Debian/Ubuntu世界已经非常成熟稳定,其庞大的社区仓库和清晰的包命名规范是巨大优势。
-
“坑”与最佳实践:
-
- 仓库一致性:无论哪种工具,切勿混用多个第三方仓库,极易导致依赖地狱。优先使用发行版官方仓库和少数可信的第三方仓库(如EPEL)。
-
- 变更控制:在生产环境进行任何
upgrade或大量安装移除前,先在测试环境验证。使用apt-mark hold 或yum versionlock锁定关键软件包的版本。 -
- 理解操作含义:清楚知道
dist-upgrade、autoremove等命令的潜在影响。apt命令相比apt-get提供了更友好的进度提示和颜色输出,但对脚本而言,apt-get的稳定输出更可靠。 -
- 善用本地缓存:在内网环境中,搭建本地镜像仓库(如
apt-mirror, createrepo)可以极大加速软件搭建,并减少对外网依赖。 -
-
结语
工具本身没有绝对的高下之分,只有是否适合当下的场景。作为一名运维工程师,我的“工具箱”里同时容纳了apt、yum和dnf。理解它们的设计哲学,掌握其核心命令和设置方法,再结合严格的变更管理流程,就能让软件包管理从“麻烦源”变为保障系统稳定运行的坚实基石。希望我的这些经验分享,能帮助你在运维道路上少走弯路,更加从容地应对各种挑战。
👨💻 运维老兵经验:根据实际生产环境,以上步骤建议先在测试环境验证,并做好备份。参数值需根据服务器设置调整,不要盲目照搬。
如果喜欢,点个「在看」分享给朋友吧。