三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

别再傻傻在线装了!手把手教你用DNF把RPM包和依赖都下载到本地(Fedora/CentOS/RHEL通用)

别再傻傻在线装了!手把手教你用DNF把RPM包和依赖都下载到本地(Fedora/CentOS/RHEL通用)

离线环境下的RPM包管理实战:DNF高效下载与本地仓库搭建指南

在服务器运维和批量部署的实际工作中,稳定可靠的软件包管理往往比单纯的技术炫技更为重要。想象这样一个场景:你正负责部署一个关键业务系统到客户的内网环境,却发现目标服务器完全隔离于互联网;或是需要在数十台配置相同的机器上部署同一套软件栈,而每台都从公网下载不仅效率低下,还可能因网络波动导致安装失败。这些正是离线包管理技术大显身手的时刻。

传统在线安装方式在复杂企业环境中暴露出明显短板:依赖网络稳定性、重复下载浪费带宽、难以保证多节点版本一致性。而通过DNF/YUM将软件包及其依赖完整下载到本地,不仅能规避网络依赖风险,还能实现:

  • 内网环境快速部署:一次下载,多次复用
  • 版本精确控制:避免因仓库更新导致的意外版本变更
  • 批量安装效率提升:节省90%以上的网络传输时间
  • 安装过程可审计:所有安装包均可预先校验

本文将深入解析Fedora/CentOS/RHEL系统下的三种主流离线下载方案,特别聚焦DNF在现代化发行版中的最佳实践,最终带你完成从单包下载自建本地仓库的全流程实战。

1. 离线下载方案全景对比

在Red Hat系Linux发行版中,实现RPM包离线下载主要有三种技术路径,各自适用于不同版本环境和需求场景。我们先通过对比表格建立全局认知:

工具名称适用发行版核心功能特点典型使用场景
yum-downloadonlyCentOS 6/RHEL 6需额外插件,基础下载功能老旧系统维护
yumdownloaderCentOS 7/RHEL 7来自yum-utils,支持依赖解析中等规模离线部署
dnf downloadFedora 22+/CentOS 8+/RHEL 8+原生支持,参数简洁,依赖处理完善现代系统批量部署、本地仓库构建

1.1 yum-downloadonly的经典之道

作为最传统的离线下载方案,yum-downloadonly插件在CentOS 6时代广为使用。其安装与基础使用流程如下:

# 安装插件(CentOS 6/RHEL 6) yum install yum-plugin-downloadonly # 下载单个包(不自动解决依赖) yum install --downloadonly --downloaddir=/path/to/save httpd # 下载包及其所有依赖 yum install --downloadonly --downloaddir=/path/to/save --resolve httpd

关键注意事项:

  • 默认下载目录为/var/cache/yum
  • 必须使用install子命令而非download
  • 在较新发行版中可能已被标记为废弃

1.2 yumdownloader的轻量替代

随着yum-utils工具集的普及,yumdownloader因其更直观的语法逐渐成为CentOS 7时代的首选:

# 安装工具集 yum install yum-utils # 基础下载(当前目录) yumdownloader httpd # 指定目录下载并解析依赖 yumdownloader --destdir=/opt/packages --resolve httpd

实际项目中,我们常结合createrepo工具快速建立本地仓库:

# 创建仓库元数据 createrepo /opt/packages # 添加本地仓库配置 cat > /etc/yum.repos.d/local.repo <<EOF [local] name=Local Repository baseurl=file:///opt/packages enabled=1 gpgcheck=0 EOF

1.3 DNF的现代解决方案

在Fedora 22及之后的版本中,DNF作为YUM的下一代替代品,提供了更简洁高效的download子命令:

# 下载单个包 dnf download httpd # 递归下载所有依赖(推荐) dnf download --resolve httpd # 指定下载目录 dnf download --resolve --destdir=/opt/packages httpd

DNF方案的核心优势在于:

  1. 依赖解析更智能:自动处理复杂依赖树
  2. 下载速度更快:采用并行下载技术
  3. 存储效率更高:自动去重相同依赖包

2. DNF高级下载技巧实战

掌握了基础命令后,让我们深入DNF在实际生产环境中的高阶应用技巧。这些经验来自数十次企业级部署的实战检验。

2.1 批量下载软件组

系统管理员经常需要部署完整的软件环境(如开发工具集、监控系统等),此时可结合group命令实现批量下载:

