# 使用 dnf 管理软件包

URL: https://caijiao.org/rockylinux/dnf-package-manager
Source: docs/rockylinux/dnf-package-manager.md
Description: 详细介绍 Rocky Linux 中 dnf 包管理器的使用方法，包括安装、更新、删除软件包等操作

在 Rocky Linux 中，软件包管理是系统管理的重要组成部分。本文将详细介绍如何使用 `dnf`（Dandified YUM）包管理器来管理系统中的软件包，包括安装、更新、删除软件包以及管理软件仓库等操作。

## 什么是 dnf？

`dnf` 是 Rocky Linux（以及其他 RHEL 系列发行版）中默认的包管理器，它是 `yum`（Yellowdog Updater Modified）的继任者。`dnf` 提供了更快的性能、更好的依赖解析能力和更多的功能，同时保持了与 `yum` 兼容的命令行接口。

## dnf 的基本操作

### 1. 安装软件包

```bash
# 安装单个软件包
sudo dnf install package_name

# 安装多个软件包
sudo dnf install package1 package2 package3

# 安装特定版本的软件包
sudo dnf install package_name-version

# 自动回答 yes
sudo dnf install -y package_name
```

### 2. 更新软件包

```bash
# 更新单个软件包
sudo dnf update package_name

# 更新所有软件包
sudo dnf update

# 检查可更新的软件包（不执行更新）
dnf check-update
```

### 3. 删除软件包

```bash
# 删除软件包，但保留配置文件
sudo dnf remove package_name

# 删除软件包及其依赖（谨慎使用）
sudo dnf autoremove package_name

# 删除软件包及其配置文件
sudo dnf erase package_name  # 与 remove 效果相同
```

### 4. 搜索软件包

```bash
# 搜索软件包
dnf search keyword

# 搜索提供特定功能的软件包
dnf provides feature_name

# 搜索文件属于哪个软件包
dnf provides /path/to/file
```

### 5. 查看软件包信息

```bash
# 查看软件包详情
dnf info package_name

# 列出已安装的所有软件包
dnf list installed

# 列出所有可用的软件包
dnf list available

# 列出所有软件包（已安装和可用）
dnf list all
```

### 6. 管理软件包组

```bash
# 列出所有软件包组
dnf group list

# 安装软件包组
sudo dnf group install "Group Name"

# 移除软件包组
sudo dnf group remove "Group Name"

# 查看软件包组详情
dnf group info "Group Name"
```

## 软件仓库管理

### 1. 查看已启用的仓库

```bash
# 列出所有已启用的仓库
dnf repolist

# 列出所有仓库（包括禁用的）
dnf repolist all
```

### 2. 启用和禁用仓库

```bash
# 启用仓库
sudo dnf config-manager --set-enabled repository_name

# 禁用仓库
sudo dnf config-manager --set-disabled repository_name
```

### 3. 添加新仓库

```bash
# 添加仓库（通过 URL）
sudo dnf config-manager --add-repo repository_url

# 添加 EPEL 仓库示例
sudo dnf install epel-release -y
```

### 4. 清理缓存

```bash
# 清理所有缓存
sudo dnf clean all

# 重建缓存
sudo dnf makecache
```

## dnf 的高级功能

### 1. 软件包历史

```bash
# 查看软件包事务历史
dnf history

# 查看特定事务的详细信息
dnf history info transaction_id

# 撤销特定事务
sudo dnf history undo transaction_id

# 重做特定事务
sudo dnf history redo transaction_id
```

### 2. 模块管理（在 Rocky Linux 8+ 中）

```bash
# 列出所有可用模块
dnf module list

# 查看模块详情
dnf module info module_name

# 启用模块
sudo dnf module enable module_name:stream

# 安装模块
sudo dnf module install module_name:stream/profile

# 禁用模块
sudo dnf module disable module_name
```

### 3. 依赖关系管理

```bash
# 查看软件包的依赖
dnf repoquery --requires package_name

# 查看哪些软件包依赖于特定软件包
dnf repoquery --whatrequires package_name

# 查看软件包提供的功能
dnf repoquery --provides package_name
```

### 4. 下载软件包而不安装

```bash
# 下载软件包到当前目录
sudo dnf download package_name

# 下载软件包及其依赖
sudo dnf download --resolve package_name
```

