同步互联网YUM源到本地:解决ISO源包少的完整方案(这才是企业真正的使用场景)

同步互联网 YUM 源到本地:解决 ISO 源包少的完整方案

之前讲解了基于 ISO 镜像构建本地 YUM 源和 HTTP 网络源,但ISO镜像仅包含系统基础软件包(约 1000-2000 个),无法满足安装额外软件(如nginxPython3Docker等)的需求。通过同步互联网 YUM 源到本地,可将数万甚至数十万软件包 “本地化”,既避免依赖外部网络,又能获取丰富的软件资源。本文以CentOS 7.9为例,详细讲解实现从“有限ISO源” 到 “全量本地互联网源”的升级的完整过程,确保每一步操作准确可复现,内容有点长请慢慢看(太细了,男人不能太细!!,哈哈哈)。

一、核心原理与前提条件

1.1. 核心逻辑

  1. 同步工具:使用reposyncyum-utils包自带)工具,将互联网 YUM 源的软件包(.rpm)和元数据(repodata)完整下载到本地目录;

  2. 元数据生成:通过createrepo工具为同步的包生成 YUM 可识别的元数据(依赖关系、包索引等);

  3. 共享方式:沿用之前的 HTTP 服务(Apache/Nginx),将同步后的源目录暴露给局域网客户端,实现 “一次同步,多机共享”;

  4. 优势:相比直接使用互联网源,本地同步源可避免网络波动、节省带宽(多机复用),且支持离线使用。

1.2. 前提条件

  • 服务端
  1. 已安装 HTTP 服务(参考前文《基于 HTTP 构建 YUM 网络源》,确保httpd/nginx正常运行);
  2. 具备互联网访问能力(首次同步需下载软件包,后续可增量更新);
  3. 预留足够磁盘空间:CentOS 官方源(base+updates+extras)约 5-10GB,EPEL 扩展源约 15-20GB,建议预留 30GB 以上(视同步源数量调整);
  4. 安装必备工具:yum-utils(含reposync)、createrepo(生成元数据)。
  • 客户端:局域网内可访问服务端 IP,无需互联网(后续通过本地同步源安装软件)。

二、步骤 1:服务端安装同步与元数据工具

首先得有系统官方基础源,能上网,然后安装reposynccreaterepo,不同 CentOS 版本(7/8/9)命令略有差异,但工具功能一致:

