Linux系统编程:(四)基础开发工具:Linux 软件包管理器 yum 详解:从原理到实战
目录
前言
在 Linux 系统中,安装软件并不像 Windows 那样简单地双击
.exe文件。一个软件往往会依赖多个库文件、配置文件、服务脚本以及运行环境。如果这些内容都由用户手动处理,不仅效率低,而且很容易出现依赖缺失、版本冲突等问题。为了解决这些问题,Linux 引入了软件包管理机制。在 CentOS、RHEL、Rocky Linux、AlmaLinux 等 rpm 系 Linux 发行版中,常见的软件包管理工具就是 yum。yum 可以帮助我们完成软件的搜索、下载、安装、卸载、升级以及依赖关系处理,是 Linux 学习和服务器运维中非常基础但重要的工具。
一、什么是 Linux 软件包?
在学习 yum 之前,我们需要先搞清楚一个基础概念:Linux 中的软件包到底是什么?
很多初学者刚接触 Linux 时,会习惯性地拿 Windows 来对比。比如在 Windows 系统中,我们安装软件通常会下载一个 .exe 或 .msi 安装程序,然后双击运行,按照安装向导一步步完成安装。
而在 Linux 系统中,软件的安装方式和 Windows 不完全一样。Linux 更强调通过软件包和包管理器来统一管理软件。
所谓软件包,并不是简单的一个可执行文件,而是将软件运行所需的内容提前整理、打包后的结果。它通常包含程序文件、配置文件、依赖信息以及安装卸载时需要执行的脚本等内容。
简单理解:
软件包就是 Linux 系统中用于安装和管理软件的标准化文件集合,相当于 Linux 里的“软件安装包”。
1.1 软件包的定义与作用
一个完整的软件包通常会包含以下几类内容:
已经编译好的二进制程序,用户无需再手动编译源码;
软件运行需要的配置文件;
安装、升级、卸载时需要执行的脚本;
软件版本、架构、描述等基本信息;
软件运行所依赖的其他软件包信息。
也就是说,软件包不仅仅是“程序本体”,它更像是一个经过整理的安装单元。系统可以根据软件包中的信息,把程序文件放到正确的位置,并记录这个软件由谁安装、安装了哪些文件、依赖了哪些组件。
相比手动编译源码安装,使用软件包安装有明显优势:
安装过程更简单
用户不需要关心复杂的编译参数,也不需要手动执行大量安装步骤。安装速度更快
软件包一般已经提前编译完成,安装时只需要解包、复制文件、执行脚本即可。依赖关系更清晰
软件包中会记录它需要哪些依赖,方便包管理器自动处理。便于升级和卸载
系统知道软件安装了哪些文件,因此后续更新或删除时更加规范。软件版本更容易管理
通过软件包管理机制,可以查看软件版本,也可以进行升级、降级或回滚操作。
在 Linux 服务器运维中,如果没有软件包机制,我们安装一个常用工具可能需要手动下载源码、编译、处理依赖、配置路径,非常繁琐。而软件包机制的出现,大大降低了软件管理的复杂度。
1.2 软件包与包管理器的关系
理解了软件包之后,还需要继续理解另一个概念:包管理器。
如果把软件包看作“商品”,那么包管理器就可以看作“应用商店”或者“软件管理平台”。
软件包本身只是一个被打包好的软件文件,而包管理器负责对这些软件包进行统一管理,包括查找、下载、安装、升级、卸载等操作。
在 Linux 系统中,包管理器通常具备以下功能:
搜索软件包:从软件仓库中查找用户需要的软件;
安装软件包:下载软件包并安装到系统中;
处理依赖关系:自动分析并安装软件运行所需的其他组件;
升级软件包:将已安装软件更新到新的版本;
卸载软件包:删除软件及相关文件;
查询软件信息:查看软件版本、安装路径、来源仓库、依赖关系等内容。
例如,我们想安装 nginx,如果手动安装,可能需要自己查找安装包、判断系统版本、下载依赖并逐个安装。
而使用包管理器时,只需要执行类似下面的命令:
yum install -y nginx
包管理器会自动完成后续工作,包括查找 nginx、分析依赖、下载安装包并执行安装。
因此,包管理器的核心价值就在于:
它把复杂的软件安装和维护流程自动化,让用户可以用简单命令完成软件管理。
1.3 Linux 主流包管理器对比
不同 Linux 发行版采用的软件包格式和包管理工具并不完全相同。
目前 Linux 中比较常见的两大软件包体系是:
-
rpm 软件包体系;
-
deb 软件包体系。
其中,CentOS、RHEL、Fedora 等发行版主要使用 .rpm 格式的软件包;Ubuntu、Debian 等发行版主要使用 .deb 格式的软件包。
常见包管理器对比如下:
| 包管理器 | 适用发行版 | 软件包格式 | 常用命令示例 |
|---|---|---|---|
| yum | CentOS、RHEL、Fedora | .rpm | yum install/remove/update |
| apt | Ubuntu、Debian | .deb | apt install/remove/update |
需要注意的是,yum 并不是软件包格式,它是 rpm 软件包体系中的一个高级包管理工具。
在 rpm 系 Linux 中,底层工具是 rpm,它可以直接安装、查询或卸载本地 rpm 包。例如:
rpm -ivh nginx.rpm
但是 rpm 本身处理依赖关系的能力较弱。如果安装某个 rpm 包时缺少依赖,它通常只会提示错误,而不会自动帮我们下载并安装依赖。
而 yum 是基于 rpm 的高级工具,它最大的特点就是可以自动处理依赖关系。例如:
yum install -y nginx
执行这条命令后,yum 会从配置好的软件仓库中查找 nginx,并自动分析它依赖哪些软件包,然后一起下载安装。
所以可以简单总结为:
rpm更偏向于管理本地 rpm 软件包;
yum更适合从软件仓库中自动安装、升级和卸载软件;
yum的优势在于能够自动解决软件依赖问题。
本文后续重点介绍的就是 yum 包管理器。yum 的全称是 Yellowdog Updater, Modified,它基于 rpm 软件包体系,广泛应用于 CentOS、RHEL 等 Linux 发行版中。对于 Linux 初学者和服务器运维人员来说,掌握 yum 是非常重要的一项基础技能。
二、Linux 软件生态深度解析
在第一章中,我们已经了解了软件包和包管理器的基本概念。接下来需要进一步理解:为什么 yum 能够一条命令完成软件安装?为什么它能自动找到依赖?为什么更换国内镜像源后下载速度会变快?
这些问题的答案,都离不开 Linux 背后的软件生态体系。
2.1 软件安装背后的执行流程
在 Linux 系统中,安装软件并不是单纯地“下载一个程序然后运行”。一个软件从获取到最终可用,通常要经历几个关键步骤:
-
找到目标软件包;
-
下载软件包文件;
-
分析软件所需依赖;
-
安装依赖和软件本体;
-
将配置文件、可执行文件、库文件等放到系统指定位置;
-
必要时启动服务或修改系统配置。
如果没有包管理器,这些步骤都需要用户手动完成。比如安装一个 Web 服务,可能不仅要下载它本身,还要额外安装 SSL 库、压缩库、运行时库等组件。只要某个依赖版本不匹配,软件就可能无法启动。
有了 yum 之后,整个流程就变得简单很多。用户只需要告诉系统“我要安装什么软件”,剩下的查找、下载、依赖处理和安装过程,都可以交给 yum 完成。
yum install -y nginx
这条命令看起来很简单,但 yum 背后会完成一系列动作:
-
读取本机的软件源配置;
-
连接对应的软件仓库;
-
查询目标软件是否存在;
-
分析目标软件需要哪些依赖;
-
下载软件包和依赖包;
-
调用 rpm 完成安装;
-
记录本次操作历史。
可以把 yum 理解为服务器上的“软件采购员”。它知道去哪里找软件,也知道这个软件还需要哪些配套组件。

