# Linux YUM 包管理器 - 详解 Red Hat/CentOS 软件管理

URL: https://caijiao.org/linux/package-manager/yum
Source: docs/linux/package-manager/yum.md
Description: 全面介绍 Red Hat/CentOS 系统中 YUM 包管理器的使用方法、配置技巧和最佳实践，帮助您高效管理 RPM 软件包。

## 1. YUM 简介

YUM（Yellowdog Updater Modified）是 Red Hat 及其衍生发行版（如 CentOS、Fedora、Oracle Linux 等）中使用的包管理系统。YUM 基于 RPM（Red Hat Package Manager）构建，提供了自动依赖解析、软件包查询、安装、更新和卸载等功能。

### 1.1 YUM 的发展历程

YUM 最初由 Seth Vidal 开发，作为 Yellowdog Linux 的更新工具，后来被 Red Hat 采用并改进。随着时间的推移，YUM 逐渐成为 Red Hat 系发行版中标准的包管理工具。近年来，Fedora 和较新的 RHEL/CentOS 版本开始使用 DNF（Dandified YUM）作为 YUM 的替代品，DNF 提供了更好的性能和功能。

### 1.2 YUM 与 RPM 的关系

- **RPM**：是底层包管理工具，直接处理 `.rpm` 格式的软件包，但不自动处理依赖关系
- **YUM**：构建在 RPM 之上的高级工具，提供了依赖解析、包仓库管理、包缓存等功能

### 1.3 YUM 的主要特点

- **自动依赖解析**：自动检测、下载和安装软件包的所有依赖
- **包仓库管理**：从配置的软件仓库中获取软件包信息和下载软件包
- **命令行界面**：提供了简洁易用的命令行界面
- **事务处理**：使用事务机制确保软件包安装或更新的原子性
- **插件支持**：通过插件扩展功能

## 2. YUM 仓库配置

YUM 通过仓库（Repository）获取软件包信息和下载软件包。仓库配置决定了 YUM 可以从哪些服务器获取软件包。

### 2.1 仓库配置文件

YUM 的仓库配置文件位于 `/etc/yum.repos.d/` 目录，通常以 `.repo` 扩展名结尾。

### 2.2 仓库配置文件格式

一个典型的 `.repo` 文件包含以下内容：

```ini
[repository-id]
name=Repository Name
baseurl=http://mirror.example.com/path/
enabled=1
gpgcheck=1
gpgkey=http://mirror.example.com/path/RPM-GPG-KEY
```

各部分含义：
- `[repository-id]`：仓库的唯一标识符
- `name`：仓库的描述性名称
- `baseurl`：仓库的基础 URL，可以是 HTTP、HTTPS、FTP 或本地文件路径
- `enabled`：是否启用此仓库（0 表示禁用，1 表示启用）
- `gpgcheck`：是否验证软件包的 GPG 签名（0 表示禁用，1 表示启用）
- `gpgkey`：GPG 公钥的 URL 或本地路径，用于验证软件包签名

### 2.3 修改仓库配置

修改仓库配置文件前，建议先备份原文件：

```bash
# 备份仓库配置文件
sudo cp /etc/yum.repos.d/repository.repo /etc/yum.repos.d/repository.repo.backup
```

然后使用文本编辑器修改配置文件：

```bash
# 使用 nano 编辑器
sudo nano /etc/yum.repos.d/repository.repo

# 或使用 vim 编辑器
sudo vim /etc/yum.repos.d/repository.repo
```

### 2.4 添加第三方仓库

常见的第三方仓库包括 EPEL、RPM Fusion、Remi 等。

**添加 EPEL 仓库**：

```bash
# 在 RHEL/CentOS 7 上安装 EPEL 仓库
sudo yum install epel-release

# 在 RHEL/CentOS 8 上安装 EPEL 仓库
sudo dnf install epel-release
```

**添加 Remi 仓库**：

```bash
# 在 RHEL/CentOS 7 上安装 Remi 仓库
sudo yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm

# 在 RHEL/CentOS 8 上安装 Remi 仓库
sudo dnf install http://rpms.remirepo.net/enterprise/remi-release-8.rpm
```

### 2.5 创建本地仓库

对于无法连接互联网的环境或需要重复安装相同软件包的场景，可以创建本地 YUM 仓库：

```bash
# 安装 createrepo 工具
sudo yum install createrepo

# 创建仓库目录
mkdir -p /path/to/local/repo

# 将 RPM 包复制到仓库目录
cp *.rpm /path/to/local/repo/

# 创建仓库元数据
cd /path/to/local/repo/
sudo createrepo .

# 创建本地仓库配置文件
sudo nano /etc/yum.repos.d/local.repo
```

在配置文件中添加以下内容：

```ini
[local-repo]
name=Local Repository
baseurl=file:///path/to/local/repo
enabled=1
gpgcheck=0
```

## 3. 基础 YUM 命令

