Linux 软件包管理:yum / apt / dnf 命令使用全解析

一、引言:一次"装不上软件"的深夜排查

凌晨一点,你被运维值班电话叫醒:线上业务监控突然告警,某台 Web 服务器内存持续飙升。你远程登录排查,发现是某个后台上传组件依赖的图片处理库版本过旧导致。你飞快地敲下 yum install -y libjpeg-turbo-devel,结果命令行却吐出一串错误:Error: Package conflicts with installed version。你不禁想:为什么别人一条命令就能装好软件,到我这里却处处报错?

其实,这类场景在 Linux 运维工作中几乎每天都会遇到。无论是安装新服务、修复依赖漏洞,还是给系统打补丁,都绕不开一个核心技能------软件包管理 。它就像操作系统的"应用商店 + 快递分拣中心",既负责查找、下载、安装软件,也负责检查软件之间的"亲戚关系"(依赖),还要保证升级、卸载时不会把系统搞崩。熟练掌握 yumaptdnf 这三套主流包管理工具,是每一位 Linux 工程师从"会用系统"迈向"能管理好系统"的关键一步。

本文将带你系统梳理三大包管理工具的使用方法、常见参数、真实示例和避坑经验,并结合底层机制、仓库管理和最佳实践,让你读完后不仅"会用命令",更"懂得原理"。建议边读边在虚拟机或测试服务器上动手验证,效果会更好。

二、先搞懂基础:什么是软件包管理

在深入命令之前,我们先建立几个基础概念。理解它们之后,很多看似复杂的报错其实都有清晰的逻辑可循。

2.1 软件包与依赖关系

软件包(Package) 是把一个软件及其相关文件打包在一起的"安装包"。在 Windows 上我们习惯双击 .exe 安装程序,而在 Linux 上,软件通常被封装成特定格式的包文件,例如 Red Hat 系的 .rpm 包和 Debian 系的 .deb 包。

依赖(Dependency) 则是指一个软件要正常运行,往往需要依赖其他软件或库。可以把一个软件想象成一台"主机",它要跑起来,需要"电源"(底层库)、"显卡驱动"(运行环境)、"操作系统补丁"(动态链接库)等零部件。如果这些零部件缺失或版本不匹配,软件就无法安装或启动。比如安装 Nginx 需要依赖 pcrezlibopenssl 等库,包管理器会自动把这些依赖一起装上,省去你手工逐个下载的烦恼。

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,尤其是跨大版本升级时风险较高。应先备份、先在测试环境验证,再分批灰度升级。

当你不确定某个软件在仓库里的准确包名时,可以用 search 按关键字检索。

bash 复制代码
# 搜索与 http 相关的软件包
yum search http

它会输出一列匹配结果,例如 httpd.x86_64httpd-tools.x86_64mod_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 allyum makecache 往往能解决问题。

3.4 YUM 常见错误与注意事项

  • Package not found:仓库中没有该软件包。可检查包名是否拼写正确,或确认对应仓库(如 EPEL)是否已启用。
  • conflicts withRequires: 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+ 系统上,直接使用 dnfyum 命令通常也会保留作为兼容入口。

五、APT 命令全解析

5.1 APT 是什么

APT(Advanced Package Tool) 是 Debian 及其衍生系统(最典型的是 Ubuntu)的核心包管理工具。它在 1998 年随 Debian 项目发布,同样是为了解决依赖管理问题而生,底层管理 .deb 格式的软件包。APT 由一系列工具组成,其中最常用的是 apt-getapt-cache 以及后来推出的统一入口 apt

如果把 YUM/DNF 比作 Red Hat 生态的"管家",APT 就是 Debian/Ubuntu 生态里同样勤恳的"管家"。它们职责相同,只是语言和习惯略有不同。

5.2 apt 与 apt-get 的区别