从图中可以看出,本机服务器上的 yum 并不直接保存所有软件包,而是通过软件源配置找到远程软件包服务器。用户发起安装请求后,yum 会向软件包服务器查询并下载对应内容,最终完成软件安装。
2.2 yum仓库与依赖解析机制
yum 能够查找和安装软件,核心依赖的是软件仓库。软件仓库可以理解为集中存放软件包的服务器。它里面不仅有大量 rpm 软件包,还有 yum 能识别的元数据信息。
这些元数据非常重要,它会告诉 yum:
-
仓库中有哪些软件包;
-
软件包对应的版本号是多少;
-
软件包适用于什么系统架构;
-
软件包之间存在什么依赖关系;
-
下载地址和校验信息是什么。
也就是说,yum 并不是盲目下载软件,而是先根据仓库元数据计算出一套完整的安装方案。
例如我们安装 nginx 时,yum 可能会发现 nginx 还需要依赖某些库文件。于是 yum 会把 nginx 本体和相关依赖一起列入安装列表。

软件依赖关系在 Linux 中非常常见。一个程序可能依赖 libc.so、ssl.so、libhttp.so 等库文件,而这些库文件本身又可能继续依赖其他组件。依赖关系一旦变复杂,手动处理就会非常麻烦。
yum 的优势就在这里:它可以根据仓库提供的依赖信息,自动判断应该安装哪些包,避免用户一个个手动查找。
常见的软件仓库类型包括:
| 仓库类型 | 说明 |
|---|---|
| 官方基础仓库 | 系统默认提供,稳定性较高 |
| 扩展仓库 | 提供更多额外软件,例如 EPEL |
| 第三方仓库 | 由软件厂商或社区维护,例如 Docker、Nginx 官方源 |
| 本地仓库 | 企业内网或离线环境中常用 |
| 镜像仓库 | 对官方仓库进行同步,加快下载速度 |
在 CentOS 系统中,yum 的仓库配置文件通常位于:
/etc/yum.repos.d/
查看该目录:
ls /etc/yum.repos.d/
常见的 repo 文件如下:
CentOS-Base.repo
epel.repo
docker-ce.repo
nginx.repo
一个 repo 文件中可以配置一个或多个仓库。典型格式如下:
[base]
name=CentOS Base Repository
baseurl=http://mirrors.aliyun.com/centos/$releasever/os/$basearch/
enabled=1
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
其中几个常见字段含义如下:
| 字段 | 含义 |
|---|---|
[base] | 仓库 ID,要求唯一 |
name | 仓库描述信息 |
baseurl | 仓库地址 |
enabled | 是否启用,1 表示启用,0 表示禁用 |
gpgcheck | 是否校验软件包签名 |
gpgkey | GPG 公钥地址 |
2.3 国内镜像源的原理与配置
很多 Linux 发行版默认使用国外软件源。如果服务器部署在国内,访问国外源时可能会遇到下载慢、连接超时、仓库访问失败等问题。
为了解决这个问题,国内很多高校和云厂商会同步官方软件仓库,形成国内镜像源。常见的国内镜像站包括:
国内镜像源的本质是对官方仓库的同步。官方源发布软件包后,镜像站会定期同步这些内容。用户将系统软件源改成国内镜像后,yum 就会从国内服务器下载软件包。


