CentOS 7环境下利用yumdownloader高效导出离线软件包实战指南

张开发
2026/4/17 6:59:40 15 分钟阅读

分享文章

CentOS 7环境下利用yumdownloader高效导出离线软件包实战指南
1. 为什么需要离线软件包在CentOS 7的实际运维中我们经常会遇到内网环境无法连接外网的情况。这时候如果需要安装软件传统的yum在线安装方式就完全失效了。我曾经负责过一个银行系统的部署他们的生产环境完全隔离外网当时就遇到了软件包无法安装的棘手问题。离线软件包的优势很明显完全摆脱网络依赖在内网环境中也能自由安装可以预先准备好所有依赖包避免安装过程中的各种报错方便批量部署特别是在多台服务器需要相同环境时能够固化软件版本防止自动更新带来的兼容性问题2. yumdownloader工具简介yumdownloader是yum工具集中的一个实用程序专门用于下载RPM软件包而不安装它们。与直接使用wget或curl下载不同yumdownloader最大的优势是能自动处理依赖关系。我对比过几种下载方式直接浏览器下载需要手动查找仓库地址无法解决依赖wget下载同样需要知道确切URLreposync适合完整同步整个仓库yumdownloader简单直接最适合单个软件包下载安装yumdownloader非常简单yum install -y yum-utils这个命令会安装yum-utils工具包其中就包含我们需要的yumdownloader。3. 完整导出单个软件包实战让我们以常用的nginx软件为例演示完整的导出流程。3.1 查询已安装软件包首先确认软件包全名rpm -qa | grep nginx假设输出是nginx-1.20.1-9.el7.x86_643.2 下载软件包及依赖使用yumdownloader下载yumdownloader --resolve nginx-1.20.1-9.el7.x86_64这里有几个实用参数--resolve自动下载所有依赖包--destdir指定下载目录默认是当前目录--urls只显示下载URL而不实际下载3.3 验证下载结果下载完成后检查当前目录ls -lh *.rpm应该能看到nginx主包和它的各种依赖包比如openssl、pcre等。4. 批量导出系统所有已安装软件包有时候我们需要导出整个系统的软件环境这时候可以结合rpm和yumdownloader来实现。4.1 生成软件包列表先导出已安装软件包清单rpm -qa installed_packages.list4.2 批量下载脚本编写下载脚本#!/bin/bash mkdir -p /tmp/offline_packages while read pkg; do yumdownloader --resolve --destdir/tmp/offline_packages $pkg done installed_packages.list4.3 处理常见问题在实际操作中可能会遇到部分包提示找不到可能是来自第三方仓库需要先启用相应仓库依赖循环可以尝试--alldeps参数空间不足使用--destdir指定到大容量目录5. 离线安装的几种方式拿到离线包后有几种安装方式可以选择5.1 直接rpm安装rpm -ivh *.rpm但这种方式不会自动处理依赖关系容易出错。5.2 创建本地仓库更推荐的方式是创建本地仓库createrepo /path/to/offline_packages然后在/etc/yum.repos.d/下创建本地repo文件之后就可以用yum正常安装了。5.3 使用ansible批量部署在大规模部署时可以结合ansible- hosts: all tasks: - name: Copy RPM packages copy: src: /path/to/offline_packages/ dest: /tmp/packages/ - name: Install packages yum: name: * disable_gpg_check: yes disablerepo: * enablerepo: local6. 实用技巧与避坑指南在实际项目中我总结了这些经验版本一致性问题导出的软件包一定要与目标系统架构一致x86_64/i686依赖地狱遇到依赖问题时可以尝试repoquery --requires先检查依赖关系最小化原则只导出必要的软件包避免无谓的存储消耗签名验证在内网环境中可以考虑禁用GPG检查--nogpgcheck空间预估大型软件如MySQL可能需要几个GB的空间提前规划好一个典型的目录结构建议/offline_packages ├── nginx │ ├── nginx-1.20.1.rpm │ └── dependencies/ ├── python3 │ ├── python3-3.6.8.rpm │ └── dependencies/ └── createrepo-0.9.9.rpm7. 高级应用场景对于更复杂的需求还可以考虑7.1 导出特定仓库的软件包比如只从epel仓库下载yumdownloader --enablerepoepel --resolve ansible7.2 下载debuginfo包用于调试yumdownloader --resolve --debuginfo nginx7.3 结合Docker构建离线镜像可以创建一个包含所有离线包的Docker镜像FROM centos:7 COPY offline_packages /opt/packages RUN yum install -y createrepo \ createrepo /opt/packages \ echo [local] /etc/yum.repos.d/local.repo \ echo nameLocal Packages /etc/yum.repos.d/local.repo \ echo baseurlfile:///opt/packages /etc/yum.repos.d/local.repo \ echo enabled1 /etc/yum.repos.d/local.repo \ echo gpgcheck0 /etc/yum.repos.d/local.repo8. 常见问题排查遇到问题时可以这样排查找不到软件包确认仓库是否启用yum repolist尝试清除缓存yum clean all依赖不完整使用repoquery --tree-requires查看完整依赖树确保所有相关仓库都已启用版本冲突使用yum list available检查可用版本指定精确版本号下载空间不足使用df -h检查磁盘空间通过--destdir指定其他存储位置在内网环境中我通常会先在一台有外网访问权限的机器上测试完整的下载和安装流程确认无误后再迁移到内网环境。这样可以避免很多潜在问题。

更多文章