# 列出可用软件组 dnf group list # 下载"Development Tools"组及其所有依赖 dnf group download --resolve --destdir=/opt/packages "Development Tools"

典型下载目录结构建议:

/opt/packages/ ├── base/ # 基础系统包 ├── development/ # 开发工具组 ├── monitoring/ # 监控组件 └── utils/ # 实用工具

2.2 版本锁定与降级下载

生产环境中经常需要精确控制软件版本,DNF可通过版本号锁定实现:

# 查看可用版本 dnf list --available httpd # 下载特定版本 dnf download --resolve --destdir=/opt/packages httpd-2.4.51-1.el8

当需要为已安装的旧系统准备补丁包时,--releasever参数非常实用:

# 下载适用于CentOS 7.9的包 dnf download --releasever=7.9 --resolve httpd

2.3 离线下载的完整工作流

一个健壮的离线包管理流程应包含以下环节:

  1. 环境准备

    # 创建下载目录 mkdir -p /opt/packages/{base,extra} # 安装必要工具 dnf install createrepo_c dnf-utils
  2. 核心包下载

    # 下载基础系统包 dnf download --resolve --destdir=/opt/packages/base \ @core @minimal-environment openssh-server
  3. 创建仓库元数据

    createrepo_c /opt/packages/base
  4. 生成仓库配置文件

    cat > /etc/yum.repos.d/offline.repo <<EOF [offline-base] name=Offline Base Repository baseurl=file:///opt/packages/base enabled=1 gpgcheck=0 EOF
  5. 验证安装

    dnf --repo=offline-base install httpd

3. 本地仓库构建与管理

将零散的RPM包转化为规范的本地仓库,是提升离线部署效率的关键步骤。下面介绍两种不同规模的解决方案。

3.1 基础本地仓库配置

对于小型环境,使用createrepo_c工具即可快速建立仓库:

# 安装工具 dnf install createrepo_c # 生成仓库元数据 createrepo_c /opt/packages # 自动检查仓库完整性 repoclosure --repo=local --pkg=/opt/packages

对应的仓库配置文件示例:

[local] name=Local Packages baseurl=file:///opt/packages enabled=1 gpgcheck=0 priority=1

3.2 企业级仓库镜像方案

对于需要维护多版本、多架构的大型环境,建议采用分层仓库结构:

/var/repos/ ├── centos8/ │ ├── BaseOS/ │ ├── AppStream/ │ └── Updates/ ├── epel/ └── custom/ ├── utils/ └── monitoring/

使用reposync实现远程仓库完整镜像:

# 镜像整个AppStream仓库 dnf reposync --repoid=AppStream --download-path=/var/repos/centos8 # 定期更新(可加入cron) dnf reposync --repoid=AppStream --download-path=/var/repos/centos8 --newest-only

配合mod_yum模块可实现HTTP访问:

# Apache配置示例 Alias /repos /var/repos <Directory "/var/repos"> Options Indexes FollowSymLinks Require all granted </Directory>

4. 常见问题诊断与优化

即使经验丰富的管理员也会遇到离线包管理的问题,以下是经过验证的解决方案。

4.1 依赖解析失败处理

当遇到依赖错误时,可尝试以下排查步骤:

  1. 检查仓库配置

    dnf repolist --verbose
  2. 手动解析依赖树

    dnf repoquery --requires --resolve <package>
  3. 下载缺失依赖

    dnf download --alldeps --destdir=/tmp <missing-package>

4.2 空间优化技巧

长期维护的本地仓库可能占用大量空间,这些策略可有效控制体积:

  • 定期清理旧版本

    dnf repository-packages local remove-without-deps $(dnf repoquery --repo=local --unneeded)
  • 使用硬链接节省空间

    cp -rl /var/cache/dnf/packages/ /opt/packages/
  • 启用delta RPM

    [main] deltarpm=1

4.3 安全加固建议

离线环境同样需要关注软件安全:

  1. GPG签名验证

    rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
  2. 仓库签名检查

    [local] gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-local
  3. 定期漏洞扫描

    dnf updateinfo list cves

在完成所有下载和仓库构建后,建议进行端到端测试:在一台干净的环境中,仅配置本地仓库源,尝试完成典型软件的安装过程。这能验证所有依赖是否完整,仓库配置是否正确。

← 返回列表