2.1. CentOS 7(使用yum

# 安装工具包
yum install -y yum-utils createrepo

# 验证安装:查看工具版本
reposync是yum-utils 或 dnf-utils 包的一部分,需要查看其所属软件包的版本
rpm -q yum-utils --info | grep Version # 输出内容:Version : 1.1.31

createrepo --version  # 输出内容:createrepo 0.9.9

在这里插入图片描述

2.2. CentOS 8/9(使用dnf,工具包名相同)

dnf install -y yum-utils createrepo

三、步骤 2:选择并同步互联网 YUM 源

首先需明确要同步的 “源 ID”(如 CentOS 官方源、EPEL 源),再通过reposync下载到本地目录。以下以 “CentOS 官方基础源 + EPEL 扩展源” 为例(最常用的组合,可覆盖 90% 以上软件需求)。

3.1. 查看可同步的互联网源 ID

先列出当前系统已启用的互联网源,获取对应的 “源 ID”(后续同步需指定该 ID):

# 列出所有启用的YUM源(含互联网源)
yum repolist # CentOS 7
# 或 dnf repolist enabled  # CentOS 8/9

在这里插入图片描述

3.1.1常见源 ID 说明(以 CentOS 7 为例)
源 ID源名称作用大小约
base/7/x86_64CentOS-7 - Base系统核心基础软件包4GB
updates/7/x86_64CentOS-7 - Updates基础包的更新补丁2GB
extras/7/x86_64CentOS-7 - Extras额外补充软件(如依赖库)1GB
epel/x86_64Extra Packages for Enterprise Linux 7 - x86_64扩展源(含大量第三方软件,如 nginx、redis)15GB

注:若系统未启用 EPEL 源,需先安装
epel-release
包启用:
CentOS 7:yum install -y epel-release
CentOS 8:dnf install -y epel-release
CentOS 9:dnf install -y epel-release

3.2. 创建本地同步目录

建议在 HTTP 服务根目录下按 “源类型” 创建目录,方便后续共享(以 Apache 默认根目录/var/www/html为例):

# 创建总目录(存放所有同步的源)
mkdir -p /var/www/html/local-yum-repos

3.3. 执行同步(关键步骤)

使用reposync工具将指定源的软件包和元数据同步到对应目录,支持 “全量同步” 和 “增量同步”。

3.3.1 首次全量同步(耗时较长,需耐心)

全量同步会下载源中所有软件包(首次必执行),命令格式:
reposync -r 源ID -p 目标目录 --download-metadata

  • -r 源ID:指定要同步的源(如baseepel);
  • -p 目标目录:软件包下载到的本地路径;
  • --download-metadata:同步源的元数据(repodata目录,后续可减少createrepo工作量)。
# 1. 同步CentOS官方base源(示例:CentOS 7,源ID为base)
reposync -r base -p /var/www/html/local-yum-repos/ --download-metadata

# 2. 同步updates源
reposync -r updates -p /var/www/html/local-yum-repos/ --download-metadata

# 3. 同步extras源
reposync -r extras -p /var/www/html/local-yum-repos/ --download-metadata

# 4. 同步EPEL扩展源(源ID为epel)
reposync -r epel -p /var/www/html/local-yum-repos/ --download-metadata
# 确保本地已有epel源,如没有,通过 yum install -y epel-release 解决

注意:

  • 同步时间取决于网络速度(100Mbps 带宽下,首次同步约 30 分钟 - 1 小时);
  • 若同步中断(如网络断开),重新执行相同命令即可自动续传reposync支持断点续传)。
3.3.2 后续增量同步(仅下载新增 / 更新包)

首次同步后,后续只需同步新增或更新的软件包,无需重复下载旧包,添加--newest-only参数即可:

# 增量同步epel源(仅下载最新版本包)
reposync -r epel -p /var/www/html/local-yum-repos/ --download-metadata --newest-only
3.3.3 验证同步结果

同步完成后,检查目标目录是否包含Packages(软件包目录):

#例如,查看epel源的Packages目录下的包数量
ls /var/www/html/local-yum-repos/epel/Packages/ | wc -l

四、步骤 3:生成 / 更新 YUM 源元数据(关键)

同步的软件包需通过createrepo生成元数据(repodata目录下的索引文件、依赖表),否则 YUM 无法识别包的依赖关系,导致安装失败。

4.1. 首次生成元数据

对每个同步后的源目录执行createrepo,添加--database参数生成数据库(提升 YUM 查询速度):

# 1. 为base源生成元数据
createrepo --database /var/www/html/local-yum-repos/base/

# 2. 为updates源生成元数据
createrepo --database /var/www/html/local-yum-repos/updates/

# 3. 为extras源生成元数据
createrepo --database /var/www/html/local-yum-repos/extras/

# 4. 为epel源生成元数据
createrepo --database /var/www/html/local-yum-repos/epel/
  • 执行后会在对应目录下生成更新repodata目录,包含repomd.xml(元数据入口文件)、primary.xml.gz(包依赖表)等关键文件。

4.2. 后续增量更新元数据

增量同步后(新增了软件包),无需重新生成全部元数据,只需用--update参数更新差异部分:

# 增量更新epel源的元数据(仅新增包的元数据)
createrepo --update /var/www/html/local-yum-repos/epel/

4.3. 验证同步结果

同步完成后,检查目标目录是否包含Packages(软件包目录)和repodata(元数据目录):

#例如,查看epel源的同步结果
ls /var/www/html/local-yum-repos/epel/
# 输出应包含:Packages/  repodata/

五、步骤 4:配置 HTTP 服务共享同步源

沿用之前搭建的 HTTP 服务(Apache/Nginx),将同步后的源目录暴露给局域网客户端,无需额外配置 HTTP 服务,只需确保目录权限正确。

5.1. 修复目录权限(确保 HTTP 服务可读取)

