Linux YUM 命令详解:从入门到精通

在 Linux 系统管理中,包管理工具是日常操作的核心。对于基于 RPM(Red Hat Package Manager)的发行版(如 RHEL、CentOS、Fedora 等),yum(Yellowdog Updater Modified)是最常用的包管理工具之一。它不仅能简化软件包的安装、更新和卸载流程,还能自动解决依赖关系,极大降低了系统管理的复杂度。

本文将从基础概念到高级实践,全面讲解 yum 命令的使用方法、配置技巧、最佳实践及故障排查,帮助读者轻松掌握 RPM 系 Linux 的包管理精髓。

目录#

  1. 什么是 YUM?
  2. YUM 核心概念
    • 2.1 软件仓库(Repositories)
    • 2.2 RPM 包与依赖关系
  3. YUM 常用命令全解析
    • 3.1 安装软件包
    • 3.2 更新软件包
    • 3.3 卸载软件包
    • 3.4 搜索与查询软件包
    • 3.5 仓库与缓存管理
    • 3.6 事务历史与回滚
  4. YUM 配置文件详解
    • 4.1 主配置文件 /etc/yum.conf
    • 4.2 仓库配置文件(.repo
  5. 软件仓库管理实战
    • 5.1 添加/删除仓库
    • 5.2 启用/禁用仓库
    • 5.3 常用第三方仓库(EPEL、Remi 等)
  6. YUM 最佳实践
  7. 常见故障排查
    • 7.1 仓库无法访问
    • 7.2 依赖冲突
    • 7.3 GPG 密钥验证失败
  8. 实战案例:典型 YUM 工作流
  9. 总结
  10. 参考资料

1. 什么是 YUM?#

yum(Yellowdog Updater Modified)是一个基于 RPM 的包管理工具,最初由杜克大学为 Yellow Dog Linux 开发,后被 Red Hat 等发行版广泛采用。它的核心功能是:

  • 自动解决依赖关系:安装软件时自动下载并安装所需的依赖包。
  • 集中管理软件仓库:从预配置的仓库(Repositories)中获取软件包,无需手动下载 RPM 文件。
  • 支持事务管理:记录操作历史,支持回滚(如卸载误安装的包)。

注意:在 RHEL 8/CentOS 8 及以上版本中,yum 已成为 dnf(Dandified YUM)的符号链接,但命令用法基本兼容。本文以传统 yum(适用于 CentOS 7 及以下)为例,多数命令也适用于 dnf

2. YUM 核心概念#

2.1 软件仓库(Repositories)#

仓库是存放 RPM 包及元数据的服务器或本地目录,YUM 通过仓库获取软件包。仓库分为:

  • 官方仓库:由发行版厂商维护(如 CentOS-Base、RHEL-AppStream),稳定性和安全性最高。
  • 第三方仓库:由社区或企业提供(如 EPEL、Remi),补充官方仓库未包含的软件(如最新版 Nginx、Python)。
  • 本地仓库:用户手动搭建的本地目录(如挂载 ISO 文件作为仓库)。

仓库元数据(repomd.xmlprimary.xml.gz 等)记录了包列表、依赖关系等信息,YUM 通过元数据实现包检索和依赖解析。

2.2 RPM 包与依赖关系#

  • RPM 包:YUM 管理的软件包格式(.rpm),包含二进制文件、配置文件、安装脚本等。
  • 依赖关系:软件运行所需的其他包或库(如安装 httpd 需要 aprapr-util 等)。YUM 会自动分析依赖链并批量安装,避免手动解决依赖的繁琐。

3. YUM 常用命令全解析#

3.1 安装软件包#

基本语法:#

yum install [选项] <包名>

常用选项:#

  • -y:自动回答 "yes",无需手动确认。
  • --nogpgcheck:跳过 GPG 密钥验证(不推荐,仅临时用于无 GPG 密钥的仓库)。
  • --enablerepo=<仓库ID>:临时启用指定仓库(即使仓库默认禁用)。

示例:#

# 安装 Apache(httpd),自动确认
yum install -y httpd
 
# 从 EPEL 仓库安装 htop(假设 EPEL 已添加但默认禁用)
yum install --enablerepo=epel htop -y

3.2 更新软件包#

基本语法:#

# 更新单个包
yum update [选项] <包名>
 
# 更新所有包(含系统内核)
yum update [选项]
 
# 更新所有包但不更新内核
yum upgrade [选项]

示例:#

# 更新系统所有包(谨慎操作,生产环境建议先测试)
yum update -y
 
# 仅更新 Nginx
yum update nginx -y
 
# 更新所有包但不升级内核(CentOS 7 及以下)
yum upgrade -y

3.3 卸载软件包#

基本语法:#

yum remove [选项] <包名>  # 卸载包及未被依赖的依赖
yum erase [选项] <包名>    # 与 remove 功能相同

示例:#

# 卸载 httpd,自动确认
yum remove -y httpd

注意yum remove 仅卸载指定包及“孤儿依赖”(即不再被其他包依赖的依赖),不会强制删除被其他包依赖的文件。

3.4 搜索与查询软件包#

搜索包(按名称或描述):#

yum search <关键>

示例:搜索包含“web server”的包

yum search "web server"  # 结果会包含 httpd、nginx 等

查看包详情:#

yum info <>

示例:查看 Nginx 包信息

yum info nginx

列出已安装/可用包:#

yum list installed        # 列出所有已安装包
yum list available        # 列出仓库中可用但未安装的包
yum list <>           # 查看指定包的安装状态(如 yum list httpd)

查看包依赖关系:#

yum deplist <>

示例:查看 httpd 的依赖

yum deplist httpd

3.5 仓库与缓存管理#

列出仓库:#

yum repolist                # 列出已启用的仓库
yum repolist all            # 列出所有仓库(含禁用的)

清理缓存:#

YUM 会缓存下载的 RPM 包和元数据,缓存过大时需清理:

yum clean all               # 清理所有缓存(包和元数据)
yum clean packages          # 仅清理缓存的 RPM 包
yum clean metadata          # 仅清理元数据

重建缓存:#

清理缓存后,需重建元数据缓存以确保仓库信息最新:

yum makecache               # 生成元数据缓存

3.6 事务历史与回滚#

YUM 会记录所有操作(安装、更新、卸载),支持基于历史的回滚:

查看历史记录:#

yum history                 # 列出所有事务历史(ID、操作、日期)
yum history info <事务ID>   # 查看指定事务的详细信息

回滚操作:#

yum history undo <事务ID>   # 撤销指定事务(如卸载误安装的包)
yum history rollback <事务ID> # 回滚到指定事务状态(慎用,可能影响依赖)

示例:撤销 ID 为 10 的事务

yum history undo 10 -y

4. YUM 配置文件详解#

4.1 主配置文件 /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                                   # 是否只安装与系统架构匹配的包(推荐1)
obsoletes=1                                   # 是否处理过时包(用于 yum upgrade)
gpgcheck=1                                    # 全局默认 GPG 验证开关(1:启用)
plugins=1                                     # 是否启用插件(如 fastestmirror)
installonly_limit=5                           # 保留内核的最大数量(默认5)

4.2 仓库配置文件(.repo#

仓库配置文件存放于 /etc/yum.repos.d/,文件名以 .repo 结尾(如 CentOS-Base.repo)。每个仓库对应一个 [repo-id] 段落,格式如下:

[repo-id]                  # 仓库唯一标识(不能重复)
name=Repository Name       # 仓库名称(描述性文字)
baseurl=http://example.com/repo/$releasever/$basearch/  # 仓库地址(http/ftp/file)
enabled=1                  # 是否启用仓库(1:启用;0:禁用)
gpgcheck=1                 # 是否验证包的 GPG 签名(1:启用)
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7  # GPG 公钥路径(用于验证签名)

变量说明$releasever(系统版本,如 7)、$basearch(系统架构,如 x86_64)会自动替换为实际值。

5. 软件仓库管理实战#

5.1 添加/删除仓库#

添加仓库:#

  1. 手动创建 .repo 文件并放入 /etc/yum.repos.d/
    示例:添加 EPEL 仓库(适用于 CentOS 7)

    cat > /etc/yum.repos.d/epel.repo << EOF
    [epel]
    name=Extra Packages for Enterprise Linux 7 - \$basearch
    baseurl=https://download.fedoraproject.org/pub/epel/7/\$basearch
    enabled=1
    gpgcheck=1
    gpgkey=https://download.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-7
    EOF
  2. 通过 RPM 包安装仓库(推荐,自动配置 repo 文件):
    例如安装 EPEL 仓库:

    yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

删除仓库:#

直接删除 /etc/yum.repos.d/ 下对应的 .repo 文件即可:

rm -f /etc/yum.repos.d/epel.repo

5.2 启用/禁用仓库#

临时启用/禁用仓库(仅本次操作生效):

yum install --enablerepo=epel htop  # 临时启用 EPEL 仓库安装 htop
yum update --disablerepo=remi php   # 更新 PHP 时禁用 Remi 仓库

永久启用/禁用仓库(修改 repo 文件或使用 yum-config-manager):

# 安装 yum-utils(提供 yum-config-manager)
yum install -y yum-utils
 
# 永久启用 EPEL 仓库
yum-config-manager --enable epel
 
# 永久禁用 Remi 仓库
yum-config-manager --disable remi

5.3 常用第三方仓库#

  • EPEL(Extra Packages for Enterprise Linux):最常用的第三方仓库,提供大量官方仓库未包含的软件(如 htopnginx 旧版本)。
    安装:yum install -y epel-release(CentOS 7)。

  • Remi:专注于提供最新版 PHP、MySQL 等软件,适合需要新版本开发环境的场景。
    官网:https://rpms.remirepo.net/。

  • ELRepo:提供硬件驱动和内核相关包(如 elrepo-kernel)。

6. YUM 最佳实践#

  1. 安装前先更新系统
    yum update -y 确保依赖库为最新版本,减少依赖冲突。

  2. 慎用 -y 选项
    自动确认可能导致误操作(如卸载关键包),生产环境建议手动确认。

  3. 强制启用 GPG 验证
    禁用 gpgcheck 可能安装恶意包,始终保持 gpgcheck=1,并导入仓库的 GPG 密钥。

  4. 优先使用官方仓库
    第三方仓库可能导致包版本冲突(如 Remi 与官方 PHP 包),非必要不启用。

  5. 定期清理缓存
    yum clean all && yum makecache 避免缓存元数据过期导致的安装失败。

  6. 使用 yum history 记录操作
    重要操作后记录事务 ID,便于后续回滚(如 yum history | grep "install httpd")。

  7. 避免手动安装 RPM 包
    手动安装 .rpm 文件会绕过 YUM 依赖管理,可能导致依赖链断裂,建议通过仓库安装。

7. 常见故障排查#

7.1 仓库无法访问(Could not retrieve mirrorlist#

  • 排查:检查仓库 baseurl 是否正确(如 ping 仓库域名,curl 测试 URL)。
  • 解决
    1. 修正 .repo 文件中的 baseurl(如将 http 改为 https,或更换镜像源)。
    2. 清理缓存并重建:yum clean all && yum makecache

7.2 依赖冲突(Error: Package: ... requires ...#

  • 排查:不同仓库提供同一包的不同版本(如官方 PHP 与 Remi PHP)。
  • 解决
    1. 禁用冲突仓库:yum-config-manager --disable <冲突仓库ID>
    2. 指定包版本安装:yum install <包名>-<版本>(需仓库提供该版本)。

7.3 GPG 密钥验证失败(GPG key retrieval failed#

  • 排查:仓库 gpgkey 路径错误,或密钥未导入。
  • 解决
    1. 手动导入 GPG 密钥:rpm --import <gpgkey-url>(如 EPEL 密钥:rpm --import https://download.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-7)。
    2. 检查 .repo 文件中 gpgkey 是否正确。

8. 实战案例:典型 YUM 工作流#

场景:在 CentOS 7 服务器上部署 Nginx,步骤如下:

  1. 安装 EPEL 仓库(Nginx 存在于 EPEL):

    yum install -y epel-release
  2. 更新系统并安装 Nginx

    yum update -y && yum install -y nginx
  3. 查看 Nginx 安装信息

    yum info nginx
  4. 启动 Nginx 并设置开机自启

    systemctl start nginx && systemctl enable nginx
  5. 后续:更新 Nginx 到最新版

    yum update -y nginx
  6. 若更新后出现问题,回滚操作

    yum history | grep "update nginx"  # 找到更新事务 ID(假设为 25)
    yum history undo 25 -y             # 回滚到更新前状态

9. 总结#

YUM 作为 RPM 系 Linux 的包管理利器,简化了软件安装、更新和维护流程。掌握其核心命令、仓库配置和最佳实践,能显著提升系统管理效率。记住:始终优先使用官方仓库,启用 GPG 验证,定期清理缓存,并通过 yum history 记录操作,以确保系统稳定与安全。

10. 参考资料#