目录
同步互联网 YUM 源到本地:解决 ISO 源包少的完整方案
之前讲解了基于 ISO 镜像构建本地 YUM 源和 HTTP 网络源,但ISO镜像仅包含系统基础软件包(约 1000-2000 个),无法满足安装额外软件(如nginx、Python3、Docker等)的需求。通过同步互联网 YUM 源到本地,可将数万甚至数十万软件包 “本地化”,既避免依赖外部网络,又能获取丰富的软件资源。本文以CentOS 7.9为例,详细讲解实现从“有限ISO源” 到 “全量本地互联网源”的升级的完整过程,确保每一步操作准确可复现,内容有点长请慢慢看(太细了,男人不能太细!!,哈哈哈)。
一、核心原理与前提条件
1.1. 核心逻辑
-
同步工具:使用
reposync(yum-utils包自带)工具,将互联网 YUM 源的软件包(.rpm)和元数据(repodata)完整下载到本地目录; -
元数据生成:通过
createrepo工具为同步的包生成 YUM 可识别的元数据(依赖关系、包索引等); -
共享方式:沿用之前的 HTTP 服务(Apache/Nginx),将同步后的源目录暴露给局域网客户端,实现 “一次同步,多机共享”;
-
优势:相比直接使用互联网源,本地同步源可避免网络波动、节省带宽(多机复用),且支持离线使用。
1.2. 前提条件
- 服务端:
- 已安装 HTTP 服务(参考前文《基于 HTTP 构建 YUM 网络源》,确保
httpd/nginx正常运行); - 具备互联网访问能力(首次同步需下载软件包,后续可增量更新);
- 预留足够磁盘空间:CentOS 官方源(base+updates+extras)约 5-10GB,EPEL 扩展源约 15-20GB,建议预留 30GB 以上(视同步源数量调整);
- 安装必备工具:
yum-utils(含reposync)、createrepo(生成元数据)。
- 客户端:局域网内可访问服务端 IP,无需互联网(后续通过本地同步源安装软件)。
二、步骤 1:服务端安装同步与元数据工具
首先得有系统官方基础源,能上网,然后安装reposync和createrepo,不同 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_64 | CentOS-7 - Base | 系统核心基础软件包 | 4GB |
| updates/7/x86_64 | CentOS-7 - Updates | 基础包的更新补丁 | 2GB |
| extras/7/x86_64 | CentOS-7 - Extras | 额外补充软件(如依赖库) | 1GB |
| epel/x86_64 | Extra 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:指定要同步的源(如base、epel);-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 错误。
- 排查:
- 测试服务端互联网连通性:
pingmirrors.aliyun.com; - 确认源 ID 正确:
yum repolist重新核对源 ID(如 CentOS 8 的 base 源 ID 是baseos,而非base); - 若需代理,在
/etc/yum.conf添加代理配置:proxy=http://代理IP:端口。
8.2. 客户端安装包失败:“No package xxx available”
- 原因:同步源未包含该包(如未同步 EPEL 源),或元数据未更新。
- 排查:
- 服务端检查对应源的
Packages目录是否有该包:ls /var/www/html/local-yum-repos/epel/Packages/n/nginx*; - 若有包但客户端找不到,重新生成元数据:
createrepo --update 目录路径; - 若服务端无该包,同步包含该包的源(如
nginx在 EPEL 源,需同步 epel 源)。
8.3. GPG 校验失败:“BADSIG”
- 原因:GPG 公钥路径错误,或同步的包被篡改(极少发生)。
- 排查:
- 确认
gpgkey路径正确(通过浏览器访问baseurl下的RPM-GPG-KEY-xxx文件是否存在); - 手动导入公钥:
rpm --importhttp://192.168.92.154/local-yum-repos/base/RPM-GPG-KEY-CentOS-7。
九、总结
通过 “同步互联网源→生成元数据→HTTP 共享→客户端配置” 的流程,彻底解决了ISO镜像源包少的问题,实现了 “局域网内无网也能装软件”的需求(只需这台服务器能上网同步互联网源,其他内网机器无需连互联网)。
如需更多软件,可同步其他第三方源(如 Docker 源、MySQL 源),只需重复 “源同步→生成元数据” 步骤。
若你需要同步特定第三方源(如 Docker、Redis 官方源),或对定时同步、磁盘空间优化有进一步需求,可随时留言,我会补充对应的操作细节!,就问你们细不细?
920

被折叠的 条评论
为什么被折叠?



