# 软件包管理

URL: https://caijiao.org/rockylinux/software-package-management
Source: docs/rockylinux/software-package-management.md
Description: 详细介绍 Rocky Linux 中的软件包管理系统，包括 DNF、RPM、软件仓库管理以及常见软件安装方法

在 Linux 系统中，软件包管理是系统管理的重要组成部分。Rocky Linux 作为企业级 Linux 发行版，提供了强大而灵活的软件包管理系统。本教程将详细介绍 Rocky Linux 中的软件包管理工具，包括 DNF、RPM 的使用方法，软件仓库管理以及常见软件安装方式。

## 软件包管理基础

### 软件包管理概念

软件包是一个或多个程序及其相关文件（配置文件、文档等）的集合，以标准格式打包。软件包管理系统提供了安装、升级、删除和查询软件包的功能，同时处理软件包之间的依赖关系。

在 Rocky Linux 中，主要使用以下组件进行软件包管理：

- **RPM（Red Hat Package Manager）**：底层软件包管理工具，负责软件包的安装、升级和删除
- **DNF（Dandified YUM）**：高级软件包管理工具，是 YUM 的下一代版本，提供了更好的性能和用户体验
- **软件仓库（Repository）**：存储软件包的服务器，包含软件包及其元数据

## DNF 包管理器

DNF 是 Rocky Linux 中默认的软件包管理器，提供了强大的软件包管理功能。

### 基本语法

```bash
dnf [选项] 命令 [软件包名称...]
```

### 安装软件包

```bash
# 安装单个软件包
sudo dnf install package_name

# 安装多个软件包
sudo dnf install package1 package2 package3

# 安装指定版本的软件包
sudo dnf install package_name-1.0.0

# 重新安装软件包
sudo dnf reinstall package_name

# 安装软件包组
sudo dnf groupinstall "Development Tools"
```

### 升级软件包

```bash
# 检查可用更新
sudo dnf check-update

# 升级单个软件包
sudo dnf update package_name

# 升级所有软件包
sudo dnf update
# 或简写为
sudo dnf up

# 升级系统内核（通常会自动包含在 update 中）
sudo dnf update kernel

# 升级软件包组
sudo dnf groupupdate "Development Tools"
```

### 删除软件包

```bash
# 删除软件包（保留配置文件）
sudo dnf remove package_name
# 或使用老式命令
sudo dnf erase package_name

# 删除软件包及其依赖（不再需要的）
sudo dnf autoremove package_name

# 删除软件包组
sudo dnf groupremove "Development Tools"
```

### 查询软件包

```bash
# 搜索软件包
sudo dnf search keyword

# 精确搜索软件包名称
sudo dnf search --name package_name

# 显示软件包详情
sudo dnf info package_name

# 列出所有已安装的软件包
sudo dnf list installed

# 列出所有可安装的软件包
sudo dnf list available

# 列出所有软件包（已安装和可安装）
sudo dnf list all

# 列出软件包组
sudo dnf grouplist

# 显示软件包组详情
sudo dnf groupinfo "Development Tools"

# 查找哪个软件包提供特定文件
sudo dnf provides /path/to/file

# 列出软件包中包含的文件
sudo dnf repoquery -l package_name
```

### DNF 缓存管理

```bash
# 清理所有缓存
sudo dnf clean all

# 只清理过期缓存
sudo dnf clean expire-cache

# 下载软件包但不安装
sudo dnf download package_name
```

### DNF 高级功能

```bash
# 查看软件包的依赖关系
sudo dnf deplist package_name

# 显示软件包的变更日志
sudo dnf changelog package_name

# 检查软件包的安全更新
sudo dnf updateinfo list security

# 只更新安全相关的软件包
sudo dnf update --security

# 显示事务历史
sudo dnf history

# 显示特定事务的详情
sudo dnf history info 1

# 回滚到特定事务
sudo dnf history rollback 1
```

### DNF 配置

DNF 的主配置文件是 `/etc/dnf/dnf.conf`，可以通过编辑此文件来自定义 DNF 的行为：

```bash
sudo vim /etc/dnf/dnf.conf
```

常见配置选项：

```ini
[main]
ggcheck=1
installonly_limit=3
clean_requirements_on_remove=True
best=True
skip_if_unavailable=False
max_parallel_downloads=10
deltarpm=True
keepcache=False
timeout=300
```

配置选项说明：

