DNF 下载 RPM 依赖包及忽略特定依赖的方法

本文档详细说明如何使用 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 满足了。

操作步骤
  1. 创建本地仓库目录并放入自制 RPM

    bash 复制代码
    mkdir -p /opt/local-rpms 
    cp your-custom-package*.rpm /opt/local-rpms/
  2. 生成仓库元数据

    createrepo_c /opt/local-rpms

  3. 配置本地仓库文件

    bash 复制代码
    cat > /etc/yum.repos.d/local.repo << EOF
    
    [local] name=Local Custom RPMs 
    
    baseurl=file:///opt/local-rpms
    
    enabled=1
    
    gpgcheck=0 
    
    EOF
  4. 刷新 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.1system-library-name时,DNF 会自动识别为已满足,不再下载对应的系统包。


总结与建议

场景 推荐方案
单纯下载依赖 dnf download --resolve
离线环境部署 方案一(本地仓库)+ dnf install ./*.rpm
自制 RPM 替代系统库 方案三(Spec Provides)结合方案一
临时跳过某些包下载 方案二(--exclude

最佳实践流程

复制代码
开发自制 RPM → 加入本地仓库 → 配置 dnf → 正常下载/安装
相关推荐
之歆2 个月前
RPM 包管理完全指南
rpm
virtualzzf2 个月前
OpenEuler 20.03构建zabbix8.0 rpm包
zabbix·openeuler·rpm·linxu
tianyuanwo2 个月前
Mock构建中RPM仓库校验和不匹配:深度解析与系统化解决方案
yum·rpm·checksum
muyan92 个月前
统信uos-server-20-1070e-arm64-20250704-1310 安装mysql-5.7.44
linux·mysql·yum·rpm·uos·统信
baidu_huihui2 个月前
`sudo DNF` 是 Linux 系统中以管理员权限执行 DNF 包管理命令的标准方式
linux·dnf
Tipriest_3 个月前
Debian 系与 RPM 系常用软件包查询命令/信息/列出已安装包/模糊查找等命令
运维·debian·rpm
mzhan0173 个月前
perl: redhat9, perl-interpreter.rpm 一个包分成很多个小包
开发语言·perl·redhat·rpm
Tipriest_3 个月前
Yum包管理器详细介绍
yum·rpm·包管理器
Tipriest_3 个月前
Linux rpm 系和 debian 系发展史,相同,不同点详细介绍
linux·运维·debian·rpm