从图中可以看到,开发者完成软件开发后,会将源码编译成适合不同 Linux 发行版的软件包。官方软件仓库负责发布和维护这些软件包,而国内镜像源会同步官方仓库中的内容。我们的服务器只需要修改 yum 源配置,就可以从国内镜像站获取软件包。
2.3.1 CentOS 更换 yum 源
在 CentOS 中,更换 yum 源之前建议先备份原有配置。
cd /etc/yum.repos.d/
mkdir backup
mv *.repo backup/
以 CentOS 7 使用阿里云镜像源为例,可以下载新的 repo 文件:
wget -O /etc/yum.repos.d/CentOS-Base.repo \
http://mirrors.aliyun.com/repo/Centos-7.repo
如果系统中没有 wget,可以先安装:
yum install -y wget
更换完成后,需要清理旧缓存并重新生成缓存:
yum clean all
yum makecache
最后查看仓库是否正常:
yum repolist
如果能够正常显示仓库列表,说明 yum 源已经配置成功。
2.3.2 Ubuntu 更换 apt 源
虽然本文重点讲 yum,但在理解 Linux 软件生态时,也可以顺带了解一下 Ubuntu 中的 apt 源配置方式。
Ubuntu 的软件源配置文件通常是:
/etc/apt/sources.list
备份原文件:
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
编辑源文件:
sudo vim /etc/apt/sources.list
修改完成后更新索引:
sudo apt update
yum 和 apt 虽然属于不同的软件包体系,但它们的基本思想类似:都是通过软件源管理软件包,并自动处理依赖关系。
2.4 Linux 软件生态的整体理解
Linux 软件生态并不是只有 yum 或 apt 这些命令工具,它背后还包含开发者、软件仓库、系统维护者、镜像站、官方文档、社区论坛等多个部分。