- `gpgcheck=1`：验证软件包的 GPG 签名
- `installonly_limit=3`：限制保留的内核版本数量
- `clean_requirements_on_remove=True`：删除软件包时自动清理不再需要的依赖
- `best=True`：总是尝试安装最佳可用版本
- `skip_if_unavailable=False`：仓库不可用时跳过
- `max_parallel_downloads=10`：最大并行下载数量
- `deltarpm=True`：启用增量 RPM 下载
- `keepcache=False`：不保留已安装的软件包
- `timeout=300`：下载超时时间（秒）

## RPM 包管理工具

RPM 是 Rocky Linux 中底层的软件包管理工具，DNF 实际上是构建在 RPM 之上的高级工具。在某些情况下，可能需要直接使用 RPM 命令。

### 基本语法

```bash
rpm [选项] 命令 [软件包名称或文件...]
```

### 安装软件包

```bash
# 安装 RPM 软件包
sudo rpm -ivh package.rpm

# 升级 RPM 软件包
sudo rpm -Uvh package.rpm

# 强制安装或升级（覆盖已安装文件）
sudo rpm -ivh --force package.rpm
```

### 查询软件包

```bash
# 列出所有已安装的软件包
rpm -qa

# 查询特定软件包是否已安装
rpm -q package_name

# 显示软件包详情
rpm -qi package_name

# 列出软件包中包含的文件
rpm -ql package_name

# 列出软件包的配置文件
rpm -qc package_name

# 查找哪个软件包提供特定文件
rpm -qf /path/to/file

# 验证软件包的安装文件
rpm -V package_name
```

### 删除软件包

```bash
# 删除软件包
sudo rpm -e package_name

# 强制删除（忽略依赖关系）
sudo rpm -e --nodeps package_name
```

## 软件仓库管理

软件仓库是存储软件包的服务器，Rocky Linux 使用多个官方和第三方软件仓库。

### 查看已配置的仓库

```bash
# 列出所有已启用的仓库
sudo dnf repolist

# 列出所有仓库（包括已禁用的）
sudo dnf repolist all

# 显示特定仓库的详情
sudo dnf repoinfo repository_name
```

### 启用和禁用仓库

```bash
# 临时启用仓库
sudo dnf --enablerepo=repository_name install package_name

# 临时禁用仓库
sudo dnf --disablerepo=repository_name update

# 永久启用或禁用仓库
sudo dnf config-manager --set-enabled repository_name
sudo dnf config-manager --set-disabled repository_name
```

### 添加和删除仓库

```bash
# 使用 dnf config-manager 添加仓库
sudo dnf config-manager --add-repo repository_url

# 手动创建仓库配置文件
sudo vim /etc/yum.repos.d/custom.repo
```

仓库配置文件示例：

```ini
[custom-repo]
name=Custom Repository
baseurl=http://example.com/repo/rocky/8/$basearch/
enabled=1
gpgcheck=1
gpgkey=http://example.com/repo/RPM-GPG-KEY-custom
```

### 导入 GPG 密钥

```bash
# 导入仓库的 GPG 密钥
sudo rpm --import http://example.com/repo/RPM-GPG-KEY-custom
```

### 常用软件仓库

#### 官方仓库

- **BaseOS**：提供核心操作系统包
- **AppStream**：提供应用程序流，包括额外的用户空间应用程序、运行时语言和数据库
- **PowerTools**：提供构建软件所需的开发工具和库
- **Extras**：提供额外的软件包，包括 EPEL 仓库的集成

#### EPEL 仓库

EPEL (Extra Packages for Enterprise Linux) 提供了许多在官方仓库中不可用的高质量软件包：

```bash
# 安装 EPEL 仓库
sudo dnf install epel-release -y
```

#### ELRepo 仓库

ELRepo 专注于硬件相关的软件包，如内核、显卡驱动等：

```bash
# 安装 ELRepo 仓库
sudo rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
sudo dnf install https://www.elrepo.org/elrepo-release-8.el8.elrepo.noarch.rpm -y
```

#### Remi 仓库

Remi 仓库提供了最新版本的 PHP 和相关软件：

```bash
# 安装 Remi 仓库
sudo dnf install dnf-utils -y
sudo dnf install https://rpms.remirepo.net/enterprise/remi-release-8.rpm -y
```

## 源码编译安装

除了使用包管理器外，有时还需要从源码编译安装软件。

### 安装编译工具