很多初学者会困惑:aptapt-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,让系统拿到最新索引。

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 allyum makecache(DNF 用 dnf clean alldnf 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。换源后如果出现部分包找不到,可能是某些组件(如 contribnon-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

八、最佳实践:把包管理变成可靠习惯

  1. 安装前先确认来源:尽量使用官方仓库或可信第三方仓库,避免随意添加来路不明的 PPA 或 repo,防止供应链攻击。
  2. 升级前先备份:对生产系统做全量升级前,先做好快照、备份关键配置与数据,并在测试环境验证。
  3. 优先使用仓库,少用源码编译:除非需要特定版本或定制功能,否则优先通过包管理器安装,便于后续升级和依赖追踪。
  4. 注意 -y 的双刃剑-y 便于自动化,但也可能让你在误操作时失去确认机会。手动操作时可以先不加 -y,看清"即将安装/卸载清单"后再确认。
  5. 定期清理,保持系统清爽 :定期执行 dnf clean allapt autoremoveapt clean,避免磁盘被缓存占满。
  6. history 留痕 :DNF 的 dnf history 和 APT 的日志都记录了操作历史,出现问题时先查历史,再决定是否回滚。

九、总结与练习

本文从一次真实的深夜排障场景切入,系统梳理了 Linux 三大包管理工具的核心概念、常用命令、参数说明、真实示例和常见错误。YUM 是 Red Hat 系传统老将,DNF 是其高效接班人,APT 则是 Debian/Ubuntu 生态的主力。无论哪一套工具,万变不离其宗:更新索引、安装、卸载、升级、搜索、清理缓存,再把"换源、备份、看依赖、留历史"这些习惯融入日常,你就能从容应对绝大多数软件管理场景。

下面留几道练习题,建议在虚拟机中动手完成:

  1. 基础操作 :在 CentOS 7 或 Rocky 9 上分别使用 yum/dnf 安装并启动 Nginx,写出完整命令。
    提示:安装后使用 systemctl start nginx 启动,并用 systemctl status nginx 查看状态。
  2. 对比思考 :在 Ubuntu 上分别使用 apt removeapt purge 卸载同一个软件,观察 /etc 下配置文件是否保留。
    提示:卸载前后可对比 /etc/软件名 目录是否存在。
  3. 换源实战 :把一台 CentOS 或 Ubuntu 测试机的默认软件源替换为阿里云镜像源,并验证安装速度是否提升。
    提示:修改前先备份,修改后记得执行 cleanmakecache(或 apt update)。
  4. 故障排查 :模拟一次 apt 锁文件被占用的情况,观察报错信息,并说明正确处理方法。
    提示:可以同时开两个终端执行 apt 操作,观察 Could not get lock 提示,确认不要误删锁文件。
  5. 原理延伸 :用 rpm -qadpkg -l 查询系统中某个软件的包名和版本,再说明该软件在包管理器的视角下包含哪些主要文件。
    提示:Red Hat 系可用 rpm -ql 包名,Debian 系可用 dpkg -L 包名 查看包内文件列表。

把这几道题亲手做一遍,你对 Linux 软件包管理的理解会从"记住命令"上升到"掌握套路",再遇到装不上、升不动、换源慢的问题时,也更有底气快速定位与解决。

相关推荐
GeW1 小时前
拿RHCE证书只是起点:这样备考,顺便把真实运维能力也练了
linux
DevangLic1 小时前
opencode go要完蛋了吗
运维·学习
SEO_juper1 小时前
你的服务器正在被 AI 爬虫“白嫖“带宽:2026 用日志把 Googlebot 和 AI 洪流分开算账(附脚本)
运维·人工智能·爬虫·python·chatgpt·seo
stellanke1 小时前
Linux网络编程实战2:TCP Socket 基础与实践
linux·网络·c++
志栋智能1 小时前
超自动化巡检报告:从数据表格到智能洞察
运维·自动化
芯飞云2 小时前
芯飞云服务器日常使用体验:从配置选型到实际负载的技术分析
运维·服务器
Splashtop高性能远程控制软件2 小时前
AI 辅助端点运维先接手补丁分级、合规可视和同台处置
运维·网络·人工智能·自动化·远程工作·splashtop
TomEval2 小时前
【接口自动化】12 - 接口自动化进阶
运维·自动化
严谨的麻辣烫2 小时前
AI Agent为什么越来越需要固定出口IP?从API白名单到生产环境网络管理
服务器·网络·tcp/ip·代理服务器