YUM 命令详解:Linux 系统中的包管理利器

在 Linux 系统中,包管理是日常运维和系统管理的核心任务之一。YUM(Yellowdog Updater, Modified) 作为 Red Hat 系 Linux 发行版(如 RHEL、CentOS、Fedora 等)的默认包管理器,以其自动化依赖解析、简洁的命令集和强大的仓库管理能力,成为用户管理软件包的首选工具。尽管近年来 DNF(YUM 的下一代版本)逐渐取代 YUM 成为主流,但 YUM 仍在许多旧系统(如 CentOS 6/7、RHEL 6/7)中广泛使用,且其核心思想与 DNF 一脉相承。

本文将全面介绍 YUM 的工作原理、核心命令、最佳实践、高级用法及常见问题解决,帮助读者从入门到精通 YUM 包管理。

目录#

1. YUM 简介#

1.1 什么是 YUM?#

YUM(Yellowdog Updater, Modified)是一个基于 RPM(Red Hat Package Manager)的包管理工具,主要用于 Red Hat 系 Linux 发行版(如 RHEL、CentOS、Fedora、Oracle Linux 等)。它的核心功能是自动化解决软件包之间的依赖关系,并简化软件的安装、更新、卸载流程。

与直接使用 rpm 命令相比,YUM 的优势在于:

  • 自动解析并安装依赖包,无需手动处理复杂依赖链;
  • 支持从远程仓库(Repository)下载软件包,集中管理软件源;
  • 提供丰富的查询功能,方便查找软件包信息;
  • 支持事务管理(如回滚操作),提高系统稳定性。

1.2 YUM 的工作原理#

YUM 的工作流程主要包括以下步骤:

  1. 读取配置文件:YUM 从 /etc/yum.conf(主配置)和 /etc/yum.repos.d/(仓库配置)中加载配置信息。
  2. 获取仓库元数据:YUM 定期从配置的仓库中下载元数据(如软件包列表、依赖关系、版本信息等),并缓存到本地(默认路径:/var/cache/yum/)。
  3. 解析用户请求:当用户执行安装/更新等命令时,YUM 根据元数据解析依赖关系,生成待执行的事务(Transaction)。
  4. 执行事务:YUM 下载所需软件包(或使用本地缓存),并按依赖顺序安装/更新/卸载,最后记录事务日志。

1.3 YUM 与 DNF 的关系#

在 Fedora 22+、CentOS 8+、RHEL 8+ 等较新的发行版中,YUM 已被 DNF(Dandified YUM) 取代。DNF 是 YUM 的下一代版本,采用 C++ 重写,解决了 YUM 的性能问题(如内存占用高、依赖解析慢),并兼容 YUM 的大部分命令。

注意:在 CentOS 8/RHEL 8 中,yum 命令通常是 dnf 的符号链接,因此用户仍可使用 yum 命令,但底层由 DNF 实现。本文主要针对传统 YUM(如 CentOS 7 及更早版本),但大部分命令也适用于 DNF。

2. YUM 的安装与配置#

2.1 YUM 的默认安装#

YUM 通常预装在 Red Hat 系 Linux 系统中。若系统中未安装(如最小化安装场景),可通过以下命令手动安装:

# 基于 RPM 直接安装(需提前下载 yum 相关 RPM 包)
rpm -ivh yum-*.rpm

提示:最小化安装的 CentOS 通常已包含 YUM,无需额外操作。

2.2 YUM 配置文件#

YUM 的配置由两类文件组成:

主配置文件:/etc/yum.conf#

该文件定义 YUM 的全局行为,如缓存路径、日志路径、默认仓库等。示例内容:

[main]
cachedir=/var/cache/yum/$basearch/$releasever  # 缓存目录
keepcache=0                                   # 是否保留缓存(0=不保留,1=保留)
debuglevel=2                                  # 调试级别(0-10,默认2)
logfile=/var/log/yum.log                      # 日志文件路径
exactarch=1                                   # 是否严格匹配架构(如 x86_64 不安装 i686 包)
obsoletes=1                                   # 是否处理过时包(1=启用)
gpgcheck=1                                    # 默认 GPG 验证开关(1=启用,0=禁用)
plugins=1                                     # 是否启用插件(1=启用)
installonly_limit=5                           # 保留的内核包最大数量

