目录

前言

一、什么是 Linux 软件包?

1.1 软件包的定义与作用

1.2 软件包与包管理器的关系

1.3 Linux 主流包管理器对比

二、Linux 软件生态深度解析

2.1 软件安装背后的执行流程

2.2 yum仓库与依赖解析机制

2.3 国内镜像源的原理与配置

2.3.1 CentOS 更换 yum 源

2.3.2 Ubuntu 更换 apt 源

2.4 Linux 软件生态的整体理解        

三、yum 常用操作实战

3.1 使用 yum 前的基础检查

3.2 软件包查询相关操作

3.2.1 查看仓库中可用的软件包

3.2.2 查看软件包详细信息

3.2.3 查询系统中已经安装的软件包

3.2.4 查看软件包依赖关系

3.3 软件安装操作

3.3.1 安装单个软件包

3.3.2 安装时自动确认

3.3.3 一次安装多个软件包

3.3.4 安装扩展仓库中的软件

3.4 软件升级操作

3.4.1 升级指定软件包

3.4.2 升级系统中的所有软件包

3.4.3 查看有哪些软件可以更新

3.5 软件卸载操作

3.5.1 卸载指定软件包

3.5.2 清理不再使用的依赖包

3.6 yum 缓存管理

3.6.1 清理 yum 缓存

3.6.2 重新生成 yum 缓存

3.7 软件源与仓库管理

3.7.1 查看当前系统的软件仓库

3.7.2 启用或禁用某个软件源

3.7.3 添加第三方软件源

3.8 yum 常见问题与处理思路

3.8.1 yum 被锁定

3.8.2 yum 找不到指定软件包

3.8.3 yum 安装时出现依赖冲突

小结

四、yum 的高级使用场景

4.1 yum 操作记录与回退

4.1.1 查看 yum 历史操作

4.1.2 撤销指定历史操作

4.2 无网络环境中的 yum 安装方案

4.2.1 在有网络的机器上准备安装包

4.2.2 在离线服务器中安装 rpm 包

总结


前言

        在 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 软件包的定义与作用

一个完整的软件包通常会包含以下几类内容:

  • 已经编译好的二进制程序,用户无需再手动编译源码;

  • 软件运行需要的配置文件;

  • 安装、升级、卸载时需要执行的脚本;

  • 软件版本、架构、描述等基本信息;

  • 软件运行所依赖的其他软件包信息。

        也就是说,软件包不仅仅是“程序本体”,它更像是一个经过整理的安装单元。系统可以根据软件包中的信息,把程序文件放到正确的位置,并记录这个软件由谁安装、安装了哪些文件、依赖了哪些组件。

相比手动编译源码安装,使用软件包安装有明显优势:

  1. 安装过程更简单
    用户不需要关心复杂的编译参数,也不需要手动执行大量安装步骤。

  2. 安装速度更快
    软件包一般已经提前编译完成,安装时只需要解包、复制文件、执行脚本即可。

  3. 依赖关系更清晰
    软件包中会记录它需要哪些依赖,方便包管理器自动处理。

  4. 便于升级和卸载
    系统知道软件安装了哪些文件,因此后续更新或删除时更加规范。

  5. 软件版本更容易管理
    通过软件包管理机制,可以查看软件版本,也可以进行升级、降级或回滚操作。

        在 Linux 服务器运维中,如果没有软件包机制,我们安装一个常用工具可能需要手动下载源码、编译、处理依赖、配置路径,非常繁琐。而软件包机制的出现,大大降低了软件管理的复杂度。


1.2 软件包与包管理器的关系

理解了软件包之后,还需要继续理解另一个概念:包管理器

        如果把软件包看作“商品”,那么包管理器就可以看作“应用商店”或者“软件管理平台”。

        软件包本身只是一个被打包好的软件文件,而包管理器负责对这些软件包进行统一管理,包括查找、下载、安装、升级、卸载等操作。

在 Linux 系统中,包管理器通常具备以下功能:

  • 搜索软件包:从软件仓库中查找用户需要的软件;

  • 安装软件包:下载软件包并安装到系统中;

  • 处理依赖关系:自动分析并安装软件运行所需的其他组件;

  • 升级软件包:将已安装软件更新到新的版本;

  • 卸载软件包:删除软件及相关文件;

  • 查询软件信息:查看软件版本、安装路径、来源仓库、依赖关系等内容。

例如,我们想安装 nginx,如果手动安装,可能需要自己查找安装包、判断系统版本、下载依赖并逐个安装。

而使用包管理器时,只需要执行类似下面的命令:

yum install -y nginx

包管理器会自动完成后续工作,包括查找 nginx、分析依赖、下载安装包并执行安装。

因此,包管理器的核心价值就在于:

它把复杂的软件安装和维护流程自动化,让用户可以用简单命令完成软件管理。


1.3 Linux 主流包管理器对比

不同 Linux 发行版采用的软件包格式和包管理工具并不完全相同。

目前 Linux 中比较常见的两大软件包体系是:

  • rpm 软件包体系;

  • deb 软件包体系。

其中,CentOS、RHEL、Fedora 等发行版主要使用 .rpm 格式的软件包;Ubuntu、Debian 等发行版主要使用 .deb 格式的软件包。

常见包管理器对比如下:

