ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

离线部署必备:如何使用 DNF 下载 RPM 包及其全部依赖

离线部署必备:如何使用 DNF 下载 RPM 包及其全部依赖 在实际运维开发中经常会遇到这样的场景生产环境处于内网无法连接外网多台机器需要安装同一个软件不想每台机器都重复占用带宽下载需要提前准备完整的软件安装包统一拷贝到离线环境安全合规要求安装介质必须先经过审核再进入生产环境。这时候我们就需要在一台可以联网的机器上把 RPM 包及其所有依赖提前下载好然后打包拷贝到离线环境中安装。如果你使用的是 Fedora、RHEL 8、CentOS Stream、Rocky Linux、AlmaLinux 等系统dnf就是完成这项工作的最佳工具之一。本文将详细介绍如何使用dnf及相关工具精准、完整地下载离线安装所需的 RPM 包和依赖包。一、核心方案使用dnf download插件dnf本身不一定默认提供“只下载不安装”的能力这个功能通常由dnf-plugins-core插件包提供。如果系统中还没有安装可以先执行sudo dnf install dnf-plugins-core1安装完成后就可以使用dnf download命令下载 RPM 包。二、只下载指定包不包含依赖如果你明确知道目标机器已经具备所有依赖只需要下载指定软件包本身可以使用sudo dnf download 包名1例如下载nginxsudo dnf download nginx1默认情况下RPM 包会下载到当前工作目录。这种方式适合以下场景目标机器已经安装了所有依赖只需要补充某一个缺失的软件包你已经明确确认不需要下载额外依赖。不过在离线部署中仅下载软件包本身通常是不够的。三、下载软件包及其依赖离线部署最常用的参数是--resolve。sudo dnf download --resolve 包名1例如sudo dnf download --resolve nginx1--resolve会自动解析软件包所需依赖并将依赖包一起下载下来。但这里有一个非常重要的注意点--resolve默认只会下载当前系统中尚未安装的依赖。也就是说如果你在一台已经安装过很多软件的联网机器上执行该命令有些依赖可能因为当前系统已经存在所以不会被下载。如果目标离线机器和当前联网机器环境完全一致这通常没有问题。但如果目标机器是纯净的 minimal 安装系统或者目标环境与当前环境不一致就可能出现依赖遗漏。四、下载软件包及所有依赖最稳妥方案为了尽可能避免依赖遗漏推荐加上--alldeps参数。sudo dnf download --resolve --alldeps 包名1例如下载nginx及其全部依赖sudo dnf download --resolve --alldeps nginx1这个命令会强制下载所有相关依赖即使某些依赖已经安装在当前系统中也会被下载下来。因此在制作完整离线安装包时最推荐使用sudo dnf download --resolve --alldeps 包名1这是离线部署 RPM 包时最稳妥的方式。五、指定下载目录默认下载到当前目录不太便于管理建议使用--destdir指定下载路径。需要注意目标目录需要提前存在。mkdir -p /tmp/nginx-offline sudo dnf download --resolve --alldeps --destdir/tmp/nginx-offline nginx12执行完成后/tmp/nginx-offline目录下就会包含nginx及其相关依赖的 RPM 文件。后续可以直接打包tar -czvf nginx-offline.tar.gz -C /tmp nginx-offline1然后将压缩包拷贝到离线服务器中安装。六、下载源码包 SRPM有时候我们需要下载源码包例如查看软件源代码重新编译 RPM修改 spec 文件分析补丁做安全审计。在 DNF 4 中可以使用sudo dnf download --source 包名1例如sudo dnf download --source nginx1在 DNF 5 中命令有所变化sudo dnf5 download --srpm 包名1例如sudo dnf5 download --srpm nginx1如果不确定当前系统使用的是哪个版本可以查看帮助dnf download --help1或dnf5 download --help1七、下载 Debuginfo 调试包在排查 Core Dump、程序崩溃或性能问题时可能需要 Debuginfo 包。可以使用sudo dnf download --debuginfo 包名1例如sudo dnf download --debuginfo nginx1Debuginfo 包通常来自专门的调试仓库。如果下载失败需要检查 debuginfo 仓库是否启用。查看当前仓库dnf repolist all1如果对应仓库没有启用需要根据发行版文档开启 debuginfo 源。八、备选方案使用yumdownloader如果你习惯 RHEL 7 / CentOS 7 时代的工具也可以使用yumdownloader。在新系统上可以通过yum-utils安装sudo dnf install yum-utils1下载软件包及依赖yumdownloader --resolve 包名1指定下载目录yumdownloader --resolve --destdir/tmp/pkgs 包名1例如mkdir -p /tmp/nginx-offline yumdownloader --resolve --destdir/tmp/nginx-offline nginx12不过需要注意yumdownloader --resolve同样通常只下载当前系统中未安装的依赖并不等价于dnf download --resolve --alldeps。如果需要完整下载所有依赖更推荐使用sudo dnf download --resolve --alldeps 包名1如果必须使用yumdownloader建议在一台纯净的容器或最小化系统中执行尽量避免因当前系统已安装依赖而导致遗漏。九、另一种方式install --downloadonly还有一种思路是让 DNF 模拟安装事务但只下载不安装。sudo dnf install --downloadonly --downloaddir/tmp/pkgs 包名1例如mkdir -p /tmp/nginx-offline sudo dnf install --downloadonly --downloaddir/tmp/nginx-offline nginx12这种方式的优点是会按照当前系统环境解析完整安装事务如果依赖无法满足会直接报错适合验证依赖是否完整。它的缺点是如果当前系统已经安装了该软件包或者当前系统已经是最新版本DNF 可能会提示“无需安装”从而不会下载 RPM 包。因此install --downloadonly更适合用于模拟安装和依赖验证不一定适合作为完整离线包制作方案。十、拿到 RPM 后如何离线安装将下载好的所有.rpm文件拷贝到离线机器的同一个目录中。假设目录为/opt/offline-pkgs1推荐使用dnf安装目录下所有 RPMsudo dnf install /opt/offline-pkgs/*.rpm1这种方式比直接使用rpm更推荐因为dnf会自动处理这些 RPM 包之间的依赖关系和安装顺序。不推荐直接使用sudo rpm -ivh /opt/offline-pkgs/*.rpm1原因是rpm本身不会自动解决依赖顺序容易出现依赖报错。十一、进阶实践制作本地 YUM/DNF 仓库如果你需要在多台离线机器上批量安装软件可以将 RPM 包目录制作成本地仓库。首先安装createrepo_csudo dnf install createrepo_c1在 RPM 包目录中生成仓库元数据createrepo_c /opt/offline-pkgs1然后创建本地 repo 文件sudo vi /etc/yum.repos.d/offline.repo1写入以下内容[offline-repo] nameOffline Repository baseurlfile:///opt/offline-pkgs enabled1 gpgcheck012345刷新缓存sudo dnf clean all sudo dnf makecache12之后就可以像使用在线仓库一样安装软件sudo dnf install nginx1这种方式适合多台服务器批量部署内网统一软件源管理长期维护离线环境标准化运维安装流程。十二、常用命令总结需求命令适用场景只下载包本身dnf download 包名已确认目标环境不缺依赖下载包和未安装依赖dnf download --resolve 包名目标环境与当前环境基本一致下载包和全部依赖dnf download --resolve --alldeps 包名离线部署推荐方案指定下载目录dnf download --destdir/path 包名规范管理离线包模拟安装并下载dnf install --downloadonly --downloaddir/path 包名验证安装事务下载源码包dnf download --source 包名获取 SRPM 源码包下载调试包dnf download --debuginfo 包名Core Dump 或调试分析使用 yumdownloaderyumdownloader --resolve 包名传统工具兼容场景十三、推荐离线部署流程以离线安装nginx为例可以按以下步骤操作。1. 在联网机器上安装插件sudo dnf install dnf-plugins-core12. 创建下载目录mkdir -p /tmp/nginx-offline13. 下载 nginx 及全部依赖sudo dnf download --resolve --alldeps --destdir/tmp/nginx-offline nginx14. 打包离线安装目录tar -czvf nginx-offline.tar.gz -C /tmp nginx-offline15. 拷贝到离线服务器可以通过 U 盘、内网跳板机、SCP、堡垒机或其他安全传输方式将压缩包拷贝到离线服务器。6. 在离线服务器上解压tar -xzvf nginx-offline.tar.gz -C /opt17. 安装 RPM 包sudo dnf install /opt/nginx-offline/*.rpm1至此离线安装完成。十四、实践建议为了减少离线安装失败的概率建议注意以下几点下载机器和目标机器系统版本尽量一致例如目标机器是 Rocky Linux 9就尽量在 Rocky Linux 9 的联网机器上下载。架构需要一致例如x86_64、aarch64不要混用。仓库配置需要一致如果目标环境使用的是特定版本仓库下载机器也应该启用相同仓库。优先使用--resolve --alldeps这是离线部署时最稳妥的依赖下载方式。批量部署建议制作本地仓库多台机器安装时使用createrepo_c创建本地源会更稳定、更易维护。结语在内网环境、生产环境或批量部署场景中提前下载 RPM 包及其全部依赖是一项非常实用的运维能力。对于 Fedora、RHEL 8、Rocky Linux、AlmaLinux 等系统推荐优先使用sudo dnf download --resolve --alldeps --destdir/tmp/offline-pkgs 包名1这条命令可以最大程度避免依赖遗漏是制作 RPM 离线安装包的核心方法。如果只是临时下载可以使用dnf download --resolve如果需要模拟安装事务可以使用dnf install --downloadonly如果需要长期维护离线环境则建议结合createrepo_c搭建本地仓库。掌握这些方法后再遇到内网服务器无法联网安装软件的问题就不需要手动一个个查找依赖包了。
返回列表