### 3.1 列出仓库

```bash
# 列出所有启用的仓库
yum repolist enabled

# 列出所有仓库（包括禁用的）
yum repolist all
```

### 3.2 清理 YUM 缓存

```bash
# 清理所有缓存
yum clean all

# 清理元数据缓存
yum clean metadata

# 清理软件包缓存
yum clean packages
```

### 3.3 更新软件包

#### 3.3.1 列出可更新的软件包

```bash
# 列出所有可更新的软件包
yum check-update
```

#### 3.3.2 更新所有软件包

```bash
# 更新所有已安装的软件包
yum update
```

#### 3.3.3 更新特定软件包

```bash
# 更新特定软件包
yum update package_name
```

### 3.4 安装软件包

#### 3.4.1 安装单个软件包

```bash
# 安装软件包
yum install package_name
```

#### 3.4.2 安装多个软件包

```bash
# 一次安装多个软件包
yum install package1 package2 package3
```

#### 3.4.3 安装特定版本的软件包

```bash
# 安装特定版本的软件包
yum install package_name-version
```

#### 3.4.4 从本地文件安装

```bash
# 从本地 RPM 文件安装
yum localinstall /path/to/package.rpm
```

### 3.5 卸载软件包

```bash
# 卸载软件包
yum remove package_name
# 或
yum erase package_name
```

### 3.6 软件包查询

#### 3.6.1 搜索软件包

```bash
# 搜索软件包
yum search keyword
```

#### 3.6.2 查看软件包信息

```bash
# 查看软件包详细信息
yum info package_name
```

#### 3.6.3 列出已安装的软件包

```bash
# 列出所有已安装的软件包
yum list installed

# 列出特定已安装的软件包
yum list installed package_name*
```

#### 3.6.4 列出可用的软件包

```bash
# 列出仓库中所有可用的软件包
yum list available

# 列出特定可用的软件包
yum list available package_name*
```

#### 3.6.5 查看软件包的依赖关系

```bash
# 查看软件包的依赖关系
yum deplist package_name

# 查看哪些软件包依赖于指定软件包
yum whatprovides package_name
```

#### 3.6.6 查看软件包包含的文件

```bash
# 查看软件包包含的文件
yum repoquery -l package_name
```

## 4. 高级 YUM 功能

### 4.1 YUM 历史记录

YUM 会记录所有软件包管理操作，可以查看历史记录并执行撤销操作。

```bash
# 查看 YUM 历史记录
yum history

# 查看特定事务的详细信息
yum history info transaction_id

# 撤销特定事务（回滚到之前的状态）
yum history undo transaction_id

# 重做特定事务
yum history redo transaction_id
```

### 4.2 软件组管理

YUM 支持软件组（Software Groups），可以一次性安装一组相关的软件包。

```bash
# 列出所有可用的软件组
yum grouplist

# 查看特定软件组的详细信息
yum groupinfo "Group Name"

# 安装软件组
yum groupinstall "Group Name"

# 更新软件组
yum groupupdate "Group Name"

# 删除软件组
yum groupremove "Group Name"
```

### 4.3 YUM 插件

YUM 可以通过插件扩展功能，常用的插件包括：

#### 4.3.1 fastestmirror 插件

自动选择最快的镜像服务器：

```bash
# 安装 fastestmirror 插件
yum install yum-plugin-fastestmirror

# 配置 fastestmirror 插件
nano /etc/yum/pluginconf.d/fastestmirror.conf
```

#### 4.3.2 priorities 插件

设置仓库优先级，避免不同仓库之间的包冲突：

```bash
# 安装 priorities 插件
yum install yum-plugin-priorities

# 配置 priorities 插件
nano /etc/yum/pluginconf.d/priorities.conf

# 在仓库配置中设置优先级（数字越小优先级越高）
priority=N
```

### 4.4 离线安装

在无法连接互联网的环境中，可以预先下载软件包及其依赖：

```bash
# 安装 yum-utils 工具集
yum install yum-utils

# 下载软件包及其依赖到指定目录
yumdownloader --resolve --destdir=/path/to/download package_name

# 离线安装下载的软件包
yum localinstall /path/to/download/*.rpm
```

### 4.5 软件包版本锁定

在某些情况下，可能需要锁定特定软件包的版本，防止其被自动升级：

```bash
# 安装 versionlock 插件
yum install yum-plugin-versionlock

# 锁定软件包版本
yum versionlock add package_name-1.0-1

# 查看已锁定的软件包
yum versionlock list

# 解锁软件包版本
yum versionlock delete package_name-1.0-1
# 或解锁所有软件包
yum versionlock clear
```

## 5. YUM 配置文件

YUM 的主配置文件是 `/etc/yum.conf`，用于设置 YUM 的全局行为。

### 5.1 主要配置选项

