一、引言:一次"装不上软件"的深夜排查
凌晨一点,你被运维值班电话叫醒:线上业务监控突然告警,某台 Web 服务器内存持续飙升。你远程登录排查,发现是某个后台上传组件依赖的图片处理库版本过旧导致。你飞快地敲下 yum install -y libjpeg-turbo-devel,结果命令行却吐出一串错误:Error: Package conflicts with installed version。你不禁想:为什么别人一条命令就能装好软件,到我这里却处处报错?
其实,这类场景在 Linux 运维工作中几乎每天都会遇到。无论是安装新服务、修复依赖漏洞,还是给系统打补丁,都绕不开一个核心技能------软件包管理 。它就像操作系统的"应用商店 + 快递分拣中心",既负责查找、下载、安装软件,也负责检查软件之间的"亲戚关系"(依赖),还要保证升级、卸载时不会把系统搞崩。熟练掌握 yum 、apt 、dnf 这三套主流包管理工具,是每一位 Linux 工程师从"会用系统"迈向"能管理好系统"的关键一步。
本文将带你系统梳理三大包管理工具的使用方法、常见参数、真实示例和避坑经验,并结合底层机制、仓库管理和最佳实践,让你读完后不仅"会用命令",更"懂得原理"。建议边读边在虚拟机或测试服务器上动手验证,效果会更好。
二、先搞懂基础:什么是软件包管理
在深入命令之前,我们先建立几个基础概念。理解它们之后,很多看似复杂的报错其实都有清晰的逻辑可循。
2.1 软件包与依赖关系
软件包(Package) 是把一个软件及其相关文件打包在一起的"安装包"。在 Windows 上我们习惯双击 .exe 安装程序,而在 Linux 上,软件通常被封装成特定格式的包文件,例如 Red Hat 系的 .rpm 包和 Debian 系的 .deb 包。
依赖(Dependency) 则是指一个软件要正常运行,往往需要依赖其他软件或库。可以把一个软件想象成一台"主机",它要跑起来,需要"电源"(底层库)、"显卡驱动"(运行环境)、"操作系统补丁"(动态链接库)等零部件。如果这些零部件缺失或版本不匹配,软件就无法安装或启动。比如安装 Nginx 需要依赖 pcre、zlib、openssl 等库,包管理器会自动把这些依赖一起装上,省去你手工逐个下载的烦恼。
2.2 软件仓库(Repository)
软件仓库相当于"官方应用商店"。它是一组存放在服务器上的软件包集合,并附带元数据索引,记录每个包的名称、版本、依赖关系等信息。用户不需要记住下载地址,只需告诉包管理器"我要装 Nginx",它就会从配置好的仓库中自动检索、下载并安装,同时解析依赖。
生产环境中我们经常会把默认官方仓库替换为国内镜像源,例如阿里云、腾讯云、清华源的镜像,这样可以大幅提升下载速度。这部分内容会在第六节详细介绍。
2.3 YUM / APT / DNF 分别是什么
这三者都是基于仓库的高层包管理器,负责处理依赖、下载和安装流程,它们的底层分别依赖不同的包格式和底层工具:
| 对比项 | YUM | DNF | APT |
|---|---|---|---|
| 所属阵营 | Red Hat / CentOS 系 | Fedora / RHEL 8+ 系 | Debian / Ubuntu 系 |
| 底层包格式 | RPM | RPM | DEB |
| 依赖解析库 | 基于 Python,历史较长 | 基于 libsolv,效率更高 | 基于 libapt |
| 典型系统 | CentOS 6/7 | Fedora、CentOS 8、Rocky 9 | Ubuntu、Debian |
| 命令入口 | yum |
dnf |
apt / apt-get |
一句话总结:**在 Red Hat 系系统上,老版本用 yum,新版本推荐 dnf;在 Debian 系系统上用 apt。**二者风格不同,但管理思想十分相似。
三、YUM 命令全解析
3.1 YUM 是什么
YUM(Yellowdog Updater, Modified) 诞生于 2001 年前后,最初是为了给 Yellow Dog Linux 管理 RPM 包而开发,后来被 Red Hat 系发行版广泛采用。它最大的贡献是解决了 RPM 包人工安装时令人头疼的"依赖地狱"------以前用 rpm -ivh 包名.rpm 安装软件时,经常因为缺少依赖而反复报错,需要一个个手动补齐,让人崩溃。YUM 的出现,让"一条命令装好依赖"成为可能。
可以把 YUM 理解成一位"老练的管家":你需要装什么,它先去仓库查清楚这个软件还需要哪些"配件",然后按正确的顺序把所有东西都下载、安装好,并检查版本是否冲突。
3.2 基本语法与常用参数
YUM 命令的基本语法如下:
bash
yum [选项] [子命令] [软件包名]
常用全局参数说明:
| 参数 | 含义 |
|---|---|
-y |
安装或卸载过程中所有询问自动回答 yes,适合脚本自动化 |
-q |
安静模式,减少输出信息 |
-v |
详细模式,输出更多诊断信息 |
--nogpgcheck |
跳过 GPG 签名校验(不建议在生产环境使用) |
--enablerepo=仓库名 |
临时启用某个仓库 |
--disablerepo=仓库名 |
临时禁用某个仓库 |
3.3 常用子命令详解
3.3.1 安装软件:yum install
install 是使用频率最高的子命令,用于安装一个或多个软件包。
bash
# 安装单个软件
yum install -y nginx
同时安装多个软件
yum install -y vim wget net-tools
执行后,YUM 会输出依赖解析过程、下载进度和安装结果。常见的输出片段如下:
bash
Dependencies Resolved
================================================================================
Package Arch Version Repository Size
Installing:
nginx x86_64 1.20.1-10.el7 epel 586 k
Installing for dependencies:
gperftools-libs x86_64 2.6.1-1.el7 base 272 k
Transaction Summary
Install 1 Package (+1 Dependent package)
Total download size: 858 k
Installed:
nginx.x86_64 0:1.20.1-10.el7
Complete!
看到最后一行 Complete! 就表示安装成功了。如果安装时希望跳过依赖检查(危险操作,不推荐),可以使用 --skip-broken 跳过无法解析的包,但生产环境应尽量避免。
3.3.2 卸载软件:yum remove
remove 用于卸载已安装的软件包,并会自动检查哪些依赖不再被其他软件使用后一并处理(部分版本也会提示移除依赖)。
bash
# 卸载软件
yum remove -y nginx
**注意事项:**卸载前务必确认该软件没有正在运行,并确认它没有被其他重要服务依赖。卸载时 YUM 会列出将同时被移除的依赖包清单,一定要仔细阅读,避免误删系统关键组件。
3.3.3 更新软件:yum update
update 用于把已安装的软件升级到仓库中的最新版本。不带包名表示升级系统中所有可升级的软件;指定包名则只升级该软件。
bash
# 升级所有软件
yum update -y
仅升级指定软件
yum update -y openssl
执行 yum update -y openssl 时,输出会显示"Updating:"以及新版本号,最后同样以 Complete! 结束。
最佳实践: 生产环境不要盲目执行全量 yum update,尤其是跨大版本升级时风险较高。应先备份、先在测试环境验证,再分批灰度升级。
3.3.4 搜索软件:yum search
当你不确定某个软件在仓库里的准确包名时,可以用 search 按关键字检索。
bash
# 搜索与 http 相关的软件包
yum search http
它会输出一列匹配结果,例如 httpd.x86_64、httpd-tools.x86_64、mod_ssl.x86_64 等。看到包名后,再用 install 安装即可。
3.3.5 查看软件信息:yum info
info 用于查看某个软件包的详细信息,包括版本、仓库来源、大小、简介等,是动手安装前的"尽职调查"。
bash
yum info nginx
预期输出示例:
bash
Available Packages
Name : nginx
Arch : x86_64
Version : 1.20.1
Release : 10.el7
Size : 586 k
Repo : epel
Summary : High performance web server and reverse proxy server
License : BSD
Description : Nginx is a high performance web server...
3.3.6 列出软件:yum list
list 用于列出仓库中或已安装的软件包,常结合关键词和状态使用。
bash
# 列出所有已安装的软件包
yum list installed
列出仓库中所有可更新的软件包
yum list updates
列出仓库中包含 kernel 的软件包
yum list | grep kernel
配合 grep 过滤是非常实用的组合,能帮你快速定位目标包。
3.3.7 清理缓存:yum clean
YUM 会把下载过的元数据和 RPM 包缓存到本地,时间久了会占用磁盘空间,也可能因为缓存过期导致安装异常。此时可以用 clean 清理。
bash
# 清理所有缓存
yum clean all
重新生成缓存
yum makecache
当你修改了仓库配置或遇到"缓存过期"导致的安装错误时,执行 yum clean all 再 yum makecache 往往能解决问题。
3.4 YUM 常见错误与注意事项
Package not found:仓库中没有该软件包。可检查包名是否拼写正确,或确认对应仓库(如 EPEL)是否已启用。conflicts with或Requires: xxx报错 :说明存在依赖冲突或缺少依赖源,不要盲目加--skip-broken,应先明确缺少哪个仓库。- 下载速度慢:直接原因是默认源在国外,建议更换国内镜像源。
- 缓存损坏 :表现为元数据解析失败,先
yum clean all再重试。 - 不要混用 RPM 手动安装和 YUM 安装 :如果先用
rpm -ivh手工装了某个包,YUM 可能无法正确追踪依赖,导致后续升级混乱。
四、DNF:YUM 的接班人
4.1 DNF 是什么
DNF(Dandified YUM) 是 YUM 的下一代重写版本,从 Fedora 18 开始逐步引入,并在 RHEL 8、CentOS 8、Rocky Linux、AlmaLinux 等新系统中成为默认包管理器。它保留了与 YUM 几乎一致的命令习惯,但底层采用更高效的 libsolv 依赖求解器,在处理复杂依赖、内存占用和运行速度上都有明显提升。可以把它看作"换装了新发动机的老朋友",常用姿势没变,跑起来更快更稳。
4.2 DNF 常用命令
DNF 的命令与 YUM 高度兼容,日常使用几乎无感迁移:
bash
# 安装软件
dnf install -y nginx
卸载软件
dnf remove -y nginx
升级系统
dnf upgrade -y
搜索软件
dnf search httpd
查看软件信息
dnf info httpd
清理缓存
dnf clean all
dnf makecache
查看历史事务
dnf history
dnf history 是一个非常实用的功能,能查看甚至回滚历史安装/卸载操作。例如:
bash
dnf history list
会输出类似下面的历史事务列表:
bash
ID | Command line | Date and time | Action(s) | Altered
--------------------------------------------------------------------------
3 | dnf install -y nginx | 2026-09-06 22:00 | Install | 2
2 | dnf remove -y vim | 2026-09-05 10:12 | Erase | 1
1 | | 2026-09-01 08:30 | I, U | 128
如果某次升级导致问题,可以用 dnf history rollback ID 回滚到指定事务之前的状态。
4.3 YUM 与 DNF 对比
| 对比项 | YUM | DNF |
|---|---|---|
| 依赖求解效率 | 较慢,复杂依赖时明显卡顿 | 更快的 libsolv 求解器 |
| 内存占用 | 较高 | 较低 |
| 历史回滚 | 需 yum history 插件支持 |
内置 dnf history |
| 命令兼容性 | 传统命令 | 基本兼容 yum 常用命令 |
| 系统支持 | CentOS 6/7 等老系统 | RHEL 8+、Fedora 等新系统 |
注意事项: 在 CentOS 7 上系统默认只有 yum,如需使用 dnf 需要额外安装 dnf 软件包;而在 RHEL 8+ 系统上,直接使用 dnf,yum 命令通常也会保留作为兼容入口。
五、APT 命令全解析
5.1 APT 是什么
APT(Advanced Package Tool) 是 Debian 及其衍生系统(最典型的是 Ubuntu)的核心包管理工具。它在 1998 年随 Debian 项目发布,同样是为了解决依赖管理问题而生,底层管理 .deb 格式的软件包。APT 由一系列工具组成,其中最常用的是 apt-get、apt-cache 以及后来推出的统一入口 apt。
如果把 YUM/DNF 比作 Red Hat 生态的"管家",APT 就是 Debian/Ubuntu 生态里同样勤恳的"管家"。它们职责相同,只是语言和习惯略有不同。
5.2 apt 与 apt-get 的区别
很多初学者会困惑:apt 和 apt-get 到底用哪个?简单来说:
apt是面向用户的新统一命令,从 Ubuntu 16.04 起被重点推荐,提供更友好的交互和彩色进度条,常用操作更简洁。apt-get是更早期、更底层的命令,行为稳定,更适合编写脚本(因为输出格式多年不变)。apt-cache用于查询软件包信息,例如apt-cache search等价于apt search。
日常手动操作推荐 apt;编写自动化脚本时,为保证长期稳定,使用 apt-get 往往是更保守的选择。
5.3 基本语法与参数
bash
apt [选项] [子命令] [软件包名]
常用参数:
| 参数 | 含义 |
|---|---|
-y |
自动确认所有询问 |
-f / --fix-broken |
尝试修复损坏的依赖关系 |
--no-install-recommends |
不安装推荐包(减少体积,适合服务器精简环境) |
-s / --simulate |
模拟执行,不实际修改系统 |
-qq |
安静模式,减少输出 |
5.4 常用子命令详解
5.4.1 更新软件源索引:apt update
在使用 apt 安装任何软件前,都应先运行 apt update,它不会升级任何软件,只做一件事:从各软件源下载最新的包索引到本地,让系统知道"现在仓库里都有什么版本"。
bash
sudo apt update
预期输出片段:
bash
Hit:1 http://mirrors.aliyun.com/ubuntu jammy InRelease
Get:2 http://mirrors.aliyun.com/ubuntu jammy-updates InRelease [119 kB]
Fetched 119 kB in 1s (98.4 kB/s)
Reading package lists... Done
看到 Reading package lists... Done 即表示索引更新完毕。
5.4.2 安装软件:apt install
bash
# 安装单个软件
sudo apt install -y nginx
安装多个软件
sudo apt install -y vim curl git
APT 同样会自动解析依赖,列出将要安装的包和占用空间,确认后开始下载安装。输出片段:
bash
Reading package lists... Done
Building dependency tree... Done
The following additional packages will be installed:
nginx-common
Suggested packages:
fcgiwrap nginx-doc
The following NEW packages will be installed:
nginx nginx-common
0 upgraded, 2 newly installed, 0 to remove and 28 not upgraded.
Setting up nginx (1.18.0-6ubuntu14)...
5.4.3 卸载软件:apt remove 与 apt purge
remove 只卸载软件本体,但会保留其在 /etc 下的配置文件;purge 则连配置文件一起删除,卸载得更彻底。
bash
# 卸载软件,保留配置
sudo apt remove -y nginx
彻底卸载,包括配置文件
sudo apt purge -y nginx
常见错误: 卸载后服务依然残留启动项或配置,往往是因为使用了 remove 而不是 purge。如果只是想临时停用,也可以先 systemctl stop nginx 再决定是否卸载。
5.4.4 升级软件:apt upgrade
upgrade 会把系统中已安装的软件升级到最新版本,但不会卸载任何包,也不会装新内核(更保守的 full-upgrade 则可能安装/移除包以完成升级)。
bash
# 升级所有已安装软件
sudo apt upgrade -y
更完整的升级(可处理包的新增与移除)
sudo apt full-upgrade -y
升级前建议先 apt update,让系统拿到最新索引。
5.4.5 搜索软件:apt search
bash
apt search nginx
会列出名称或描述中包含 nginx 的软件包,并附带一句简短说明,方便你判断需要安装哪一个。
5.4.6 查看软件信息:apt show
bash
apt show nginx
输出包含版本、来源、大小、依赖、描述等详细资料,是安装前确认信息的好习惯。
5.4.7 清理无用包:apt autoremove 与 apt clean
随着使用时间增长,系统会留下一些"孤儿依赖"------当初为某软件安装,但该软件卸载后已无其他软件使用。这些包可以用 autoremove 清理;而 clean 用于清除下载到本地的 .deb 安装包缓存。
bash
# 自动移除不再需要依赖包
sudo apt autoremove -y
清理下载的软件包缓存
sudo apt clean
这两个命令配合使用,可以帮你保持系统干净、节省磁盘空间。
5.5 APT 常见错误与注意事项
Could not get lock /var/lib/dpkg/lock:说明有另一个 apt/dpkg 进程正在运行,等待其结束即可,不要强制删除锁文件(除非确认没有进程)。Unable to locate package:通常是忘记执行apt update,或软件源中没有该包。E: Broken packages:出现损坏的依赖关系,尝试sudo apt install -f修复。apt update太频繁没必要:它只更新索引,不升级软件,但每次安装前执行一次即可。
六、软件源与仓库管理
包管理器的"弹药库"就是软件源。掌握源管理,既能解决下载慢的问题,也能灵活引入第三方软件。
6.1 YUM / DNF 源管理
YUM/DNF 的仓库配置存放在 /etc/yum.repos.d/ 目录下,文件后缀为 .repo。一个典型的仓库配置片段如下(以阿里云 Base 源为例):
bash
[base]
name=CentOS-$releasever - Base - mirrors.aliyun.com
baseurl=http://mirrors.aliyun.com/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
enabled=1
其中核心字段说明:
[base]:仓库标识,需唯一。name:仓库的易读名称。baseurl:仓库实际地址。gpgcheck:是否开启签名校验,建议保持 1。enabled:是否启用该仓库,0 为禁用。
修改配置后,记得执行 yum clean all 和 yum makecache(DNF 用 dnf clean all 与 dnf makecache)让新源生效。
6.2 APT 源管理
APT 的源配置通常在 /etc/apt/sources.list 文件或 /etc/apt/sources.list.d/ 目录下的 .list 文件中。以 Ubuntu 22.04 使用阿里云镜像为例,配置内容类似:
bash
deb http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
每一行 deb 表示一个二进制软件源,后面的 jammy 是发行版代号,main restricted universe multiverse 表示软件包的分类组件。修改后必须执行 sudo apt update 更新索引。
注意事项: 修改源前建议先备份原文件,例如 cp /etc/apt/sources.list /etc/apt/sources.list.bak。换源后如果出现部分包找不到,可能是某些组件(如 contrib、non-free)没有包含在你的镜像地址里。
七、知识扩展:RPM 与 DEB 的底层世界
为什么 Red Hat 系和 Debian 系要用两套完全不同的包格式?这背后是两种发行版生态长期演进的结果。简单来说,RPM(Red Hat Package Manager) 格式最初由 Red Hat 在 1997 年推出,后来成为许多发行版的标准;DEB 格式则由 Debian 项目开发,服务于 dpkg 底层工具。
从技术角度看,两者在作用上类似,都包含:
- 软件的可执行文件、配置文件、文档等实际内容;
- 元数据:包名、版本、摘要、依赖关系、维护者信息等;
- 安装/卸载脚本:在安装前后执行的钩子脚本。
但它们在压缩算法、依赖描述语法、签名机制上存在差异,因此 .rpm 包不能直接安装到 Debian 系统,.deb 包也不能直接装到 Red Hat 系统。虽然存在 alien 这类转换工具,但转换过程往往伴随依赖和路径兼容风险,除非万不得已,并不推荐在生产环境使用。
理解底层包格式有一个实际好处:当高层工具(yum/apt)出现难以解释的报错时,你可以退回到底层工具排查。例如用 rpm -qa 查看 Red Hat 系统上所有已安装的 RPM 包,用 dpkg -l 查看 Debian 系统上所有已安装的 DEB 包,从而判断某个包是否真的已经安装、版本是什么。
bash
# 在 Red Hat 系查看所有已安装包
rpm -qa | grep nginx
在 Debian 系查看所有已安装包
dpkg -l | grep nginx
八、最佳实践:把包管理变成可靠习惯
- 安装前先确认来源:尽量使用官方仓库或可信第三方仓库,避免随意添加来路不明的 PPA 或 repo,防止供应链攻击。
- 升级前先备份:对生产系统做全量升级前,先做好快照、备份关键配置与数据,并在测试环境验证。
- 优先使用仓库,少用源码编译:除非需要特定版本或定制功能,否则优先通过包管理器安装,便于后续升级和依赖追踪。
- 注意
-y的双刃剑 :-y便于自动化,但也可能让你在误操作时失去确认机会。手动操作时可以先不加-y,看清"即将安装/卸载清单"后再确认。 - 定期清理,保持系统清爽 :定期执行
dnf clean all或apt autoremove、apt clean,避免磁盘被缓存占满。 - 用
history留痕 :DNF 的dnf history和 APT 的日志都记录了操作历史,出现问题时先查历史,再决定是否回滚。
九、总结与练习
本文从一次真实的深夜排障场景切入,系统梳理了 Linux 三大包管理工具的核心概念、常用命令、参数说明、真实示例和常见错误。YUM 是 Red Hat 系传统老将,DNF 是其高效接班人,APT 则是 Debian/Ubuntu 生态的主力。无论哪一套工具,万变不离其宗:更新索引、安装、卸载、升级、搜索、清理缓存,再把"换源、备份、看依赖、留历史"这些习惯融入日常,你就能从容应对绝大多数软件管理场景。
下面留几道练习题,建议在虚拟机中动手完成:
- 基础操作 :在 CentOS 7 或 Rocky 9 上分别使用
yum/dnf安装并启动 Nginx,写出完整命令。
提示:安装后使用systemctl start nginx启动,并用systemctl status nginx查看状态。 - 对比思考 :在 Ubuntu 上分别使用
apt remove和apt purge卸载同一个软件,观察/etc下配置文件是否保留。
提示:卸载前后可对比/etc/软件名目录是否存在。 - 换源实战 :把一台 CentOS 或 Ubuntu 测试机的默认软件源替换为阿里云镜像源,并验证安装速度是否提升。
提示:修改前先备份,修改后记得执行clean和makecache(或apt update)。 - 故障排查 :模拟一次
apt锁文件被占用的情况,观察报错信息,并说明正确处理方法。
提示:可以同时开两个终端执行 apt 操作,观察Could not get lock提示,确认不要误删锁文件。 - 原理延伸 :用
rpm -qa或dpkg -l查询系统中某个软件的包名和版本,再说明该软件在包管理器的视角下包含哪些主要文件。
提示:Red Hat 系可用rpm -ql 包名,Debian 系可用dpkg -L 包名查看包内文件列表。
把这几道题亲手做一遍,你对 Linux 软件包管理的理解会从"记住命令"上升到"掌握套路",再遇到装不上、升不动、换源慢的问题时,也更有底气快速定位与解决。