```bash
# 安装开发工具组
sudo dnf groupinstall "Development Tools" -y

# 安装常用的开发库
sudo dnf install openssl-devel zlib-devel pcre-devel -y
```

### 源码编译安装步骤

1. **下载源码包**：

```bash
wget https://example.com/software-version.tar.gz
```

2. **解压源码包**：

```bash
tar -xzvf software-version.tar.gz
cd software-version
```

3. **配置**：

```bash
./configure --prefix=/usr/local/software --with-feature
```

4. **编译**：

```bash
make -j$(nproc)  # 使用所有可用的 CPU 核心
```

5. **安装**：

```bash
sudo make install
```

6. **配置环境变量**（可选）：

```bash
sudo vim /etc/profile.d/software.sh
```

添加以下内容：

```bash
export PATH=$PATH:/usr/local/software/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/software/lib
```

使环境变量生效：

```bash
source /etc/profile.d/software.sh
```

## 容器化软件安装

Docker 提供了另一种安装和运行软件的方式，特别适合开发和测试环境：

### 安装 Docker

```bash
# 安装 Docker 依赖
sudo dnf install dnf-utils device-mapper-persistent-data lvm2 -y

# 添加 Docker 仓库
sudo dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo

# 安装 Docker CE
sudo dnf install docker-ce docker-ce-cli containerd.io -y

# 启动 Docker 服务
sudo systemctl start docker

# 设置 Docker 开机自启
sudo systemctl enable docker

# 验证 Docker 安装
sudo docker run hello-world
```

### 使用 Docker 安装软件

```bash
# 拉取软件镜像
sudo docker pull nginx

# 运行容器
sudo docker run -d -p 80:80 --name nginx-server nginx

# 列出运行中的容器
sudo docker ps
```

## 软件包管理最佳实践

1. **优先使用官方仓库**：官方仓库中的软件包经过测试，与系统兼容性更好
2. **定期更新系统**：`sudo dnf update` 可以确保系统安全和稳定
3. **保持系统清洁**：使用 `sudo dnf autoremove` 清理不再需要的依赖
4. **谨慎添加第三方仓库**：第三方仓库可能导致软件包冲突
5. **备份配置文件**：在升级重要软件前备份配置文件
6. **使用 DNF 历史**：了解系统上的软件包变更历史
7. **验证软件包签名**：确保软件包的完整性和来源

## 常见问题与解决方案

### 依赖冲突

- **问题**：安装软件包时出现依赖冲突
- **解决方案**：
  - 尝试使用 `--best` 或 `--allowerasing` 选项：`sudo dnf install package --allowerasing`
  - 检查是否有冲突的仓库，暂时禁用它们：`sudo dnf --disablerepo=problematic-repo install package`
  - 查找并删除冲突的软件包：`sudo dnf remove conflicting-package`

### 仓库不可用

- **问题**：无法访问软件仓库
- **解决方案**：
  - 检查网络连接：`ping mirror.rockylinux.org`
  - 清理缓存：`sudo dnf clean all`
  - 尝试使用不同的镜像：编辑仓库配置文件中的 baseurl
  - 暂时禁用有问题的仓库：`sudo dnf --disablerepo=problematic-repo update`

### GPG 密钥错误

- **问题**：安装软件包时出现 GPG 密钥错误
- **解决方案**：
  - 导入正确的 GPG 密钥：`sudo rpm --import key-url`
  - 临时禁用 GPG 检查（不推荐）：`sudo dnf install package --nogpgcheck`

### 软件包无法找到

- **问题**：无法找到需要的软件包
- **解决方案**：
  - 检查软件包名称是否正确：`sudo dnf search keyword`
  - 确保已启用包含该软件包的仓库：`sudo dnf repolist`
  - 考虑添加提供该软件包的第三方仓库
  - 如果官方仓库中没有，尝试从源码编译安装

## 总结

本教程详细介绍了 Rocky Linux 中的软件包管理系统，包括：

- DNF 包管理器的基本和高级使用方法
- RPM 包管理工具的使用
- 软件仓库的管理，包括添加、启用和禁用仓库
- 常用的第三方软件仓库
- 从源码编译安装软件
- 使用 Docker 容器化安装软件
- 软件包管理的最佳实践和常见问题排查

掌握这些软件包管理技能，您可以轻松地在 Rocky Linux 系统中安装、更新和管理软件，保持系统的安全和稳定。在实际应用中，根据软件的重要性和来源，选择合适的安装方法，确保系统的安全性和稳定性。
