news 2026/6/12 0:22:02

DNF 离线下载:如何仅获取软件包及其依赖项,实现无网络安装

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DNF 离线下载:如何仅获取软件包及其依赖项,实现无网络安装

1. 为什么需要离线下载软件包

在日常的Linux系统管理中,我们经常会遇到这样的场景:生产环境的服务器出于安全考虑被隔离在内网,无法直接连接互联网;或者我们需要在多个环境部署相同的软件,但每个环境都重复下载依赖既耗时又浪费带宽。这时候,离线安装就显得尤为重要。

我管理过不少金融行业的服务器,这些机器通常都部署在严格隔离的网络环境中。记得有一次要给20台服务器部署监控系统,如果每台都联网安装,不仅效率低下,还会带来安全隐患。正是这种场景让我深刻体会到离线安装的价值。

DNF(Dandified YUM)作为新一代的RPM包管理器,相比传统的YUM有着更快的依赖解析速度和更简洁的命令语法。它能够智能地处理软件包之间的依赖关系,这正是我们实现离线安装的关键。通过DNF的--downloadonly参数,我们可以只下载软件包及其依赖项而不安装,这在以下场景特别有用:

  • 需要在多台无网络环境的机器上部署相同软件
  • 希望预先下载软件包以便后续快速安装
  • 需要将软件包及其依赖打包成离线安装介质
  • 网络带宽有限,希望集中下载后分发

2. 准备工作与环境检查

在开始离线下载之前,我们需要做一些准备工作。首先确认你的系统是否已经安装了DNF。大多数现代Linux发行版如Fedora、CentOS 8+、RHEL 8+都已经默认使用DNF替代了YUM。可以通过以下命令检查:

dnf --version

如果系统提示命令未找到,你可能需要先安装DNF。对于较老的系统,可能需要先启用EPEL仓库:

yum install epel-release yum install dnf

接下来,我们需要创建一个专门的目录来存放下载的软件包。我习惯在/opt下创建专门的目录,这样既不会干扰系统目录,也方便后续打包:

mkdir -p /opt/offline_packages chmod 755 /opt/offline_packages

在实际操作中,我发现很多人在下载前会忽略一个关键步骤:清理旧的缓存。DNF会缓存已下载的包,这可能导致我们无法获取最新版本。建议先执行:

dnf clean all

3. 使用DNF下载单个软件包

让我们从最基本的场景开始:下载单个软件包而不安装。假设我们需要下载nginx,命令非常简单:

dnf download nginx

这个命令会将nginx的RPM包下载到当前目录。但这里有个问题:它不会自动下载依赖项。在实际项目中,我遇到过不少因为漏掉依赖而导致安装失败的情况。

要下载主包及其所有依赖,我们需要使用--resolve参数:

dnf download --resolve nginx

这个命令会分析nginx的所有依赖关系,并把它们一并下载下来。在我的测试中,nginx在CentOS 8上大约有20个依赖包,这个命令能够一次性全部获取。

如果你想指定下载目录,可以结合--destdir参数:

dnf download --resolve --destdir=/opt/offline_packages nginx

下载完成后,建议检查一下获取的包是否完整:

ls -lh /opt/offline_packages | wc -l

4. 批量下载多个软件包及其依赖

在实际工作中,我们经常需要同时下载多个相关联的软件包。比如部署LAMP环境时,需要同时下载Apache、MySQL和PHP。DNF提供了几种方式来实现批量下载。

第一种方式是直接在命令中列出所有需要的包:

dnf download --resolve httpd mariadb-server php

但这种方法有个缺点:如果某个包下载失败,整个过程就会中断。在我的经验中,更可靠的做法是使用--downloadonly参数配合install命令:

dnf install --downloadonly --downloaddir=/opt/offline_packages httpd mariadb-server php

这个命令的优点是它会模拟完整的安装过程,确保所有依赖都能正确解析。我曾经用这个方法成功下载了包含87个包的复杂环境。

对于更复杂的场景,比如需要下载整个软件组(如"Development Tools"),可以使用:

dnf groupinstall --downloadonly --downloaddir=/opt/offline_packages "Development Tools"

5. 高级技巧与常见问题解决

在长期使用DNF离线下载的过程中,我积累了一些实用技巧。首先是版本锁定问题。有时候我们需要特定版本的软件包,可以通过以下方式指定:

