CentOS系统下YUM离线安装的完整实现方案

2026-09-06 13:58:21 1 次阅读

YUM(Yellowdog Updater Modified)是 CentOS 系统中常用的软件包管理工具,能够自动处理 RPM 软件包之间的依赖关系。不过,在服务器处于内网、隔离网络或完全没有互联网连接的情况下,直接执行 yum install 往往无法正常获取软件包。这时可以通过准备离线 RPM 仓库,再利用 YUM 完成安装。

离线安装的核心并不是简单地把几个 RPM 文件复制到目标服务器,而是要同时解决软件包来源、依赖关系、仓库元数据以及系统版本匹配等问题。搭建本地 YUM 仓库后,目标机器仍然可以使用熟悉的 yum installyum update 等命令完成软件管理。

一、CentOS YUM离线安装的基本原理

联网环境下,YUM通常从远程仓库获取软件包及仓库元数据。例如执行:

Bash
yum install httpd

YUM会根据当前系统版本和仓库配置查找 httpd,同时分析它依赖的其他 RPM 软件包,然后下载并安装完整的依赖链。

离线环境没有网络访问条件,因此需要提前准备一个“离线软件源”。

完整流程通常可以分为:

联网机器
   ↓
下载目标软件及全部依赖
   ↓
创建本地YUM仓库
   ↓
复制RPM及仓库元数据
   ↓
移动存储介质/内网传输
   ↓
离线CentOS服务器
   ↓
配置本地repo
   ↓
yum install 软件包

这种方式最大的优势是,安装过程依然由 YUM 管理,而不是手工执行大量 rpm -ivh 命令。

二、离线安装前需要确认的环境

准备离线安装包之前,首先要确认目标服务器的操作系统环境。

可以执行:

Bash
cat /etc/centos-release

或者:

Bash
cat /etc/os-release

同时确认 CPU 架构:

Bash
uname -m

常见结果包括:

x86_64
aarch64

还需要确认系统中的 RPM 数据库和 YUM 版本:

Bash
rpm --version
yum --version

这些信息非常重要。

例如,在 CentOS 7 x86_64 环境准备的软件包,不能简单地认为一定可以直接用于 CentOS 8。不同 CentOS 大版本之间的系统库、RPM 依赖以及仓库结构可能存在明显差异。

因此,离线软件包最好遵循:

操作系统大版本一致 + CPU架构一致 + 软件包来源可靠。

三、最推荐的方式:使用联网CentOS机器准备RPM

准备离线 YUM 仓库时,最好使用一台与目标服务器环境尽可能一致的联网机器。

例如目标服务器为:

CentOS 7
x86_64

那么准备机器也尽量使用相同版本和架构。

先确认当前启用的 YUM 仓库:

Bash
yum repolist

然后可以直接下载指定软件包。

方法一:使用yumdownloader下载

如果系统中没有 yumdownloader,可以先安装相关工具:

Bash
yum install -y yum-utils

随后执行:

Bash
yumdownloader --resolve nginx

--resolve 参数会尝试将目标软件包需要的依赖一并下载。

例如:

Bash
mkdir -p /tmp/nginx-rpms
cd /tmp/nginx-rpms

yumdownloader --resolve nginx

执行完成后,可以看到多个 RPM 文件:

nginx-xxx.rpm
pcre-xxx.rpm
openssl-xxx.rpm
...

具体依赖数量取决于软件包以及当前系统环境。

这种方法比较适合只需要离线安装某一个软件或一组软件的场景。

四、使用downloadonly方式准备离线软件包

另一种常见方法是使用 YUM 的下载插件。

例如:

Bash
yum install -y yum-plugin-downloadonly

某些环境中插件名称或功能会有所不同,也可以直接使用 yumdownloader

使用下载方式时,应注意不要把“下载软件包”和“安装软件包”混为一谈。离线准备阶段的目标是把 RPM 以及所需依赖完整保存下来。

例如可以建立专门目录:

Bash
mkdir -p /opt/offline-rpms

然后将下载得到的 RPM 集中保存。

建议不要把 RPM 文件散落在多个目录中,否则后续制作本地仓库时容易遗漏依赖。

五、创建本地YUM仓库

如果只是准备几个 RPM,也可以直接使用 rpm -ivh 安装,但当软件存在多个依赖时,更推荐创建本地 YUM 仓库。

首先安装 createrepo

Bash
yum install -y createrepo