仓库配置文件:/etc/yum.repos.d/*.repo#

所有以 .repo 结尾的文件均为仓库配置文件,用于定义软件包的来源。每个仓库配置以 [仓库ID] 为标识,包含以下核心参数:

  • name:仓库名称(描述性文字);
  • baseurl:仓库地址(支持 HTTP、HTTPS、FTP、本地路径等);
  • enabled:是否启用仓库(1=启用,0=禁用);
  • gpgcheck:是否验证包的 GPG 签名(1=启用,0=禁用);
  • gpgkey:GPG 公钥文件路径(用于验证签名)。

示例:CentOS 官方基础仓库配置(CentOS-Base.repo

[base]
name=CentOS-$releasever - Base
baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
 
[updates]
name=CentOS-$releasever - Updates
baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

3. YUM 核心命令详解#

3.1 安装软件包#

基本语法#

yum install [选项] <软件包名称>

常用选项#

  • -y:自动回答 "yes",无需手动确认;
  • --nogpgcheck:跳过 GPG 签名验证(不推荐,仅临时应急使用);
  • --enablerepo=<仓库ID>:临时启用指定仓库。

示例#

# 安装 Apache 服务(httpd)
yum install httpd
 
# 安装并自动确认
yum install -y httpd
 
# 从指定仓库(如 epel)安装软件
yum --enablerepo=epel install nginx

3.2 更新软件包#

基本语法#

# 更新单个软件包
yum update <软件包名>
 
# 更新所有软件包(含系统内核)
yum update
 
# 更新所有软件包但不更新内核
yum update --exclude=kernel*

示例#

# 更新 httpd 到最新版本
yum update httpd
 
# 检查可更新的软件包(不执行实际更新)
yum check-update
 
# 更新系统所有包(自动确认)
yum update -y

3.3 卸载软件包#

基本语法#

yum remove <软件包名>
# 或(与 remove 等效)
yum erase <软件包名>

示例#

# 卸载 httpd(会自动卸载依赖于 httpd 的包,但保留 httpd 的依赖包)
yum remove httpd
 
# 卸载并自动确认
yum remove -y httpd

注意yum remove 仅卸载指定包及其依赖的“叶节点”包(即无其他包依赖的包),不会卸载系统关键依赖包,因此比 rpm -e 更安全。

3.4 查询软件包信息#

YUM 提供多种查询命令,帮助用户获取软件包的详细信息:

命令功能描述
yum list列出所有可用软件包(已安装+可安装)
yum list installed列出已安装的软件包
yum list available列出可安装的软件包(未安装)
yum search <关键词>按名称/描述搜索软件包
yum info <软件包名称>显示软件包详细信息(版本、依赖、描述等)
yum provides <文件路径>查询哪个包提供了指定文件
yum deplist <软件包名称>列出软件包的依赖关系

示例#

# 搜索包含 "mysql" 的软件包
yum search mysql
 
# 查看已安装的 httpd 信息
yum info httpd
 
# 查询 /usr/bin/nginx 由哪个包提供
yum provides /usr/bin/nginx
 
# 列出 httpd 的依赖包
yum deplist httpd

3.5 管理 YUM 缓存#

YUM 会将下载的软件包和元数据缓存到本地(默认路径 /var/cache/yum/),可通过以下命令管理缓存:

命令功能描述
yum clean packages清理已下载的软件包缓存(.rpm 文件)
yum clean metadata清理仓库元数据缓存
yum clean all清理所有缓存(packages + metadata)
yum makecache手动生成缓存(提前下载元数据,加速后续操作)

示例#

# 清理所有缓存(释放磁盘空间)
yum clean all
 
# 生成缓存(适用于网络较慢时,提前缓存元数据)
yum makecache

4. YUM 仓库管理#

4.1 什么是 YUM 仓库?#

YUM 仓库(Repository)是存储软件包和元数据的服务器或本地目录。系统通过仓库获取软件包,常见仓库类型包括:

  • 官方仓库:由 Linux 发行商维护(如 CentOS-Base、CentOS-Updates);
  • 第三方仓库:如 EPEL(Extra Packages for Enterprise Linux)、ELRepo(内核相关包);
  • 本地仓库:通过 createrepo 工具自建的本地目录仓库。

4.2 列出已配置的仓库#

# 列出所有仓库(包含启用/禁用状态)
yum repolist all
 
# 仅列出启用的仓库
yum repolist enabled
 
# 查看仓库详细信息
yum repoinfo <仓库ID>

示例输出#

repo id           repo name                               status
base/7/x86_64     CentOS-7 - Base                         enabled: 10,072
epel/x86_64       Extra Packages for Enterprise Linux 7 - x86_64 enabled: 13,705
updates/7/x86_64  CentOS-7 - Updates                      enabled: 5,123

4.3 启用/禁用仓库#

临时启用/禁用(仅当前命令生效)#

# 临时启用 epel 仓库安装软件
yum --enablerepo=epel install htop
 
# 临时禁用 base 仓库(不推荐,可能导致依赖问题)
yum --disablerepo=base install httpd

永久启用/禁用(修改 .repo 文件)#

直接编辑 /etc/yum.repos.d/ 下的仓库文件,修改 enabled=1(启用)或 enabled=0(禁用)。

通过 yum-config-manager 工具(推荐)#

若系统安装了 yum-utils 包(包含 yum-config-manager),可通过命令行修改仓库状态:

# 安装 yum-utils(若未安装)
yum install -y yum-utils
 
# 永久启用 epel 仓库
yum-config-manager --enable epel
 
# 永久禁用 epel 仓库
yum-config-manager --disable epel

4.4 添加自定义仓库#

添加自定义仓库的步骤:

  1. /etc/yum.repos.d/ 下创建 .repo 文件;
  2. 配置仓库参数(baseurl、gpgkey 等);
  3. 验证仓库是否生效。

示例:添加 EPEL 仓库#

EPEL 是 Fedora 社区维护的第三方仓库,提供大量官方仓库未包含的软件(如 htopnginx 等)。

# 安装 EPEL 仓库配置包(自动生成 .repo 文件)
yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
 
# 验证仓库是否启用
yum repolist enabled | grep epel

示例:添加本地仓库#

若需从本地目录安装软件(如无网络环境),可通过 createrepo 创建本地仓库:

# 安装 createrepo 工具
yum install -y createrepo
 
# 创建本地仓库目录并复制 RPM 包
mkdir /localrepo
cp /path/to/*.rpm /localrepo/
 
# 生成仓库元数据
createrepo /localrepo
 
# 创建 .repo 文件
cat > /etc/yum.repos.d/local.repo << EOF
[localrepo]
name=Local Repository
baseurl=file:///localrepo
enabled=1
gpgcheck=0
EOF
 
# 验证本地仓库
yum repolist enabled | grep localrepo

5. YUM 高级用法#

5.1 事务历史与回滚#

YUM 会记录所有执行过的操作(称为“事务”),支持查看历史记录和回滚操作,这是系统故障恢复的重要手段。

核心命令#

# 列出所有事务历史(ID、操作时间、操作类型)
yum history list
 
# 查看指定事务的详细信息(如 ID=10)
yum history info 10
 
# 回滚到指定事务前的状态(如撤销 ID=10 的操作)
yum history undo 10
 
# 重做指定事务(如重新执行 ID=5 的操作)
yum history redo 5

示例#

# 查看最近 3 次事务
yum history list last 3
 
# 撤销上一次更新操作(假设最后一次事务是 update)
yum history undo last

注意:事务回滚并非万能,对于内核更新、库文件替换等重大变更,可能无法完全恢复,建议回滚前备份关键数据。

5.2 锁定软件包版本#

若需固定某个软件包的版本(防止被 yum update 意外更新),可使用 yum-versionlock 插件:

步骤#

  1. 安装插件:

    yum install -y yum-plugin-versionlock
  2. 锁定软件包版本:

    # 锁定 httpd 版本(格式:包名-版本-发布版本.架构)
    yum versionlock add httpd-2.4.6-97.el7.centos.x86_64
     
    # 锁定所有 httpd 相关包
    yum versionlock add httpd*
  3. 查看已锁定的包:

    yum versionlock list
  4. 解锁软件包:

    # 解锁指定包
    yum versionlock delete httpd*
     
    # 解锁所有包
    yum versionlock clear

5.3 安装本地 RPM 包#

若需安装本地已下载的 RPM 包,且希望 YUM 自动解决依赖关系,可使用 yum localinstall

# 安装本地 RPM 包(自动从仓库下载依赖)
yum localinstall /path/to/package.rpm
 
# 示例:安装本地 nginx RPM
yum localinstall ~/Downloads/nginx-1.20.1-1.el7.x86_64.rpm

提示yum localinstallrpm -ivh 的区别在于,前者会自动处理依赖,后者需手动解决所有依赖。

5.4 管理软件包组#

Linux 系统将功能相关的软件包打包为“包组”(如“开发工具”“Web 服务器”),方便批量安装。

核心命令#

# 列出所有包组
yum group list
 
# 查看包组详细信息(如 "Development Tools")
yum group info "Development Tools"
 
# 安装包组(默认安装组内“必选”和“默认”包)
yum group install "Development Tools"
 
# 安装包组内所有包(包含“可选”包)
yum group install "Development Tools" --with-optional
 
# 卸载包组
yum group remove "Development Tools"

示例#

# 安装开发工具包组(包含 gcc、make、git 等)
yum group install -y "Development Tools"

6. YUM 最佳实践#

6.1 定期更新系统#

定期执行 yum update 可修复系统漏洞、获取新功能,但需注意:

  • 生产环境:建议先在测试环境验证更新,再批量更新生产服务器,避免兼容性问题;
  • 关键业务:可选择“安全更新”(如 yum update --security,需安装 yum-plugin-security 插件),仅更新修复安全漏洞的包。
# 安装安全更新插件
yum install -y yum-plugin-security
 
# 仅更新安全相关的包
yum update --security -y

6.2 谨慎使用 -y 参数#

-y 参数会自动回答所有确认提示(默认“yes”),适合自动化脚本,但不建议手动操作时滥用。例如:

# 危险操作:盲目更新所有包可能导致服务中断
yum update -y  # 生产环境慎用!
 
# 安全做法:先查看更新列表,再手动确认
yum check-update
yum update  # 按需输入 "y" 确认

6.3 优先使用官方仓库#

第三方仓库(如 EPEL)虽提供更多软件,但可能存在兼容性或安全风险。建议:

  • 优先使用官方仓库;
  • 必须使用第三方仓库时,选择知名、可信的源(如 EPEL、ELRepo);
  • 禁用不常用的第三方仓库,仅在安装特定软件时临时启用。

6.4 清理缓存释放空间#

YUM 缓存(/var/cache/yum/)会占用磁盘空间,尤其是长期使用的服务器。定期清理可释放空间:

# 清理所有缓存(推荐每周执行一次)
yum clean all
 
# 若需保留已下载的 RPM 包(如重复安装场景),可仅清理元数据
yum clean metadata

7. 常见问题与解决方案#

7.1 GPG 密钥验证失败#

错误提示GPG key retrieval failed: [Errno 14] curl#6 - "Could not resolve host: ..."public key not available

原因:仓库 GPG 密钥未导入或验证失败。

解决方案

# 手动导入 GPG 密钥(以 CentOS 官方密钥为例)
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
 
# 若密钥文件在远程服务器,直接下载并导入
rpm --import http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-7
 
# 临时跳过 GPG 验证(不推荐,仅应急)
yum install --nogpgcheck <package>

7.2 仓库无法访问或不存在#

错误提示Error: Cannot retrieve repository metadata (repomd.xml) for repository: ...

原因:仓库 URL 错误、网络不通、仓库已下线。

解决方案

  1. 检查网络连通性:ping mirror.centos.org
  2. 验证仓库 URL:编辑 .repo 文件,确认 baseurl 正确(可替换为国内镜像,如阿里云、网易镜像);
  3. 禁用无效仓库:yum-config-manager --disable <仓库ID>

示例:替换为阿里云 CentOS 镜像

# 备份原仓库文件
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak
 
# 下载阿里云镜像配置
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
 
# 清理缓存并生成新缓存
yum clean all && yum makecache

7.3 依赖关系冲突#

错误提示Error: Package: ... requires ... but ... is already installed

原因:已安装的包版本与待安装包的依赖版本冲突。

解决方案

  1. 尝试更新冲突的依赖包:yum update <冲突的包>
  2. 若无法更新,使用 --skip-broken 跳过冲突包(不推荐,可能导致功能异常):
    yum install <package> --skip-broken
  3. 极端情况:卸载冲突包后重新安装(需评估风险)。

7.4 软件包未找到#

错误提示No package <package> available

原因:仓库中无该包,或仓库未启用。

解决方案

  1. 确认包名拼写正确:yum search <关键词>
  2. 启用包含该包的仓库:yum --enablerepo=<仓库ID> install <package>
  3. 添加第三方仓库(如 EPEL):yum install -y epel-release

8. 总结#

YUM 作为 Red Hat 系 Linux 的经典包管理工具,通过自动化依赖解析和仓库管理,极大简化了软件的安装、更新和卸载流程。本文从基础命令到高级用法,详细介绍了 YUM 的核心功能、最佳实践及问题解决方法。

掌握 YUM 的关键在于:

  • 熟悉核心命令(install/update/remove/search);
  • 理解仓库配置与管理;
  • 善用事务历史进行故障恢复;
  • 遵循最佳实践(如谨慎更新、清理缓存)。

尽管 DNF 已逐渐取代 YUM,但两者命令兼容,本文内容对 DNF 用户同样具有参考价值。

9. 参考资料#

  1. YUM 官方文档
  2. CentOS YUM 仓库配置指南
  3. EPEL 官方网站
  4. YUM 事务历史管理
  5. RPM 与 YUM 包管理详解