核心前提是必须在同版本、同架构的联网机器上用yumdownloader --resolve或dnf download --resolve一次性下载目标软件及其全部依赖层级,否则离线安装会因依赖缺失或版本不匹配而失败;下载后应检查目录含数十个.rpm文件,再通过createrepo建本地仓库并配置正确baseurl(如file:///tmp/offline_repo)实现批量标准化安装。

用 yumdownloader --resolve 或 dnf download --resolve 批量拉取 RPM 包
离线批量安装的核心前提是:把目标软件及其**全部依赖层级**一次性下载全,不能漏、不能错版本。CentOS/RHEL 7 用 yum,8+ 用 dnf,命令行为近似但参数细节不同。
常见错误是只下载主包(如 yumdownloader git),结果离线安装时报 Failed dependencies —— 因为没加 --resolve。
-
yumdownloader --resolve --destdir=/tmp/git-offline git(CentOS 7) -
dnf download --resolve --downloaddir=/tmp/git-offline git(RHEL 8+/Fedora) - 必须在**同版本、同架构**的联网机器上执行,否则依赖包版本不匹配(比如 RHEL 8.6 下载的包不能直接装到 8.4)
- 下载后检查目录:应有几十个
.rpm文件,包括git-、perl-Git-、openssh-clients-等,不是只有 1 个
用 createrepo 搭建本地 YUM 仓库再批量安装
单次装几个包可用 yum localinstall *.rpm,但批量部署几十台服务器时,反复拷贝一堆 .rpm 文件效率低、易出错。更稳的方式是做成本地仓库,让 yum install 像在线一样自动选包、解依赖。
容易踩的坑是忘记 createrepo 后没刷新元数据,或 repo 配置里 baseurl 路径写错(比如漏了 file:// 前缀)。
- 在离线机上运行:
createrepo /tmp/offline_repo(生成repodata/目录) - 配置
/etc/yum.repos.d/local.repo:[local] name=Local Offline Repo baseurl=file:///tmp/offline_repo enabled=1 gpgcheck=0
- 验证是否生效:
yum repolist应看到local仓库;yum list available git能查到包 - 之后所有安装都走标准流程:
yum install -y git nginx python3-pip
Ubuntu/Debian 用 apt-offline 实现等效批量操作
apt-get download 只下本体,apt-rdepends 又难控深度,真正适合批量的是 apt-offline —— 它把“生成依赖清单”和“下载”拆成两步,中间可人工审核,也支持多包打包。
典型翻车点:生成的 .zip 文件没传全(尤其含大量小文件时压缩失败)、离线机没装 apt-offline 本身(需提前手动装好 deb 包)。
- 联网机生成需求:
apt-offline set offline-install.zip --install-packages git nginx python3-pip - 把
offline-install.zip拷到离线机,执行:apt-offline install offline-install.zip - 如果离线机没
apt-offline,先手动装它的 deb:dpkg -i apt-offline_*.deb(从 官网或镜像站 下载) - 注意:
apt-offline不处理第三方源(如 NodeSource),这类包得单独处理
跨发行版批量部署时,别忽略 GPG 签名校验和架构一致性
批量离线安装最隐蔽的失败点不在依赖,而在签名和 CPU 架构。SUSE 默认校验 GPG,CentOS 8+ 默认启用 gpgcheck=1,而离线环境通常没导入对应 key;ARM 服务器上下载 x86_64 包则根本无法安装。
- 临时绕过签名检查(仅限可信内网):
yum install --nogpgcheck *.rpm或 repo 配置中设gpgcheck=0 - 长期方案:把发行版官方 GPG key 提前导出(如
rpm -q gpg-pubkey --dump),随包一起传过去,再用rpm --import导入 - 确认架构:
uname -m查目标机是x86_64还是aarch64,下载时指定--arch(DNF 支持,YUM 不支持) - 混合环境(如同时有 CentOS 和 Ubuntu)不要共用一套包,它们的依赖树、路径、服务管理机制完全不同