## 常见的软件仓库

在 Rocky Linux 中，以下是一些常用的软件仓库：

### 官方仓库

- **BaseOS**：提供核心操作系统组件
- **AppStream**：提供应用程序流、运行时和数据库等
- **PowerTools**：提供构建依赖项和开发工具

### 第三方仓库

- **EPEL (Extra Packages for Enterprise Linux)**：提供额外的企业级软件包
- **RPM Fusion**：提供开源和非开源软件
- **ELRepo**：提供硬件相关的软件包，如内核驱动程序

## 配置 dnf

### dnf 配置文件

主要配置文件位于 `/etc/dnf/dnf.conf`，您可以根据需要修改此文件：

```bash
sudo vim /etc/dnf/dnf.conf
```

常用配置选项：

```ini
[main]
cachedir=/var/cache/dnf
keepcache=1  # 保留缓存，设为 0 则自动清除
debuglevel=2
logfile=/var/log/dnf.log
exactarch=1
obsoletes=1
gpgcheck=1  # 检查 GPG 签名
enabled=1
installonly_limit=3  # 保留的内核版本数量
best=True
skip_if_unavailable=False
deltarpm=0  # 如果带宽有限，可以启用增量 RPM
timeout=300  # 超时时间（秒）
metadata_expire=6h  # 元数据过期时间
defaultyes=True  # 默认回答 yes
```

### 仓库配置文件

每个仓库都有自己的配置文件，位于 `/etc/yum.repos.d/` 目录：

```bash
ls -l /etc/yum.repos.d/
```

## dnf 插件

dnf 支持插件扩展功能，常用的插件包括：

### 安装插件

```bash
# 安装 dnf 插件
sudo dnf install dnf-plugins-core -y
```

### 常用插件

- **fastestmirror**：自动选择最快的镜像
- **changelog**：显示软件包更新日志
- **download**：下载软件包而不安装
- **needs-restarting**：检查哪些服务需要重启

### 使用插件示例

```bash
# 检查需要重启的服务
sudo needs-restarting -r

# 查看软件包更新日志
dnf changelog package_name
```

## 实用的 dnf 命令组合

### 1. 系统维护命令

```bash
# 全面更新系统
sudo dnf update -y

# 删除不需要的依赖
sudo dnf autoremove

# 清理缓存
sudo dnf clean all

# 重建缓存
sudo dnf makecache
```

### 2. 查找和安装特定功能的软件包

```bash
# 查找并安装 Web 服务器
dnf search web server
sudo dnf install httpd -y

# 查找并安装开发工具
dnf group list | grep Development
sudo dnf group install "Development Tools" -y
```

### 3. 解决依赖问题

```bash
# 检查冲突
sudo dnf check

# 强制安装特定版本
sudo dnf install package_name-version --allowerasing
```

## 常见问题与解决方案

### 1. 无法找到软件包

- **问题**：`No match for argument: package_name`
- **解决方案**：
  - 检查软件包名称是否正确
  - 启用包含该软件包的仓库
  - 运行 `sudo dnf makecache` 刷新缓存

### 2. 依赖冲突

- **问题**：`Error: Transaction check error`
- **解决方案**：
  - 使用 `--allowerasing` 选项允许替换冲突的软件包
  - 尝试安装特定版本的软件包
  - 检查是否有第三方仓库导致冲突

### 3. GPG 签名验证失败

- **问题**：`GPG key retrieval failed` 或 `Public key for package.rpm is not installed`
- **解决方案**：
  - 导入缺失的 GPG 密钥
  - 临时禁用 GPG 检查（不推荐，仅作为临时解决方案）：`sudo dnf install package_name --nogpgcheck`

### 4. 网络问题

- **问题**：无法连接到仓库
- **解决方案**：
  - 检查网络连接
  - 尝试使用不同的镜像
  - 修改 `timeout` 设置

## 总结

`dnf` 是 Rocky Linux 中强大而灵活的包管理工具，通过本文介绍的命令和技巧，您应该能够有效地管理系统中的软件包。从基本的安装、更新和删除操作，到更高级的仓库管理和依赖解析，`dnf` 提供了全面的功能来满足您的软件管理需求。

定期使用 `dnf` 来更新您的系统，安装必要的软件包，以及管理您的软件仓库，这将帮助您保持系统的安全性和功能性。
