YUM(Yellowdog Updater Modified)是 CentOS 系统中常用的软件包管理工具,能够自动处理 RPM 软件包之间的依赖关系。不过,在服务器处于内网、隔离网络或完全没有互联网连接的情况下,直接执行 yum install 往往无法正常获取软件包。这时可以通过准备离线 RPM 仓库,再利用 YUM 完成安装。
离线安装的核心并不是简单地把几个 RPM 文件复制到目标服务器,而是要同时解决软件包来源、依赖关系、仓库元数据以及系统版本匹配等问题。搭建本地 YUM 仓库后,目标机器仍然可以使用熟悉的 yum install、yum update 等命令完成软件管理。
一、CentOS YUM离线安装的基本原理
联网环境下,YUM通常从远程仓库获取软件包及仓库元数据。例如执行:
Bashyum install httpd
YUM会根据当前系统版本和仓库配置查找 httpd,同时分析它依赖的其他 RPM 软件包,然后下载并安装完整的依赖链。
离线环境没有网络访问条件,因此需要提前准备一个“离线软件源”。
完整流程通常可以分为:
联网机器 ↓ 下载目标软件及全部依赖 ↓ 创建本地YUM仓库 ↓ 复制RPM及仓库元数据 ↓ 移动存储介质/内网传输 ↓ 离线CentOS服务器 ↓ 配置本地repo ↓ yum install 软件包
这种方式最大的优势是,安装过程依然由 YUM 管理,而不是手工执行大量 rpm -ivh 命令。
二、离线安装前需要确认的环境
准备离线安装包之前,首先要确认目标服务器的操作系统环境。
可以执行:
Bashcat /etc/centos-release
或者:
Bashcat /etc/os-release
同时确认 CPU 架构:
Bashuname -m
常见结果包括:
x86_64 aarch64
还需要确认系统中的 RPM 数据库和 YUM 版本:
Bashrpm --version yum --version
这些信息非常重要。
例如,在 CentOS 7 x86_64 环境准备的软件包,不能简单地认为一定可以直接用于 CentOS 8。不同 CentOS 大版本之间的系统库、RPM 依赖以及仓库结构可能存在明显差异。
因此,离线软件包最好遵循:
操作系统大版本一致 + CPU架构一致 + 软件包来源可靠。
三、最推荐的方式:使用联网CentOS机器准备RPM
准备离线 YUM 仓库时,最好使用一台与目标服务器环境尽可能一致的联网机器。
例如目标服务器为:
CentOS 7 x86_64
那么准备机器也尽量使用相同版本和架构。
先确认当前启用的 YUM 仓库:
Bashyum repolist
然后可以直接下载指定软件包。
方法一:使用yumdownloader下载
如果系统中没有 yumdownloader,可以先安装相关工具:
Bashyum install -y yum-utils
随后执行:
Bashyumdownloader --resolve nginx
--resolve 参数会尝试将目标软件包需要的依赖一并下载。
例如:
Bashmkdir -p /tmp/nginx-rpms cd /tmp/nginx-rpms yumdownloader --resolve nginx
执行完成后,可以看到多个 RPM 文件:
nginx-xxx.rpm pcre-xxx.rpm openssl-xxx.rpm ...
具体依赖数量取决于软件包以及当前系统环境。
这种方法比较适合只需要离线安装某一个软件或一组软件的场景。
四、使用downloadonly方式准备离线软件包
另一种常见方法是使用 YUM 的下载插件。
例如:
Bashyum install -y yum-plugin-downloadonly
某些环境中插件名称或功能会有所不同,也可以直接使用 yumdownloader。
使用下载方式时,应注意不要把“下载软件包”和“安装软件包”混为一谈。离线准备阶段的目标是把 RPM 以及所需依赖完整保存下来。
例如可以建立专门目录:
Bashmkdir -p /opt/offline-rpms
然后将下载得到的 RPM 集中保存。
建议不要把 RPM 文件散落在多个目录中,否则后续制作本地仓库时容易遗漏依赖。
五、创建本地YUM仓库
如果只是准备几个 RPM,也可以直接使用 rpm -ivh 安装,但当软件存在多个依赖时,更推荐创建本地 YUM 仓库。
首先安装 createrepo:
Bashyum install -y createrepo
建立仓库目录:
Bashmkdir -p /opt/local-repo
将准备好的 RPM 文件复制进去:
Bashcp /tmp/nginx-rpms/*.rpm /opt/local-repo/
执行:
Bashcreaterepo /opt/local-repo
完成后通常会出现:
/opt/local-repo/repodata/
其中保存的是 YUM 仓库所需要的元数据。
可以查看:
Bashls /opt/local-repo/repodata/
如果能够看到多个 XML、SQLite 或压缩元数据文件,说明仓库初始化基本完成。
六、将离线仓库复制到目标服务器
离线环境中,通常可以通过 U 盘、移动硬盘、光盘镜像或经过审批的内网传输方式,将整个仓库目录复制到目标服务器。
例如目标服务器准备使用:
/opt/local-repo
目录结构类似:
/opt/local-repo/ ├── nginx-xxx.rpm ├── pcre-xxx.rpm ├── openssl-xxx.rpm ├── ... └── repodata/
这里有一个非常容易犯的错误:
不要只复制 RPM 文件而遗漏 repodata 目录。
如果希望把这个目录作为标准 YUM 仓库使用,那么 RPM 软件包和仓库元数据都需要保留。
如果目标服务器上的 RPM 文件发生增加、删除或替换,需要重新生成或者更新仓库元数据。
七、配置本地YUM源
目标服务器上可以创建一个新的 repo 配置文件:
Bashvi /etc/yum.repos.d/local.repo
内容可以写成:
INI[local] name=Local YUM Repository baseurl=file:///opt/local-repo enabled=1 gpgcheck=0
其中:
-
name:仓库名称。 -
baseurl:本地仓库路径。 -
enabled=1:启用该仓库。 -
gpgcheck=0:不进行 RPM GPG 签名检查。
如果企业环境要求进行软件包签名校验,则不建议长期关闭 gpgcheck,而应该按照实际安全策略配置 GPG 公钥和签名验证。
八、清理YUM缓存并检查仓库
配置完成后,先清理缓存:
Bashyum clean all
然后重新生成缓存:
Bashyum makecache
检查仓库:
Bashyum repolist
如果能够看到类似:
repo id repo name local Local YUM Repository
说明本地仓库已经被 YUM 正确识别。
还可以查询软件包:
Bashyum list available
或者:
Bashyum list available | grep nginx
进一步确认目标软件是否已经进入本地仓库。
九、执行离线YUM安装
仓库配置正常之后,就可以直接使用 YUM:
Bashyum install nginx
YUM会从:
file:///opt/local-repo
读取软件包和依赖。
安装完成后检查:
Bashrpm -qa | grep nginx
如果软件提供服务,可以进一步检查:
Bashsystemctl status nginx
这样整个安装过程和联网环境下的 YUM 安装方式基本一致。
十、只允许使用本地离线仓库
在真正的隔离服务器上,建议明确关闭无关的远程仓库,避免 YUM 因为配置文件残留而尝试访问互联网。
查看仓库:
Bashyum repolist all
如果存在不需要的仓库,可以在对应 .repo 文件中设置:
INIenabled=0
也可以临时指定只使用本地仓库:
Bashyum --disablerepo="*" --enablerepo="local" install nginx
这种方式特别适合验证离线仓库是否完整。
如果依赖缺失,YUM 会明确提示无法找到对应软件包。此时就可以回到联网环境补充缺失 RPM,而不是让问题隐藏在多个仓库之间。
十一、使用ISO镜像制作完整离线YUM源
如果需要长期维护多台 CentOS 离线服务器,仅仅准备某一个软件的 RPM 并不理想。
更实用的方案是使用 CentOS 安装 ISO 作为基础软件仓库。
将 ISO 挂载到系统:
Bashmkdir -p /mnt/centos mount -o loop CentOS-*.iso /mnt/centos
查看内容:
Bashls /mnt/centos
如果系统包含完整的 RPM 仓库,就可以直接创建本地 repo 配置。
例如:
INI[centos-media] name=CentOS Installation Media baseurl=file:///mnt/centos enabled=1 gpgcheck=0
然后执行:
Bashyum clean all yum makecache
之后就可以尝试:
Bashyum install vim
这种方式适合安装 CentOS 基础软件。
如果需要安装额外软件,例如某些第三方组件,仅依赖系统 ISO 往往不够,还需要额外准备相应的 RPM 仓库。
十二、完整离线仓库的维护方式
当服务器数量较多时,建议把离线仓库按照用途分类,例如:
/opt/yum-repo/ ├── base/ ├── updates/ ├── extras/ └── packages/
每个仓库分别生成元数据。
例如:
Bashcreaterepo /opt/yum-repo/packages
repo 配置则可以分别定义:
INI[local-base] name=Local Base baseurl=file:///opt/yum-repo/base enabled=1 gpgcheck=0 [local-packages] name=Local Packages baseurl=file:///opt/yum-repo/packages enabled=1 gpgcheck=0
这样能够降低后期维护成本。
如果仓库中的 RPM 发生变化,可以根据实际情况更新元数据:
Bashcreaterepo --update /opt/yum-repo/packages
相比每次完全重建仓库,这种方式在软件包数量较多时更加方便。
十三、离线安装常见问题
1. 报错“Nothing to do”
例如:
No package nginx available. Error: Nothing to do
通常说明 YUM 没有在当前启用的仓库中找到对应软件包。
首先检查:
Bashyum repolist
然后:
Bashyum list available | grep nginx
同时检查 repo 文件中的:
INIbaseurl=file:///opt/local-repo
是否与实际目录一致。
2. 提示缺少依赖
例如:
Requires: xxx
说明准备的离线 RPM 不完整。
不要简单地只下载报错的一个 RPM,因为新依赖可能还会继续产生。更可靠的方式是在与目标服务器环境一致的联网机器上重新执行:
Bashyumdownloader --resolve 软件包名
然后将完整依赖集合重新生成仓库。
3. RPM包版本不匹配
如果出现类似:
requires glibc >= ...
或者:
nothing provides ...
需要检查软件包是否针对正确的 CentOS 版本构建。
重点检查:
Bashcat /etc/centos-release uname -m rpm -q glibc
不要为了强行安装而随意升级系统核心组件,否则可能导致大量系统软件出现兼容性问题。
4. 仓库元数据过期
如果新增 RPM 后 YUM仍然搜索不到,可能是 repodata 没有更新。
重新执行:
Bashcreaterepo --update /opt/local-repo
然后:
Bashyum clean all yum makecache
再次查询软件包。
5. GPG检查失败
如果看到类似:
Public key for xxx.rpm is not installed
说明当前仓库启用了 GPG 校验,但目标系统缺少对应公钥。
生产环境建议导入正确的官方或企业内部签名公钥,而不是简单关闭安全检查。
如果只是临时测试环境,可以根据安全要求配置:
INIgpgcheck=0
但不建议把这种做法作为长期生产环境方案。
十四、离线安装RPM与直接rpm安装有什么区别
直接执行:
Bashrpm -ivh package.rpm
最大的缺点是不会像 YUM 那样方便地自动解决完整依赖。
假设 A 依赖 B,B 又依赖 C,那么手工安装可能变成:
Bashrpm -ivh C.rpm rpm -ivh B.rpm rpm -ivh A.rpm
而本地 YUM 仓库可以直接执行:
Bashyum install A
由 YUM 根据仓库元数据分析依赖关系。
因此,对于简单的单 RPM 工具,rpm 可以满足需求;对于软件组件较多、依赖复杂或者需要长期维护的离线服务器,本地 YUM 仓库通常是更加规范的方案。
十五、生产环境中的安全与稳定性建议
离线 YUM 环境虽然没有直接连接互联网,但并不意味着可以忽略软件供应链安全。
首先,应尽可能使用可信来源的软件包,并记录 RPM 的版本、架构和来源。
可以使用:
Bashrpm -qpi package.rpm
查看 RPM 基本信息。
检查包文件:
Bashrpm -K package.rpm
还可以使用:
Bashrpm -V package-name
验证已安装文件的状态。
对于企业内部离线环境,可以建立统一的软件包仓库,由专门的联网环境负责下载、审核和同步 RPM,再通过受控介质将软件包送入隔离网络。
同时建议保存仓库清单,例如:
软件名称 软件版本 RPM版本 CPU架构 CentOS版本 依赖来源 校验信息 更新时间
这样出现安装问题时,可以快速定位软件包版本和依赖变化。
十六、推荐的标准离线安装流程
如果需要为一台全新 CentOS 服务器部署某个软件,可以按照下面的流程执行。
第一步,在目标服务器确认系统信息:
Bashcat /etc/centos-release uname -m
第二步,在匹配的联网环境准备 RPM:
Bashmkdir -p /tmp/offline-rpms cd /tmp/offline-rpms yumdownloader --resolve 软件包名
第三步创建仓库:
Bashmkdir -p /opt/local-repo cp /tmp/offline-rpms/*.rpm /opt/local-repo/ createrepo /opt/local-repo
第四步将整个目录转移到离线服务器。
第五步创建:
/etc/yum.repos.d/local.repo
配置:
INI[local] name=Local Offline Repository baseurl=file:///opt/local-repo enabled=1 gpgcheck=0
第六步刷新缓存:
Bashyum clean all yum makecache
第七步确认软件包:
Bashyum --disablerepo="*" --enablerepo="local" list available
第八步执行安装:
Bashyum --disablerepo="*" --enablerepo="local" install 软件包名
最后检查:
Bashrpm -qa | grep 软件包名
整个流程完成后,即使服务器完全没有互联网访问能力,也可以正常利用 YUM 进行软件包安装和依赖管理。
十七、CentOS离线YUM方案的选择建议
如果只安装一个简单软件,使用 yumdownloader --resolve 准备 RPM,然后创建一个小型本地仓库即可。
如果需要安装多个常用软件,建议建立统一的离线 RPM 仓库。
如果服务器数量较多,最好维护一套标准化的离线仓库目录,并统一软件包版本。
如果是全新系统部署,则可以优先考虑 CentOS 安装 ISO 作为基础仓库,再额外补充第三方软件包。
需要特别注意的是,CentOS不同版本的仓库不能随意混用。尤其是在系统生命周期、软件源可用性和第三方 RPM 兼容性发生变化的情况下,更应该提前规划离线仓库版本,而不是在生产服务器上临时拼接软件包。
通过“匹配系统环境 → 下载完整依赖 → 创建本地仓库 → 配置本地 repo → 验证仓库 → 使用 YUM 安装”的方式,可以把一次性的离线软件安装转变成可重复、可维护的部署流程。对于没有互联网访问权限的 CentOS 服务器而言,这也是处理 YUM 离线安装问题最实用的方案之一。