建立仓库目录:

Bash
mkdir -p /opt/local-repo

将准备好的 RPM 文件复制进去:

Bash
cp /tmp/nginx-rpms/*.rpm /opt/local-repo/

执行:

Bash
createrepo /opt/local-repo

完成后通常会出现:

/opt/local-repo/repodata/

其中保存的是 YUM 仓库所需要的元数据。

可以查看:

Bash
ls /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 配置文件:

Bash
vi /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缓存并检查仓库

配置完成后,先清理缓存:

Bash
yum clean all

然后重新生成缓存:

Bash
yum makecache

检查仓库:

Bash
yum repolist

如果能够看到类似:

repo id     repo name
local       Local YUM Repository

说明本地仓库已经被 YUM 正确识别。

还可以查询软件包:

Bash
yum list available

或者:

Bash
yum list available | grep nginx

进一步确认目标软件是否已经进入本地仓库。

九、执行离线YUM安装

仓库配置正常之后,就可以直接使用 YUM:

Bash
yum install nginx

YUM会从:

file:///opt/local-repo

读取软件包和依赖。

安装完成后检查:

Bash
rpm -qa | grep nginx

如果软件提供服务,可以进一步检查:

Bash
systemctl status nginx

这样整个安装过程和联网环境下的 YUM 安装方式基本一致。

十、只允许使用本地离线仓库

在真正的隔离服务器上,建议明确关闭无关的远程仓库,避免 YUM 因为配置文件残留而尝试访问互联网。

查看仓库:

Bash
yum repolist all

如果存在不需要的仓库,可以在对应 .repo 文件中设置:

INI
enabled=0

也可以临时指定只使用本地仓库:

Bash
yum --disablerepo="*" --enablerepo="local" install nginx

这种方式特别适合验证离线仓库是否完整。

如果依赖缺失,YUM 会明确提示无法找到对应软件包。此时就可以回到联网环境补充缺失 RPM,而不是让问题隐藏在多个仓库之间。

十一、使用ISO镜像制作完整离线YUM源

如果需要长期维护多台 CentOS 离线服务器,仅仅准备某一个软件的 RPM 并不理想。

更实用的方案是使用 CentOS 安装 ISO 作为基础软件仓库。

将 ISO 挂载到系统:

Bash
mkdir -p /mnt/centos
mount -o loop CentOS-*.iso /mnt/centos

查看内容:

Bash
ls /mnt/centos

如果系统包含完整的 RPM 仓库,就可以直接创建本地 repo 配置。

例如:

INI
[centos-media]
name=CentOS Installation Media
baseurl=file:///mnt/centos
enabled=1
gpgcheck=0

然后执行:

Bash
yum clean all
yum makecache

之后就可以尝试:

Bash
yum install vim

这种方式适合安装 CentOS 基础软件。

如果需要安装额外软件,例如某些第三方组件,仅依赖系统 ISO 往往不够,还需要额外准备相应的 RPM 仓库。

十二、完整离线仓库的维护方式

当服务器数量较多时,建议把离线仓库按照用途分类,例如:

/opt/yum-repo/
├── base/
├── updates/
├── extras/
└── packages/

每个仓库分别生成元数据。

例如:

Bash
createrepo /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 发生变化,可以根据实际情况更新元数据:

Bash
createrepo --update /opt/yum-repo/packages

相比每次完全重建仓库,这种方式在软件包数量较多时更加方便。

十三、离线安装常见问题

1. 报错“Nothing to do”

例如:

No package nginx available.
Error: Nothing to do

通常说明 YUM 没有在当前启用的仓库中找到对应软件包。

首先检查:

Bash
yum repolist

然后:

Bash
yum list available | grep nginx

同时检查 repo 文件中的:

INI
baseurl=file:///opt/local-repo

是否与实际目录一致。

2. 提示缺少依赖

例如:

Requires: xxx

说明准备的离线 RPM 不完整。

不要简单地只下载报错的一个 RPM,因为新依赖可能还会继续产生。更可靠的方式是在与目标服务器环境一致的联网机器上重新执行:

Bash
yumdownloader --resolve 软件包名

然后将完整依赖集合重新生成仓库。

3. RPM包版本不匹配

如果出现类似:

requires glibc >= ...

或者:

nothing provides ...

需要检查软件包是否针对正确的 CentOS 版本构建。

重点检查:

Bash
cat /etc/centos-release
uname -m
rpm -q glibc

不要为了强行安装而随意升级系统核心组件,否则可能导致大量系统软件出现兼容性问题。

4. 仓库元数据过期

如果新增 RPM 后 YUM仍然搜索不到,可能是 repodata 没有更新。

重新执行:

Bash
createrepo --update /opt/local-repo

然后:

Bash
yum clean all
yum makecache

再次查询软件包。

5. GPG检查失败

如果看到类似:

Public key for xxx.rpm is not installed

说明当前仓库启用了 GPG 校验,但目标系统缺少对应公钥。

生产环境建议导入正确的官方或企业内部签名公钥,而不是简单关闭安全检查。

如果只是临时测试环境,可以根据安全要求配置:

INI
gpgcheck=0

但不建议把这种做法作为长期生产环境方案。

十四、离线安装RPM与直接rpm安装有什么区别

直接执行:

Bash
rpm -ivh package.rpm

最大的缺点是不会像 YUM 那样方便地自动解决完整依赖。

假设 A 依赖 B,B 又依赖 C,那么手工安装可能变成:

Bash
rpm -ivh C.rpm
rpm -ivh B.rpm
rpm -ivh A.rpm

而本地 YUM 仓库可以直接执行:

Bash
yum install A

由 YUM 根据仓库元数据分析依赖关系。

因此,对于简单的单 RPM 工具,rpm 可以满足需求;对于软件组件较多、依赖复杂或者需要长期维护的离线服务器,本地 YUM 仓库通常是更加规范的方案

十五、生产环境中的安全与稳定性建议

离线 YUM 环境虽然没有直接连接互联网,但并不意味着可以忽略软件供应链安全。

首先,应尽可能使用可信来源的软件包,并记录 RPM 的版本、架构和来源。

可以使用:

Bash
rpm -qpi package.rpm

查看 RPM 基本信息。

检查包文件:

Bash
rpm -K package.rpm

还可以使用:

Bash
rpm -V package-name

验证已安装文件的状态。

对于企业内部离线环境,可以建立统一的软件包仓库,由专门的联网环境负责下载、审核和同步 RPM,再通过受控介质将软件包送入隔离网络。

同时建议保存仓库清单,例如:

软件名称
软件版本
RPM版本
CPU架构
CentOS版本
依赖来源
校验信息
更新时间

这样出现安装问题时,可以快速定位软件包版本和依赖变化。

十六、推荐的标准离线安装流程

如果需要为一台全新 CentOS 服务器部署某个软件,可以按照下面的流程执行。

第一步,在目标服务器确认系统信息:

Bash
cat /etc/centos-release
uname -m

第二步,在匹配的联网环境准备 RPM:

Bash
mkdir -p /tmp/offline-rpms
cd /tmp/offline-rpms
yumdownloader --resolve 软件包名

第三步创建仓库:

Bash
mkdir -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

第六步刷新缓存:

Bash
yum clean all
yum makecache

第七步确认软件包:

Bash
yum --disablerepo="*" --enablerepo="local" list available

第八步执行安装:

Bash
yum --disablerepo="*" --enablerepo="local" install 软件包名

最后检查:

Bash
rpm -qa | grep 软件包名

整个流程完成后,即使服务器完全没有互联网访问能力,也可以正常利用 YUM 进行软件包安装和依赖管理。

十七、CentOS离线YUM方案的选择建议

如果只安装一个简单软件,使用 yumdownloader --resolve 准备 RPM,然后创建一个小型本地仓库即可。

如果需要安装多个常用软件,建议建立统一的离线 RPM 仓库。

如果服务器数量较多,最好维护一套标准化的离线仓库目录,并统一软件包版本。

如果是全新系统部署,则可以优先考虑 CentOS 安装 ISO 作为基础仓库,再额外补充第三方软件包。

需要特别注意的是,CentOS不同版本的仓库不能随意混用。尤其是在系统生命周期、软件源可用性和第三方 RPM 兼容性发生变化的情况下,更应该提前规划离线仓库版本,而不是在生产服务器上临时拼接软件包。

通过“匹配系统环境 → 下载完整依赖 → 创建本地仓库 → 配置本地 repo → 验证仓库 → 使用 YUM 安装”的方式,可以把一次性的离线软件安装转变成可重复、可维护的部署流程。对于没有互联网访问权限的 CentOS 服务器而言,这也是处理 YUM 离线安装问题最实用的方案之一。