```ini
[main]
cachedir=/var/cache/yum/$basearch/$releasever
keepcache=0
debuglevel=2
logfile=/var/log/yum.log
exactarch=1
obsoletes=1
gpgcheck=1
plugins=1
installonly_limit=5
distroverpkg=centos-release
tolerant=1
tolerant=1
errorsignore=1
```

各选项说明：
- `cachedir`：YUM 缓存目录
- `keepcache`：是否保留已下载的软件包（0 表示不保留，1 表示保留）
- `debuglevel`：调试级别（0-10）
- `logfile`：日志文件路径
- `exactarch`：是否只安装与系统架构完全匹配的软件包
- `obsoletes`：是否启用软件包淘汰功能
- `gpgcheck`：是否默认检查软件包的 GPG 签名
- `plugins`：是否启用 YUM 插件
- `installonly_limit`：允许同时安装的内核软件包数量

### 5.2 修改 YUM 配置

```bash
# 编辑 YUM 主配置文件
sudo nano /etc/yum.conf
```

## 6. YUM 故障排除

### 6.1 常见问题及解决方案

#### 6.1.1 依赖冲突

```bash
# 尝试解决依赖冲突
yum clean all
yum update --skip-broken
```

#### 6.1.2 仓库连接问题

```bash
# 检查网络连接
ping mirror.example.com

# 检查仓库 URL 是否正确
curl -I http://mirror.example.com/path/

# 清理并重试
yum clean all
yum makecache
```

#### 6.1.3 GPG 签名验证失败

```bash
# 导入 GPG 密钥
sudo rpm --import http://mirror.example.com/path/RPM-GPG-KEY

# 临时禁用 GPG 检查（不推荐）
yum install --nogpgcheck package_name
```

#### 6.1.4 损坏的 RPM 数据库

```bash
# 重建 RPM 数据库
sudo rm -f /var/lib/rpm/__db*  
sudo rpm --rebuilddb
yum clean all
```

### 6.2 YUM 日志分析

YUM 操作日志记录了软件包管理的历史记录，可以用于审计和故障排查：

```bash
# 查看 YUM 操作日志
tail -f /var/log/yum.log
```

## 7. YUM 与 DNF 的区别

DNF（Dandified YUM）是 YUM 的现代替代品，首次出现在 Fedora 18 中，现在已成为 Fedora、RHEL 8 和 CentOS 8 的默认包管理器。

### 7.1 主要改进

- **性能提升**：DNF 比 YUM 具有更快的依赖解析和包管理速度
- **内存使用**：DNF 使用更少的内存
- **API 改进**：提供了更好的 API 接口，便于开发者使用
- **事务机制**：改进了事务处理机制，提供更好的错误处理
- **依赖解决**：使用 libsolv 库进行依赖解析，更可靠

### 7.2 命令对比

| YUM 命令 | DNF 命令 |
|----------|----------|
| yum install package | dnf install package |
| yum update | dnf update |
| yum remove package | dnf remove package |
| yum search keyword | dnf search keyword |
| yum info package | dnf info package |
| yum clean all | dnf clean all |
| yum history | dnf history |

大多数 YUM 命令可以直接替换为 DNF 命令，语法基本相同。

## 8. YUM 最佳实践

### 8.1 日常维护建议

- **定期更新**：定期运行 `sudo yum update` 保持系统最新
- **定期清理**：定期运行 `sudo yum clean all` 清理不需要的缓存
- **使用插件**：启用 fastestmirror 插件提高下载速度
- **设置仓库优先级**：使用 priorities 插件避免仓库冲突

### 8.2 系统升级策略

- **小版本升级**：对于同一发行版的小版本升级，可以直接使用 `sudo yum update`
- **大版本升级**：对于跨发行版升级，应：
  1. 备份重要数据
  2. 更新当前系统到最新状态
  3. 使用官方升级工具或按照官方文档进行升级

### 8.3 安全性考虑

- **验证软件源**：确保使用官方或可信的软件源
- **启用 GPG 检查**：始终验证软件包的 GPG 签名
- **定期安全更新**：及时安装安全更新
- **定期审计**：定期检查已安装的软件包，移除不再需要的包

## 9. 总结

YUM 包管理器是 Red Hat/CentOS 系统中强大的软件管理工具，通过本文的学习，您应该能够：

- 理解 YUM 的基本概念和工作原理
- 配置和管理 YUM 仓库
- 执行基本的软件包管理操作，如安装、更新、卸载软件包
- 查询软件包信息和依赖关系
- 使用 YUM 的高级功能，如历史记录、软件组管理、插件等
- 解决常见的 YUM 问题
- 了解 YUM 与 DNF 的区别
- 遵循 YUM 使用的最佳实践

熟练掌握 YUM 命令是有效管理 Red Hat/CentOS 系统的关键技能之一。随着技术的发展，DNF 正在逐渐取代 YUM，但 YUM 的基本概念和操作方法对于理解 DNF 也非常有帮助。