HTTP 服务默认以apache(CentOS 7)或httpd(CentOS 8/9)用户运行,需赋予目录读权限:

# 递归设置权限(所有者为root,其他用户可读)
chmod -R 755 /var/www/html/local-yum-repos/

# 若使用Nginx,所有者需改为nginx用户(可选)
#chown -R nginx:nginx /var/www/html/local-yum-repos/

5.2. 验证 HTTP 访问可用性

在服务端或客户端通过浏览器 /curl访问同步源的元数据文件,确认可正常读取(以 base 源为例):

# 替换为你的服务端IP(如192.168.92.154)
curl http://192.168.92.154/local-yum-repos/base/repodata/repomd.xml
  • 若返回 XML 格式内容(含<repomd>标签),说明 HTTP 共享成功;若提示 “404 Not Found”,检查 HTTP 服务状态(systemctl status httpd)或目录路径是否正确。

六、步骤 5:客户端配置使用同步的互联网源

客户端无需互联网,只需通过 repo 文件指向服务端的同步源,即可安装丰富的软件包。

6.1. 备份客户端原有源(避免冲突)

# 客户端操作:备份所有旧repo文件
mkdir -p /etc/yum.repos.d/backup
mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup/

6.2. 创建同步源的 repo 文件

在客户端新建/etc/yum.repos.d/local-internet-repo.repo,内容需对应服务端的同步源路径(以 CentOS 7 客户端为例):

# 1. 本地同步的base源
[local-base]
name=CentOS 7 Local Base Repo (Sync from Internet)
baseurl=http://192.168.92.154/local-yum-repos/base/
enabled=1
gpgcheck=1
gpgkey=http://192.168.92.154/local-yum-repos/base/base/RPM-GPG-KEY-CentOS-7

# 2. 本地同步的updates源
[local-updates]
name=CentOS 7 Local Updates Repo (Sync from Internet)
baseurl=http://192.168.92.154/local-yum-repos/updates/
enabled=1
gpgcheck=1
gpgkey=http://192.168.92.154/local-yum-repos/base/base/RPM-GPG-KEY-CentOS-7

# 3. 本地同步的extras源
[local-extras]
name=CentOS 7 Local Extras Repo (Sync from Internet)
baseurl=http://192.168.92.154/local-yum-repos/extras/
enabled=1
gpgcheck=1
gpgkey=http://192.168.92.154/local-yum-repos/base/RPM-GPG-KEY-CentOS-7

# 4. 本地同步的EPEL源
[local-epel]
name=Local EPEL Repo (Sync from Internet)
baseurl=http://192.168.92.154/local-yum-repos/epel/
enabled=1
gpgcheck=1
gpgkey=http://192.168.92.154/local-yum-repos/epel/epel/RPM-GPG-KEY-EPEL-7
  • 配置说明:
    • baseurl:替换为服务端的实际 IP 和同步目录路径;
    • gpgkey:通过 HTTP 引用服务端同步源中的 GPG 公钥(确保软件包未被篡改);
    • 若为 CentOS 8/9 客户端,需修改gpgkey路径(如RPM-GPG-KEY-CentOS-8)和源目录(对应服务端同步的 8/9 版本源)。

6.3. 客户端验证与使用

# 1. 清理旧缓存
yum clean all  # CentOS 7
# 或 dnf clean all  # CentOS 8/9

# 2. 生成新缓存(从本地同步源获取元数据)
yum makecache  # 输出应显示4个本地源(local-base、local-updates等)

# 3. 测试安装互联网软件(如nginx,来自EPEL源)
yum install -y nginx

# 4. 验证安装结果
nginx -v  # 输出内容:nginx version: nginx/1.20.1
  • 若安装成功,说明客户端已能正常使用同步的互联网源;整个过程无需客户端联网,所有软件包均从服务端本地获取。

七、进阶优化:定时同步与多源管理

7.1. 定时同步(保持源的更新)

通过crontab设置定时任务,每周 / 每月自动增量同步互联网源,确保本地源与互联网同步:

# 编辑定时任务
crontab -e