一个成熟的软件生态,通常具备以下特点:
-
软件来源稳定:官方仓库和可信镜像源可以提供较可靠的软件包;
-
依赖关系清晰:包管理器可以根据元数据自动处理依赖;
-
更新维护及时:系统维护者会持续发布安全更新和补丁;
-
文档资源完善:官方文档和社区资料可以帮助用户排查问题;
-
用户群体活跃:遇到问题时更容易找到解决方案;
-
安装方式统一:通过统一命令管理软件,降低学习和维护成本。
对于服务器运维来说,软件生态的成熟度非常重要。一个稳定的软件包体系可以减少安装过程中的不确定性,也能让系统升级、漏洞修复和软件维护更加规范。
yum 的价值也正体现在这里。它不是单纯的安装命令,而是连接用户、系统、软件仓库和软件维护者的工具。用户通过 yum 安装软件,系统通过仓库获取软件包,维护者通过仓库发布更新,整个过程形成了一套完整的软件分发机制。
所以在学习 yum 时,不应该只记住几个命令,还要理解它背后的软件仓库、依赖关系和镜像机制。只有理解了这些内容,后续在遇到 yum 源不可用、依赖冲突、软件包找不到等问题时,才能更快定位原因。
三、yum 常用操作实战
前面已经介绍了 yum 的基本概念、软件源以及软件仓库的工作机制。理解原理之后,接下来就要进入实际操作部分。
在日常 Linux 运维和开发环境搭建中,yum 最常用的功能主要包括:软件查询、软件安装、软件升级、软件卸载、缓存管理、软件源管理以及常见问题排查。本章将围绕这些常见场景进行整理。
3.1 使用 yum 前的基础检查
在正式使用 yum 安装软件之前,建议先确认系统环境是否满足基本条件,否则后续执行 yum 命令时可能会出现连接失败、仓库不可用或权限不足等问题。
通常需要关注以下几点:
-
网络是否正常
yum 默认需要从远程软件仓库下载软件包,因此服务器需要能够正常访问外网或内网 yum 源。 -
是否具有管理员权限
安装、卸载、升级软件通常需要 root 权限,普通用户执行时需要配合sudo使用。 -
yum 源是否配置正确
yum 能否找到软件包,取决于/etc/yum.repos.d/下的软件源配置是否正常。 -
软件仓库是否可用
可以通过yum repolist查看当前系统能够识别到哪些仓库。
例如,可以先测试网络连通性:
ping www.baidu.com -c 3
如果服务器能正常返回数据包,说明网络基本可用。
也可以测试软件仓库是否可读取:
yum repolist
如果能够看到 base、extras、updates、epel 等仓库信息,说明 yum 源基本正常。
3.2 软件包查询相关操作
在安装软件之前,我们经常需要先确认软件包是否存在、软件包版本是多少、是否已经安装,以及它依赖哪些其他软件包。yum 提供了多种查询命令,可以帮助我们快速获取这些信息。
3.2.1 查看仓库中可用的软件包
查看当前 yum 仓库中可以安装的软件包:
yum list
这个命令会列出当前软件源中可用的软件包,输出内容通常很多,因此实际使用时一般会结合 grep 进行筛选。
例如想查找 lrzsz 软件包:
yum list | grep lrzsz
可能会看到类似结果:
lrzsz.x86_64 0.12.20-36.el7 base
这行信息可以拆开理解:
-
lrzsz.x86_64:软件包名称和系统架构; -
0.12.20-36.el7:软件包版本; -
base:软件源名称,该软件包来自 base 仓库。
3.2.2 查看软件包详细信息
如果想了解一个软件包的详细信息,可以使用 yum info。
语法如下:
yum info 软件包名称
例如查看 lrzsz 的信息:
yum info lrzsz
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
Available Packages
Name : lrzsz
Arch : x86_64
Version : 0.12.20
Release : 36.el7
Size : 78 k
Repo : base/7/x86_64
Summary : The lrz and lsz modem communications programs
URL : http://www.ohse.de/uwe/software/lrzsz.html
License : GPLv2+
Description : Lrzsz (consisting of lrz and lsz) is a cosmetically modified
: zmodem/ymodem/xmodem package built from the public-domain version
: of the rzsz package. Lrzsz was created to provide a working
: GNU copylefted Zmodem solution for Linux systems.
输出内容中通常会包含:
-
Name:软件包名称; -
Arch:系统架构; -
Version:软件版本; -
Release:发行版本; -
Size:软件包大小; -
Repo:软件来源仓库; -
Summary:软件简要说明; -
Description:软件详细描述。
这个命令适合在安装软件之前使用,可以帮助我们确认软件包是否是自己想要安装的内容。
3.2.3 查询系统中已经安装的软件包
查看当前系统中已经安装的软件包,可以使用:
yum list installed
由于输出结果也比较多,通常会配合 grep 过滤。
例如查看系统中是否已经安装 gcc:
yum list installed | grep gcc
如果已经安装,可能会看到类似结果:
gcc.x86_64 4.8.5-44.el7 @base
gcc-c++.x86_64 4.8.5-44.el7 @base
如果没有任何输出,一般说明当前系统中没有安装对应软件包。
除了 yum,也可以使用 rpm 查询:
rpm -qa | grep gcc
3.2.4 查看软件包依赖关系
yum 的一个重要能力就是自动处理依赖关系。如果我们想提前查看某个软件包依赖哪些组件,可以使用:
yum deplist 软件包名称
例如查看 nginx 的依赖关系:
yum deplist nginx
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
Finding dependencies:
package: nginx.x86_64 1:1.20.1-9.el7
dependency: libpcre.so.1()(64bit)
provider: pcre.x86_64 8.32-17.el7
dependency: libcrypto.so.10()(64bit)
provider: openssl-libs.x86_64 1:1.0.2k-25.el7_9
dependency: libz.so.1()(64bit)
provider: zlib.x86_64 1.2.7-21.el7_9
dependency: systemd-units
provider: systemd.x86_64 219-78.el7_9.5
输出结果中会显示 nginx 运行或安装过程中需要依赖的其他软件包,例如某些库文件、系统组件等。
依赖关系对于排查安装失败非常有帮助。例如当 yum 提示依赖冲突、缺少某个库或版本不匹配时,就可以通过依赖查询命令辅助分析。
3.3 软件安装操作
yum 最常用的功能就是安装软件包。相比手动下载 rpm 包再安装,yum 可以自动从软件仓库中查找软件包,并自动处理依赖。
3.3.1 安装单个软件包
基本语法如下:
sudo yum install 软件包名称
例如安装 lrzsz:
sudo yum install lrzsz
执行命令后,yum 会先解析依赖关系,然后列出即将安装的软件包信息,并询问是否继续安装。
如果确认安装,输入 y 即可。
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
Resolving Dependencies
--> Running transaction check
---> Package lrzsz.x86_64 0:0.12.20-36.el7 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
================================================================================
Package Arch Version Repository Size
================================================================================
Installing:
lrzsz x86_64 0.12.20-36.el7 base 78 k
Transaction Summary
================================================================================
Install 1 Package
Total download size: 78 k
Installed size: 187 k
Is this ok [y/d/N]: y # 输入y确认安装
Downloading packages:
lrzsz-0.12.20-36.el7.x86_64.rpm | 78 kB 00:00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Installing : lrzsz-0.12.20-36.el7.x86_64 1/1
Verifying : lrzsz-0.12.20-36.el7.x86_64 1/1
Installed:
lrzsz.x86_64 0:0.12.20-36.el7
Complete! # 安装完成
3.3.2 安装时自动确认
在实际服务器操作中,如果已经确认要安装某个软件,可以加上 -y 参数,让 yum 自动确认。
例如安装 gcc:
sudo yum install -y gcc
其中:
-
install表示安装软件; -
-y表示自动回答 yes; -
gcc是要安装的软件包名称。
这种方式适合脚本化部署或批量安装场景,但在生产环境中仍然建议先确认软件来源和依赖影响。
3.3.3 一次安装多个软件包
yum 支持一次安装多个软件包,只需要在命令后面依次写出软件包名称即可。
例如安装 C/C++ 编译环境和 make 工具:
sudo yum install -y gcc gcc-c++ make
输出:
Installed:
gcc.x86_64 0:4.8.5-44.el7 gcc-c++.x86_64 0:4.8.5-44.el7 make.x86_64 1:3.82-24.el7
Dependency Installed:
cpp.x86_64 0:4.8.5-44.el7 glibc-devel.x86_64 0:2.17-326.el7_9
glibc-headers.x86_64 0:2.17-326.el7_9 kernel-headers.x86_64 0:3.10.0-1160.83.1.el7
libmpc.x86_64 0:1.0.1-3.el7 mpfr.x86_64 0:3.1.1-4.el7
Complete!
安装完成后,可以使用下面命令验证:
gcc --version
g++ --version
make --version
如果都能正常输出版本信息,说明相关开发工具已经安装成功。
3.3.4 安装扩展仓库中的软件
有些软件在系统默认仓库中并不存在,这时可能需要启用额外的软件源。CentOS 中比较常用的扩展仓库是 EPEL。
EPEL 的全称是 Extra Packages for Enterprise Linux,它为 RHEL、CentOS 等系统提供了大量额外软件包。
安装 EPEL 仓库:
sudo yum install -y epel-release
安装完成后,可以查看仓库列表:
yum repolist
如果仓库列表中出现 epel,说明扩展仓库已经启用。
之后就可以安装一些默认仓库中没有的软件,例如:
sudo yum install -y nginx
需要注意的是,扩展仓库虽然能提供更多软件,但生产环境中仍然应该谨慎使用,避免不同仓库之间的软件版本发生冲突。
3.4 软件升级操作
yum 也可以用于升级软件包。升级操作会根据当前软件源中的版本信息,将已安装软件更新到较新的版本。
3.4.1 升级指定软件包
升级某一个指定软件包:
sudo yum update -y 软件包名称
例如升级 nginx:
sudo yum update -y nginx
执行后,yum 会检查当前系统中 nginx 的版本,并和软件仓库中的版本进行对比。如果仓库中存在更新版本,就会下载并安装。
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* epel: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
Resolving Dependencies
--> Running transaction check
---> Package nginx.x86_64 1:1.20.1-9.el7 will be updated
---> Package nginx.x86_64 1:1.20.1-10.el7 will be an update
--> Finished Dependency Resolution
Dependencies Resolved
================================================================================
Package Arch Version Repository Size
================================================================================
Updating:
nginx x86_64 1:1.20.1-10.el7 epel 570 k
Transaction Summary
================================================================================
Upgrade 1 Package
Total download size: 570 k
Downloading packages:
nginx-1.20.1-10.el7.x86_64.rpm | 570 kB 00:00:01
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Updating : 1:nginx-1.20.1-10.el7.x86_64 1/2
Cleanup : 1:nginx-1.20.1-9.el7.x86_64 2/2
Verifying : 1:nginx-1.20.1-10.el7.x86_64 1/2
Verifying : 1:nginx-1.20.1-9.el7.x86_64 2/2
Updated:
nginx.x86_64 1:1.20.1-10.el7
Complete!
3.4.2 升级系统中的所有软件包
如果不指定软件包名称,直接执行:
sudo yum update -y
yum 会尝试升级系统中所有可更新的软件包。
这个命令需要谨慎使用,尤其是在生产服务器中。因为它可能升级内核、系统库、服务程序等重要组件,进而影响业务服务的稳定性。
更推荐的做法是:
-
先在测试环境执行更新;
-
确认业务服务兼容;
-
再在生产环境分批更新;
-
更新前做好快照或备份。
3.4.3 查看有哪些软件可以更新
如果只是想查看当前系统中有哪些软件包可以升级,而不立即执行更新,可以使用:
yum check-update
该命令会列出可更新的软件包名称、版本和来源仓库。
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* epel: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
nginx.x86_64 1:1.20.1-10.el7 epel
openssl.x86_64 1:1.0.2k-25.el7_9 updates
openssl-libs.x86_64 1:1.0.2k-25.el7_9 updates
systemd.x86_64 219-78.el7_9.5 updates
通过这个命令,我们可以在真正升级前先了解更新范围。
3.5 软件卸载操作
当某个软件不再需要时,可以通过 yum 将其卸载。yum 卸载软件时,会删除软件包本身,并根据情况处理相关依赖。
3.5.1 卸载指定软件包
基本语法如下:
sudo yum remove -y 软件包名称
例如卸载 lrzsz:
sudo yum remove -y lrzsz
执行后,yum 会列出将被删除的软件包信息,并完成卸载。
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
Resolving Dependencies
--> Running transaction check
---> Package lrzsz.x86_64 0:0.12.20-36.el7 will be erased
--> Finished Dependency Resolution
Dependencies Resolved
================================================================================
Package Arch Version Repository Size
================================================================================
Removing:
lrzsz x86_64 0.12.20-36.el7 @base 187 k
Transaction Summary
================================================================================
Remove 1 Package
Installed size: 187 k
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Erasing : lrzsz-0.12.20-36.el7.x86_64 1/1
Verifying : lrzsz-0.12.20-36.el7.x86_64 1/1
Removed:
lrzsz.x86_64 0:0.12.20-36.el7
Complete!
3.5.2 清理不再使用的依赖包
有时候,卸载软件后,一些当初作为依赖安装的软件包可能已经不再被其他程序使用。可以使用下面命令尝试清理:
sudo yum autoremove -y
或者指定软件包:
sudo yum autoremove -y 软件包名称
需要注意的是,自动清理依赖时要仔细查看 yum 给出的删除列表,避免误删仍然需要的软件包。
3.6 yum 缓存管理
yum 在查询、安装、升级软件时,会缓存仓库元数据和部分软件包信息。缓存可以提高 yum 的执行速度,但如果软件源发生变化,或者缓存数据异常,就可能导致软件包找不到、版本信息不一致等问题。
3.6.1 清理 yum 缓存
清理所有缓存:
sudo yum clean all
只清理已下载的软件包缓存:
sudo yum clean packages
只清理仓库元数据缓存:
sudo yum clean metadata
常见情况下,使用 yum clean all 就可以清理大部分缓存问题。
3.6.2 重新生成 yum 缓存
清理缓存后,可以重新生成缓存:
sudo yum makecache
更换 yum 源后,常用下面这一组命令:
sudo yum clean all
sudo yum makecache
yum repolist
如果 yum repolist 能够正常显示仓库信息,说明软件源基本可用。
3.7 软件源与仓库管理
yum 的很多问题都和软件源有关。熟悉软件源管理命令,可以帮助我们快速判断仓库是否启用、某个仓库是否可用,以及如何添加第三方软件源。
3.7.1 查看当前系统的软件仓库
查看所有仓库,包括启用和禁用的仓库:
yum repolist all
输出结果中通常会包含:
-
仓库 ID;
-
仓库名称;
-
仓库状态;
-
软件包数量。
例如:
repo id repo name status
base/7/x86_64 CentOS-7 - Base enabled
epel/x86_64 Extra Packages for Enterprise Linux enabled
extras/7/x86_64 CentOS-7 - Extras enabled
updates/7/x86_64 CentOS-7 - Updates enabled
3.7.2 启用或禁用某个软件源
如果系统中安装了 yum-utils,可以使用 yum-config-manager 管理仓库状态。
安装 yum-utils:
sudo yum install -y yum-utils
禁用某个仓库,例如禁用 epel:
sudo yum-config-manager --disable epel
启用某个仓库:
sudo yum-config-manager --enable epel
查看 epel 当前状态:
yum repolist all | grep epel
如果状态显示为 disabled,说明仓库已被禁用;如果显示为 enabled,说明仓库正在启用。
3.7.3 添加第三方软件源
有些软件并不在系统默认仓库或 EPEL 中,而是由软件官方提供独立 yum 源。例如 nginx 官方就提供了自己的 yum 仓库。
可以新建 nginx 的 repo 文件:
sudo vi /etc/yum.repos.d/nginx.repo
写入如下内容:
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
保存后,查看 nginx 仓库是否生效:
yum repolist | grep nginx
如果能看到 nginx-stable,说明第三方仓库添加成功。
需要提醒的是,第三方软件源要选择可信来源。生产环境中不要随意添加未知 repo,否则可能造成软件版本混乱或安全风险。
3.8 yum 常见问题与处理思路
在使用 yum 的过程中,经常会遇到一些报错。下面整理几个比较典型的问题和处理方式。
3.8.1 yum 被锁定
常见错误信息:
Another app is currently holding the yum lock
这个问题通常表示当前系统中已经有另一个 yum 进程在运行,或者上一次 yum 操作异常中断,导致锁文件没有释放。
可以先查看 yum 相关进程:
ps aux | grep yum
如果确认某个 yum 进程异常卡住,可以结束它:
sudo kill -9 PID
其中 PID 替换为实际进程号。
如果确认没有 yum 进程仍在运行,但锁文件仍然存在,可以删除锁文件:
sudo rm -f /var/run/yum.pid
然后重新执行 yum 命令。
3.8.2 yum 找不到指定软件包
常见情况:
No package nginx available.
可能原因包括:
-
软件包名称写错;
-
当前 yum 源没有这个软件包;
-
对应仓库没有启用;
-
缓存数据过期;
-
系统版本与软件仓库不匹配。
排查思路如下:
先确认软件包名称:
yum search nginx
查看当前仓库:
yum repolist
如果软件在 EPEL 中,可以先安装 EPEL:
sudo yum install -y epel-release
然后清理并重建缓存:
sudo yum clean all
sudo yum makecache
再次尝试安装:
sudo yum install -y nginx
3.8.3 yum 安装时出现依赖冲突
依赖冲突通常出现在多个仓库同时启用、软件版本不兼容,或者系统中已经安装了不匹配版本的软件包时。
处理这类问题时,不建议直接强制安装。可以按照以下思路排查:
-
查看报错中提示的具体依赖包名称;
-
使用
yum deplist 软件包名查看依赖关系; -
检查是否启用了多个可能冲突的软件源;
-
尝试禁用不必要的第三方仓库;
-
使用兼容当前系统版本的软件包。
在某些场景下,也可以临时跳过无法解决的依赖:
sudo yum install --skip-broken 软件包名称
但是这个方法并不适合所有情况,因为被跳过的软件包可能正是程序运行所必需的组件。因此,生产环境中更推荐从软件源和版本兼容性角度解决问题。
小结
本章主要围绕 yum 的常用操作进行了整理,包括:
-
使用 yum 前的网络、权限和软件源检查;
-
软件包查询命令,例如
yum list、yum info、yum deplist; -
软件安装命令,例如
yum install和批量安装; -
软件升级命令,例如
yum update和yum check-update; -
软件卸载命令,例如
yum remove和yum autoremove; -
缓存管理命令,例如
yum clean all和yum makecache; -
软件源管理命令,例如
yum repolist all、yum-config-manager; -
常见问题排查,例如 yum 锁定、软件包找不到、依赖冲突等。
掌握这些操作之后,基本可以应对日常 Linux 环境中大部分软件管理场景。
四、yum 的高级使用场景
前面几章主要介绍了 yum 的基本概念、软件源机制以及常见安装、查询、升级、卸载操作。除了这些基础用法之外,yum 还有一些比较实用的进阶功能,例如查看历史操作、撤销误操作,以及在无网络环境中提前准备离线安装包。
这些功能在真实服务器维护中非常常见,尤其适合处理误删软件、内网服务器部署、离线环境安装等场景。
4.1 yum 操作记录与回退
yum 在执行安装、升级、卸载等操作时,会自动记录每一次事务。这里的“事务”可以理解为一次完整的软件包操作过程。
例如执行一次安装命令,yum 不仅会记录你安装了哪个软件,还会记录当时自动安装了哪些依赖包。后续如果需要排查问题,或者想撤销某次误操作,就可以借助 yum 的历史记录功能。
4.1.1 查看 yum 历史操作
查看 yum 历史记录可以使用:
yum history
执行后,系统会显示最近的 yum 操作记录,通常包含以下信息:
-
操作 ID;
-
执行的命令;
-
操作时间;
-
操作类型;
-
本次操作影响的软件包数量。
示例输出可能类似:
Loaded plugins: fastestmirror
ID | Command line | Date and time | Action(s) | Altered
---------------------------------------------------------------------------
10 | install -y nginx | 2024-10-26 14:30 | Install | 15
9 | remove -y lrzsz | 2024-10-26 14:25 | Erase | 1
8 | install -y lrzsz | 2024-10-26 14:20 | Install | 1
7 | install -y epel-release | 2024-10-26 14:15 | Install | 1
其中比较重要的是第一列 ID,后续查看详情或回滚操作时,都需要用到这个事务 ID。
如果想查看某一次操作的详细信息,可以执行:
yum history info 事务ID
例如:
yum history info 9
这个命令可以看到该次操作具体影响了哪些软件包,适合在回滚前进行确认。
4.1.2 撤销指定历史操作
如果某次 yum 操作执行错误,比如误卸载了某个软件,可以尝试使用 yum history undo 进行撤销。
基本语法如下:
sudo yum history undo 事务ID
例如,假设历史记录中 ID 为 9 的操作是卸载 lrzsz,现在想撤销这次卸载操作,可以执行:
sudo yum history undo 9 -y
这条命令的含义是:让 yum 根据历史记录,尽量恢复 ID 为 9 的操作之前的状态。
需要注意的是,yum 回滚并不是所有情况下都一定成功。它依赖当前系统的软件源和软件包状态。如果仓库中的软件版本发生变化,或者相关依赖已经不存在,回滚时可能会失败。
因此,yum history undo 更适合用于小范围误操作恢复。对于生产服务器中的重要变更,仍然建议提前做好系统快照或备份。
4.2 无网络环境中的 yum 安装方案
在实际工作中,并不是所有服务器都能直接访问外网。比如一些内网服务器、生产隔离环境、安全区服务器,可能无法直接执行:
yum install 软件包名
这时可以采用一种常见思路:先在有网络的机器上下载软件包及依赖,再复制到无网络服务器中进行安装。
4.2.1 在有网络的机器上准备安装包
首先创建一个目录,用来保存下载好的 rpm 包:
mkdir -p /tmp/yum-packages
然后使用 yum 只下载软件包和依赖,但不进行安装:
yum install -y --downloadonly --downloaddir=/tmp/yum-packages lrzsz
这条命令中几个参数的含义如下:
-
--downloadonly:只下载软件包,不执行安装; -
--downloaddir:指定 rpm 包保存目录; -
lrzsz:需要下载的软件包名称。
执行完成后,可以查看目录中的文件:
ls /tmp/yum-packages
正常情况下,该目录中会保存 lrzsz 以及它所需的相关依赖 rpm 包。
如果系统提示不支持 --downloadonly 参数,可以先安装相关插件或工具:
yum install -y yum-plugin-downloadonly yum-utils
不同系统版本可能略有差异,实际使用时根据报错信息调整即可。
4.2.2 在离线服务器中安装 rpm 包
将 /tmp/yum-packages 目录打包并复制到无网络服务器后,进入该目录:
cd /tmp/yum-packages
如果目录中已经包含软件本体和所有依赖包,可以直接使用 rpm 安装:
sudo rpm -ivh *.rpm
其中:
-
-i表示安装; -
-v表示显示详细过程; -
-h表示以进度条形式显示安装进度; -
*.rpm表示安装当前目录下所有 rpm 包。
如果离线机器上仍然配置了可用的本地 yum 源,也可以使用:
sudo yum localinstall -y *.rpm
相比直接使用 rpm -ivh,yum localinstall 在处理依赖关系时更加友好。不过在完全无网络、没有本地仓库的情况下,前提仍然是当前目录中已经准备好了完整依赖包。
离线安装时常见的问题是依赖没有下载完整。如果安装过程中提示缺少某个依赖,需要回到有网络的机器上继续下载对应 rpm 包,然后再次复制到离线环境中安装。
总结
yum 不只是一个简单的软件安装命令,它还提供了历史记录、操作回滚、离线安装等实用能力。
在日常使用中,基础命令可以帮助我们完成软件安装、卸载、升级和查询;而进阶用法则能在误操作恢复、内网环境部署、离线服务器安装等场景中发挥作用。
学习 yum 时,建议重点掌握以下内容:
使用
yum history查看历史操作;使用
yum history info分析某次操作详情;使用
yum history undo尝试撤销误操作;使用
--downloadonly提前下载软件包和依赖;使用
rpm -ivh或yum localinstall完成离线安装;生产环境变更前,优先做好备份或快照。
掌握这些内容后,我们在 Linux 系统中管理软件会更加稳妥。无论是安装开发工具、部署服务程序,还是维护服务器环境,yum 都是一个非常值得熟练掌握的基础工具。
更多推荐




所有评论(0)