dnf download --resolve --downloaddir=/opt/offline_packages nginx-1.20.1

另一个常见问题是依赖冲突。当系统中已经安装了某些软件的不同版本时,DNF可能会拒绝下载。这时可以尝试--allowerasing参数:

dnf download --resolve --allowerasing --downloaddir=/opt/offline_packages conflicting-package

对于需要从特定仓库下载的情况,可以使用--repo参数:

dnf download --resolve --repo=epel --downloaddir=/opt/offline_packages special-package

我遇到过最棘手的问题是依赖循环。A依赖B,B又依赖A。这种情况下,可以分步下载:

dnf download --downloaddir=/opt/offline_packages packageA dnf download --downloaddir=/opt/offline_packages packageB

6. 离线安装与验证

下载完所有需要的包后,接下来的关键步骤是离线安装。将/opt/offline_packages目录打包传输到目标机器:

tar czvf offline_packages.tar.gz -C /opt offline_packages

在目标机器上解压后,可以使用以下命令安装:

dnf install /opt/offline_packages/*.rpm

或者更推荐的方式是创建一个本地仓库:

createrepo /opt/offline_packages dnf config-manager --add-repo=file:///opt/offline_packages dnf install nginx

这种方法的好处是可以自动处理依赖关系,就像联网安装一样方便。我在一次跨数据中心部署中,用这个方法成功安装了50多台服务器的软件环境。

7. 最佳实践与经验分享

经过多次实战,我总结出一些DNF离线下载的最佳实践。首先是目录结构管理。我建议按项目或环境创建子目录:

/opt/offline_packages/ ├── web_servers │ ├── nginx │ └── apache └── databases ├── mysql └── postgresql

其次是元数据记录。每次下载后,我都会创建一个README文件记录下载的软件版本和日期:

echo "nginx 1.20.1 downloaded on $(date)" >> /opt/offline_packages/README

对于团队协作,我建议将下载的包纳入版本控制。虽然RPM文件是二进制文件,但可以用Git LFS管理:

git lfs track "*.rpm" git add . git commit -m "Added offline packages for nginx 1.20.1"

最后是定期更新。即使离线使用,软件也需要安全更新。我设置了一个每月检查更新的日历提醒,确保离线包不会过时。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/12 0:20:56

财务三表数据清洗与综合诊断模型构建实战教程

财务三表数据清洗与综合诊断模型构建实战教程 一、项目概述 1.1 项目背景 财务报表是企业的“体检报告”。利润表反映企业的盈利能力,资产负债表揭示企业的财务结构,现金流量表追踪企业的现金创造能力。然而,面对每年上百页的财报数据,如何系统化地清洗、整合三张报表数…

作者头像 李华
网站建设 2026/6/12 0:17:23

2026免费在线抠图工具推荐指南:保姆级教程与对比

想换个证件照底色却总抠不干净?头像扣得有黑边发丝毛躁?产品图想换背景却不知道从何下手?别急,今天就来手把手教你,用最简单的方法5分钟搞定任何抠图需求。这篇文章会对比市面上所有免费在线抠图工具,按照从…

作者头像 李华
网站建设 2026/6/12 0:15:26

【课程设计/毕业设计】基于移动端的二手图书资源循环利用平台设计基于国产系统的二手书城app【附源码、数据库、万字文档】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/6/12 0:11:56

DSP28335 CAN模块实战:从协议解析到代码驱动的工业通信

1. CAN2.0B协议与DSP28335的适配实战 第一次接触DSP28335的CAN模块时,我被它的灵活性惊艳到了。这款芯片内置的两个增强型CAN控制器完全兼容CAN2.0B协议,最高支持1Mbps的通信速率。在工业电机控制项目中,这种性能完全够用。 CAN2.0B协议最显著…

作者头像 李华
网站建设 2026/6/12 0:11:54

终极指南:36种Cherry MX键帽3D模型库与完整打印教程

终极指南:36种Cherry MX键帽3D模型库与完整打印教程 【免费下载链接】cherry-mx-keycaps 3D models of Chery MX keycaps 项目地址: https://gitcode.com/gh_mirrors/ch/cherry-mx-keycaps Cherry MX键帽是机械键盘爱好者的核心组件,但原厂键帽损…

作者头像 李华