包管理器适用发行版软件包格式常用命令示例
yumCentOS、RHEL、Fedora.rpmyum install/remove/update
aptUbuntu、Debian.debapt 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 系统中,安装软件并不是单纯地“下载一个程序然后运行”。一个软件从获取到最终可用,通常要经历几个关键步骤:

  1. 找到目标软件包;

  2. 下载软件包文件;

  3. 分析软件所需依赖;

  4. 安装依赖和软件本体;

  5. 将配置文件、可执行文件、库文件等放到系统指定位置;

  6. 必要时启动服务或修改系统配置。

        如果没有包管理器,这些步骤都需要用户手动完成。比如安装一个 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.sossl.solibhttp.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是否校验软件包签名
gpgkeyGPG 公钥地址

2.3 国内镜像源的原理与配置

        很多 Linux 发行版默认使用国外软件源。如果服务器部署在国内,访问国外源时可能会遇到下载慢、连接超时、仓库访问失败等问题。

        为了解决这个问题,国内很多高校和云厂商会同步官方软件仓库,形成国内镜像源。常见的国内镜像站包括:

镜像源地址
阿里云镜像源阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区https://developer.aliyun.com/mirror/
清华大学镜像源清华大学开源软件镜像站 | Tsinghua Open Source Mirrorhttps://mirrors.tuna.tsinghua.edu.cn/
华为云镜像源华为开源镜像站_软件开发服务_华为云https://mirrors.huaweicloud.com/home
腾讯云镜像源腾讯软件源https://mirrors.tencent.com/
网易镜像源欢迎访问网易开源镜像站https://mirrors.163.com/

        国内镜像源的本质是对官方仓库的同步。官方源发布软件包后,镜像站会定期同步这些内容。用户将系统软件源改成国内镜像后,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 命令时可能会出现连接失败、仓库不可用或权限不足等问题。

通常需要关注以下几点:

  1. 网络是否正常
    yum 默认需要从远程软件仓库下载软件包,因此服务器需要能够正常访问外网或内网 yum 源。

  2. 是否具有管理员权限
    安装、卸载、升级软件通常需要 root 权限,普通用户执行时需要配合 sudo 使用。

  3. yum 源是否配置正确
    yum 能否找到软件包,取决于 /etc/yum.repos.d/ 下的软件源配置是否正常。

  4. 软件仓库是否可用
    可以通过 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 会尝试升级系统中所有可更新的软件包。

        这个命令需要谨慎使用,尤其是在生产服务器中。因为它可能升级内核、系统库、服务程序等重要组件,进而影响业务服务的稳定性。

更推荐的做法是:

  1. 先在测试环境执行更新;

  2. 确认业务服务兼容;

  3. 再在生产环境分批更新;

  4. 更新前做好快照或备份。

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 安装时出现依赖冲突

        依赖冲突通常出现在多个仓库同时启用、软件版本不兼容,或者系统中已经安装了不匹配版本的软件包时。

处理这类问题时,不建议直接强制安装。可以按照以下思路排查:

  1. 查看报错中提示的具体依赖包名称;

  2. 使用 yum deplist 软件包名 查看依赖关系;

  3. 检查是否启用了多个可能冲突的软件源;

  4. 尝试禁用不必要的第三方仓库;

  5. 使用兼容当前系统版本的软件包。

在某些场景下,也可以临时跳过无法解决的依赖:

sudo yum install --skip-broken 软件包名称

        但是这个方法并不适合所有情况,因为被跳过的软件包可能正是程序运行所必需的组件。因此,生产环境中更推荐从软件源和版本兼容性角度解决问题。


小结

本章主要围绕 yum 的常用操作进行了整理,包括:

  • 使用 yum 前的网络、权限和软件源检查;

  • 软件包查询命令,例如 yum listyum infoyum deplist

  • 软件安装命令,例如 yum install 和批量安装;

  • 软件升级命令,例如 yum update yum check-update

  • 软件卸载命令,例如 yum remove yum autoremove

  • 缓存管理命令,例如 yum clean all yum makecache

  • 软件源管理命令,例如 yum repolist allyum-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 -ivhyum localinstall 在处理依赖关系时更加友好。不过在完全无网络、没有本地仓库的情况下,前提仍然是当前目录中已经准备好了完整依赖包。

        离线安装时常见的问题是依赖没有下载完整。如果安装过程中提示缺少某个依赖,需要回到有网络的机器上继续下载对应 rpm 包,然后再次复制到离线环境中安装。


总结

yum 不只是一个简单的软件安装命令,它还提供了历史记录、操作回滚、离线安装等实用能力。

在日常使用中,基础命令可以帮助我们完成软件安装、卸载、升级和查询;而进阶用法则能在误操作恢复、内网环境部署、离线服务器安装等场景中发挥作用。

学习 yum 时,建议重点掌握以下内容:

  • 使用 yum history 查看历史操作;

  • 使用 yum history info 分析某次操作详情;

  • 使用 yum history undo 尝试撤销误操作;

  • 使用 --downloadonly 提前下载软件包和依赖;

  • 使用 rpm -ivhyum localinstall 完成离线安装;

  • 生产环境变更前,优先做好备份或快照。

掌握这些内容后,我们在 Linux 系统中管理软件会更加稳妥。无论是安装开发工具、部署服务程序,还是维护服务器环境,yum 都是一个非常值得熟练掌握的基础工具。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