本文档详细说明如何使用 dnf命令下载 RPM 软件包及其依赖,以及在本地已存在自制 RPM 包的情况下,如何忽略特定依赖进行下载和安装。
第一部分:DNF 命令下载 RPM 及其依赖包
适用于 RHEL / CentOS 8+ / Rocky / Alma / Fedora 等系统。
1. 环境准备
确保系统已安装提供 dnf download命令的插件包:
sudo dnf install -y dnf-utils
# 或
sudo dnf install -y dnf-plugins-core
2. 下载方法一(推荐):dnf download --resolve
这是最直接、最常用的方式,直接从仓库下载指定的 RPM 及其依赖。
| 场景 | 命令示例 |
|---|---|
| 基本下载 | dnf download --resolve wget |
| 指定下载目录 | dnf download --resolve --destdir /tmp/rpms/ wget |
| 指定架构 | dnf download --resolve --arch x86_64 --destdir /tmp/rpms/ wget |
| 包含弱依赖(推荐包) | dnf download --resolve --alldeps --setopt=install_weak_deps=True wget |
说明 :执行后,所有 RPM 文件将保存在当前目录或
--destdir指定的目录中。
3. 下载方法二:dnf install --downloadonly
此方法模拟安装过程,将所需的所有 RPM 包下载到缓存目录。
bash
# 下载到默认缓存目录
sudo dnf install --downloadonly httpd
# 下载到指定目录
sudo dnf install --downloadonly --downloaddir=/tmp/rpms/ httpd
默认缓存路径:
/var/cache/dnf/<repo_name>-xxxx/packages/
4. 离线安装
将下载好的 RPM 包拷贝至目标离线机器,执行安装:
bash
dnf install ./*.rpm
# 或
dnf localinstall ./*.rpm
注意 :不建议使用
rpm -ivh *.rpm,因为它无法自动处理依赖关系。
第二部分:忽略依赖(本地已有自制 RPM 包)
当在本地已经构建了部分 RPM 包(例如定制化的库或组件),希望 DNF 在下载或安装时不处理这些特定的依赖,可采用以下方案。
方案 1(最推荐):构建本地仓库(Local Repository)
核心思想:不是强行忽略依赖,而是让 DNF 知道这些依赖已经由你的自制 RPM 满足了。
操作步骤
-
创建本地仓库目录并放入自制 RPM
bashmkdir -p /opt/local-rpms cp your-custom-package*.rpm /opt/local-rpms/ -
生成仓库元数据
createrepo_c /opt/local-rpms -
配置本地仓库文件
bashcat > /etc/yum.repos.d/local.repo << EOF [local] name=Local Custom RPMs baseurl=file:///opt/local-rpms enabled=1 gpgcheck=0 EOF -
刷新 DNF 缓存
dnf clean all dnf makecache
✅ 优点:
- 最符合 DNF/YUM 的设计理念。
- 依赖关系清晰,不会破坏系统稳定性。
- 便于后续的升级和维护。
方案 2:使用 --exclude排除依赖(下载阶段)
核心思想:在下载时明确告诉 DNF 跳过某些包。
bash
dnf download --resolve \
--exclude=conflicting-lib \
--exclude=another-unwanted-dep \
--destdir /tmp/rpms \
main-package
或者结合 install命令:
bash
sudo dnf install \
--downloadonly \
--downloaddir=/tmp/rpms \
--exclude=conflicting-lib \
main-package
⚠️ 注意:此方式仅跳过下载,如果目标环境中确实缺少这些依赖,安装阶段仍会失败。
方案 3:在 RPM Spec 中声明 Provides(高级/根本解决)
核心思想:让你的自制 RPM "冒充"系统依赖,从根本上解决依赖冲突。
在你的自制 RPM 的 .spec文件中添加 Provides字段:
Name: my-custom-lib
Version: 1.0
Release: 1%{?dist}
# 声明提供了某个 so 文件或虚拟包
Provides: libxxx.so.1()(64bit)
Provides: system-library-name = 2.0
这样,当其他软件依赖 libxxx.so.1或 system-library-name时,DNF 会自动识别为已满足,不再下载对应的系统包。
总结与建议
| 场景 | 推荐方案 |
|---|---|
| 单纯下载依赖 | dnf download --resolve |
| 离线环境部署 | 方案一(本地仓库)+ dnf install ./*.rpm |
| 自制 RPM 替代系统库 | 方案三(Spec Provides)结合方案一 |
| 临时跳过某些包下载 | 方案二(--exclude) |
最佳实践流程:
开发自制 RPM → 加入本地仓库 → 配置 dnf → 正常下载/安装