# 添加以下内容(每周日凌晨2点增量同步所有源,日志输出到/var/log/yum-sync.log)
0 2 * * 0 /usr/bin/reposync -r base -p /var/www/html/local-yum-repos/ --download-metadata --newest-only >> /var/log/yum-sync.log 2>&1
0 3 * * 0 /usr/bin/reposync -r updates -p /var/www/html/local-yum-repos/ --download-metadata --newest-only >> /var/log/yum-sync.log 2>&1
0 4 * * 0 /usr/bin/reposync -r extras -p /var/www/html/local-yum-repos/ --download-metadata --newest-only >> /var/log/yum-sync.log 2>&1
0 5 * * 0 /usr/bin/reposync -r epel -p /var/www/html/local-yum-repos/ --download-metadata --newest-only >> /var/log/yum-sync.log 2>&1

# 源同步后更新元数据
0 6 * * 0 /usr/bin/createrepo --update /var/www/html/local-yum-repos/base/ >> /var/log/yum-sync.log 2>&1
0 6 * * 0 /usr/bin/createrepo --update /var/www/html/local-yum-repos/updates/ >> /var/log/yum-sync.log 2>&1
0 6 * * 0 /usr/bin/createrepo --update /var/www/html/local-yum-repos/extras/ >> /var/log/yum-sync.log 2>&1
0 6 * * 0 /usr/bin/createrepo --update /var/www/html/local-yum-repos/epel/ >> /var/log/yum-sync.log 2>&1

7.2. 混合使用 ISO 源与同步源

若需保留 ISO 源的 “系统基础包”(安装系统组件时优先使用),可在客户端同时配置 ISO 源和同步源,YUM 会自动按优先级选择(无优先级配置时,按 repo 文件顺序查询):

# 在客户端repo文件中添加ISO源(参考前文ISO本地源配置)
[local-iso]
name=CentOS 7 Local ISO Repo
baseurl=http://192.168.92.154/iso-repo/  # 服务端ISO源路径
enabled=1
gpgcheck=1
gpgkey=http://192.168.92.154/iso-repo/RPM-GPG-KEY-CentOS-7

八、常见问题与排查方案

8.1. 同步失败:“Could not retrieve mirrorlist”

  • 原因:服务端无互联网、网络代理未配置,或源 ID 错误。
  • 排查:
  1. 测试服务端互联网连通性:ping mirrors.aliyun.com
  2. 确认源 ID 正确:yum repolist重新核对源 ID(如 CentOS 8 的 base 源 ID 是baseos,而非base);
  3. 若需代理,在/etc/yum.conf添加代理配置:proxy=http://代理IP:端口

8.2. 客户端安装包失败:“No package xxx available”

  • 原因:同步源未包含该包(如未同步 EPEL 源),或元数据未更新。
  • 排查:
  1. 服务端检查对应源的Packages目录是否有该包:ls /var/www/html/local-yum-repos/epel/Packages/n/nginx*
  2. 若有包但客户端找不到,重新生成元数据:createrepo --update 目录路径
  3. 若服务端无该包,同步包含该包的源(如nginx在 EPEL 源,需同步 epel 源)。

8.3. GPG 校验失败:“BADSIG”

  • 原因:GPG 公钥路径错误,或同步的包被篡改(极少发生)。
  • 排查:
  1. 确认gpgkey路径正确(通过浏览器访问baseurl下的RPM-GPG-KEY-xxx文件是否存在);
  2. 手动导入公钥:rpm --import http://192.168.92.154/local-yum-repos/base/RPM-GPG-KEY-CentOS-7

九、总结

通过 “同步互联网源→生成元数据→HTTP 共享→客户端配置” 的流程,彻底解决了ISO镜像源包少的问题,实现了 “局域网内无网也能装软件”的需求(只需这台服务器能上网同步互联网源,其他内网机器无需连互联网)。
如需更多软件,可同步其他第三方源(如 Docker 源、MySQL 源),只需重复 “源同步→生成元数据” 步骤。
若你需要同步特定第三方源(如 Docker、Redis 官方源),或对定时同步、磁盘空间优化有进一步需求,可随时留言,我会补充对应的操作细节!,就问你们细不细?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zrande

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值