简介:gpmall-repo.rar 是一份面向云计算与分布式系统学习者的离线软件源资源包,主要服务于需要在 CentOS 7 环境下搭建电商或日志分析平台的技术人员。包内共收录 173 个文件,以 166 个 rpm 安装包为主体,涵盖 Java 运行环境、MongoDB、Elasticsearch、Logstash 等常用中间件,另含 3 个 gz、3 个 bz2 及 1 个 xml 元数据文件,用于构建本地 yum 仓库索引,压缩包整体约 304.19MB。目前已有 187 人学习下载,适合在无外网或网络受限场景下完成环境部署与依赖安装。借助该资源,读者可快速搭建 gpmall 项目所需的软件仓库,避免逐一下载依赖的繁琐过程,同时便于理解 rpm 包组织方式与仓库元数据生成逻辑,为后续服务部署与排错提供稳定基础。
1. 从 gpmall-repo.rar 说起:一个被低估的云原生本地仓库包
如果你在云原生环境里折腾过离线部署,大概率遇到过这种场景:内网机器没有外网,yum install或apt-get全部超时,镜像拉不下来,连基础依赖都装不上。gpmall-repo.rar 就是为这类场景准备的一个本地软件仓库压缩包,解压后是一套完整的 RPM 包集合与仓库元数据,可以直接挂载到内网服务器上作为 yum 源使用。它解决的核心问题只有一个:让没有外网的环境也能正常安装和更新软件包。
这个包适合三类人:一是做私有云或混合云交付的运维工程师,需要在客户内网完成整套环境搭建;二是实验室或教学场景里,机器数量多、网络受限,需要统一软件源;三是自己搭 homelab 的开发者,想模拟企业内网的离线部署流程。它不是什么高深的东西,但用对了能省掉大量重复下载和依赖排查的时间。下面从仓库结构、挂载方式、依赖处理到常见翻车点,一步步拆开讲。
2. 拆开 gpmall-repo.rar:仓库目录结构与元数据到底长什么样
拿到一个仓库压缩包,第一件事不是急着解压到生产目录,而是先看清楚里面装了什么。gpmall-repo.rar 解压后通常包含两个核心部分:一个是Packages/目录,存放所有 RPM 包文件;另一个是repodata/目录,存放仓库的元数据,包括repomd.xml、primary.xml.gz、filelists.xml.gz等。元数据决定了 yum 能不能正确识别这个仓库、能不能解析依赖关系。
2.1 仓库目录的典型布局与各文件作用
解压后你会看到类似这样的结构:
gpmall-repo/ ├── Packages/ │ ├── nginx-1.20.1-1.el7.x86_64.rpm │ ├── mysql-community-server-5.7.36-1.el7.x86_64.rpm │ ├── redis-6.2.6-1.el7.x86_64.rpm │ └── ...(其余 RPM 包) ├── repodata/ │ ├── repomd.xml │ ├── primary.xml.gz │ ├── filelists.xml.gz │ └── other.xml.gz └── RPM-GPG-KEY-gpmallPackages/里放的是实际安装包,命名遵循名称-版本-发布号.架构.rpm的规范。repodata/是仓库的索引,yum 客户端首先读取repomd.xml,从中找到primary.xml.gz的路径和校验值,再下载并解析它来获取包列表和依赖信息。RPM-GPG-KEY-gpmall是签名公钥,用于校验包完整性。
注意:如果
repodata/目录缺失或损坏,yum 会直接报Cannot find a valid baseurl或repomd.xml not found,仓库等于废的。所以拿到包后先确认这个目录存在且文件完整。
2.2 用 createrepo 重建元数据:什么时候需要,怎么操作
有时候你拿到的是纯 RPM 包集合,没有repodata/,或者你往Packages/里新增了包,元数据没有同步更新。这时候需要用createrepo重新生成索引。常见做法是:
# 安装 createrepo 工具(如果本机有外网) yum install -y createrepo # 进入仓库根目录,重新生成元数据 cd /opt/gpmall-repo createrepo -v . # 如果只想更新新增的包,用 --update 参数,避免全量重建 createrepo --update -v .-v输出详细过程,方便确认扫描到了哪些包。--update只处理新增或变化的包,速度更快,适合日常维护。执行完后repodata/会被刷新,repomd.xml的时间戳也会更新。
参数说明:createrepo默认使用sha256做校验,如果客户端是较老的 CentOS 6,可能需要加--checksum sha。另外,如果包数量很大,可以加--workers 4并行处理,缩短生成时间。
2.3 仓库签名与 GPG 校验:别跳过这一步
企业内网仓库通常会用 GPG 签名,客户端配置里会写gpgcheck=1。如果签名不匹配或公钥没导入,安装时会报Public key for xxx.rpm is not installed。处理方式是在客户端导入公钥:
# 导入仓库公钥 rpm --import /opt/gpmall-repo/RPM-GPG-KEY-gpmall # 验证公钥是否导入成功 rpm -qa gpg-pubkey*如果只是内部测试环境,也可以在 repo 配置里临时设gpgcheck=0,但生产环境不建议这么做。签名校验是防止包被篡改的最后一道防线,跳过它等于把风险留给未来。
3. 把仓库挂到内网:HTTP 服务与 yum 源配置的完整链路
仓库文件准备好之后,下一步是让内网其他机器能访问到它。最常用的方式是用 HTTP 服务暴露仓库目录,然后在客户端配置 yum 源指向这个地址。整个过程分三步:服务端起 HTTP、客户端写 repo 文件、验证连通性。
3.1 用 Nginx 或 Python 快速暴露仓库目录
如果服务器上已经有 Nginx,直接加一个 location 指向仓库目录:
server { listen 80; server_name repo.internal; root /opt/gpmall-repo; location / { autoindex on; autoindex_exact_size off; autoindex_localtime on; } }autoindex on让浏览器能直接看到文件列表,方便排查。如果只是临时用,Python 自带的 HTTP 服务更快:
# 在仓库根目录启动一个简单的 HTTP 服务,监听 8080 端口 cd /opt/gpmall-repo python3 -m http.server 8080这种方式适合临时验证,生产环境还是用 Nginx,性能和稳定性更好。启动后在本机用curl http://localhost:8080/repodata/repomd.xml确认能返回内容。
3.2 客户端 repo 文件怎么写:baseurl、gpgcheck、enabled 三个关键参数
在客户端机器上创建/etc/yum.repos.d/gpmall.repo:
[gpmall] name=GPMall Local Repository baseurl=http://192.168.1.100/gpmall-repo/ enabled=1 gpgcheck=1 gpgkey=http://192.168.1.100/gpmall-repo/RPM-GPG-KEY-gpmallbaseurl指向仓库根目录,注意结尾的斜杠不能少,否则 yum 可能拼出错误的路径。enabled=1表示启用这个源。gpgcheck=1开启签名校验,gpgkey指向公钥地址。如果内网没有 DNS,直接用 IP 即可。
写完后执行:
# 清理缓存并重建 yum clean all yum makecache # 查看仓库是否被正确识别 yum repolist如果repolist里能看到gpmall并且包数量不为零,说明配置成功。
3.3 验证安装:用一个具体包测试整条链路
不要只看repolist就认为万事大吉,实际装一个包才能确认依赖解析和下载都正常。比如测试安装nginx:
# 查看 nginx 是否在仓库中可见 yum list available | grep nginx # 尝试安装 yum install -y nginx # 确认安装结果 rpm -qa | grep nginx如果安装过程中报依赖缺失,说明仓库里的包不完整,需要补充缺失的 RPM 后重新createrepo --update。这一步是检验仓库可用性的硬标准,别跳过。
4. 依赖地狱与版本对齐:离线仓库最容易翻车的几个地方
离线仓库最怕的不是包少,而是包之间的依赖关系断了。你在有外网的环境里yum install一切正常,是因为远程仓库帮你补齐了所有依赖。一旦搬到内网,缺一个底层库就可能让整个安装卡住。下面几条是实际交付中反复遇到的坑。
4.1 依赖缺失的排查思路:从报错信息反推缺哪个包
当 yum 报Error: Package: xxx requires yyy时,不要急着去网上搜。先在仓库里确认yyy是否存在:
# 在仓库目录中查找是否包含某个包 ls /opt/gpmall-repo/Packages/ | grep yyy # 如果仓库已配置,也可以用 yum provides 查 yum provides "*/yyy*"如果确实没有,需要从其他渠道获取对应版本的 RPM,放入Packages/后执行createrepo --update。注意版本号要匹配,比如libssl.so.10和libssl.so.1.1来自不同的 openssl 版本,混用会直接报错。
4.2 版本锁定的必要性:为什么不能随便混用不同来源的 RPM
不同来源的 RPM 可能依赖不同版本的底层库。比如从 A 渠道拿的 nginx 依赖openssl-libs-1.0.2k,从 B 渠道拿的 mysql 依赖openssl-libs-1.1.1d,两个版本冲突,yum 会直接拒绝安装。常见做法是:整个仓库的包尽量来自同一发行版和同一批次,避免跨版本混用。
如果确实需要多版本共存,可以考虑用module或者拆成多个仓库,让客户端按需启用。但在内网离线场景下,最简单的策略就是保持版本一致。
4.3 用 yum-utils 工具做仓库完整性检查
yum-utils里有个repoclosure工具,可以检查仓库中所有包的依赖是否都能在仓库内闭环:
# 安装 yum-utils yum install -y yum-utils # 检查仓库依赖闭环 repoclosure --repoid=gpmall输出会列出所有缺失的依赖。如果结果为空,说明仓库自洽,可以放心交付。这个检查建议在打包完成后、交付前跑一遍,能提前发现大部分问题。
5. 避坑记录:离线仓库交付中反复出现的五个问题
这一章记录的是实际交付中踩过的坑,每条按现象、原因、解决三段写。如果你正准备把 gpmall-repo.rar 用到生产环境,建议逐条对照检查。
现象一:yum makecache 报 “Cannot retrieve repository metadata”。原因通常是 baseurl 路径写错,或者 HTTP 服务没有正确暴露repodata/目录。解决:先用curl在客户端访问baseurl/repodata/repomd.xml,确认能返回 XML 内容。如果返回 404,检查 Nginx 的 root 路径是否指向仓库根目录,而不是上级目录。
现象二:安装时报 “Public key not installed”。原因是客户端没有导入仓库公钥,或者gpgkey地址写错。解决:手动rpm --import公钥文件,或者在 repo 配置里把gpgkey改成可访问的 HTTP 地址。如果公钥文件本身损坏,需要重新从仓库目录复制一份。
现象三:createrepo 执行后 repodata 目录为空。原因是执行命令时不在仓库根目录,或者Packages/目录下没有 RPM 文件。解决:确认当前目录下有Packages/且里面有.rpm文件,然后重新执行createrepo -v .。如果包在子目录里,需要加--dir参数指定。
现象四:客户端能 repolist 但安装时提示 “No package available”。原因是包名拼写错误,或者仓库元数据没有包含该包。解决:用yum list available | grep 关键词模糊查找,确认包名。如果确实没有,检查createrepo是否在添加包之后重新执行过。
现象五:多台客户端同时安装时 HTTP 服务响应慢或超时。原因是 Python 临时 HTTP 服务并发能力弱,或者 Nginx 的 worker 连接数不够。解决:生产环境换成 Nginx,调整worker_connections和keepalive_timeout。如果仓库文件很大,考虑开启sendfile和gzip压缩元数据。
6. 进阶:把仓库做成可移植的 ISO 与自动化校验脚本
当你需要把仓库交付到完全隔离的环境时,U 盘拷贝目录的方式容易丢文件或权限错乱。更稳妥的做法是打成 ISO,挂载后直接作为本地源使用。另外,每次更新仓库后手动检查依赖太累,写一个校验脚本能省不少事。
6.1 用 genisoimage 打包成 ISO 并配置本地源
# 安装 genisoimage yum install -y genisoimage # 打包仓库目录为 ISO genisoimage -o /tmp/gpmall-repo.iso -R -J -V "GPMALL_REPO" /opt/gpmall-repo # 在目标机器上挂载 mkdir -p /mnt/gpmall-repo mount -o loop /tmp/gpmall-repo.iso /mnt/gpmall-repo-R启用 Rock Ridge 扩展,保留 Unix 权限;-J启用 Joliet,兼容 Windows 读取;-V设置卷标。挂载后把 repo 文件的baseurl改成file:///mnt/gpmall-repo/即可。
6.2 写一个仓库自检脚本:依赖闭环 + 签名校验 + 包数量统计
#!/bin/bash # gpmall-repo-check.sh # 用途:检查仓库依赖闭环、签名和包数量 REPO_DIR="/opt/gpmall-repo" REPO_ID="gpmall" echo "=== 包数量统计 ===" ls ${REPO_DIR}/Packages/*.rpm | wc -l echo "=== 依赖闭环检查 ===" repoclosure --repoid=${REPO_ID} 2>&1 | tee /tmp/repoclosure.log if [ -s /tmp/repoclosure.log ]; then echo "存在缺失依赖,请检查上方输出" else echo "依赖闭环正常" fi echo "=== 签名校验 ===" rpm --checksig ${REPO_DIR}/Packages/*.rpm 2>&1 | grep -i "NOT OK" && echo "存在签名异常包" || echo "签名全部通过"这个脚本可以放到 CI 或者交付前的检查清单里,每次更新仓库后跑一遍。依赖闭环和签名是两条底线,任何一条不过都不应该交付。
6.3 版本更新时的增量同步策略
仓库不是一次性的,后续会有新包加入或旧包升级。全量重建repodata在包数量大时很慢,用createrepo --update只处理变化部分。但要注意:如果删除了旧包,--update不会自动清理元数据里的旧条目,需要加--database或者手动删掉repodata后全量重建。我一般会在每次大版本更新后做一次全量重建,日常小更新用--update。
从那以后我每次交付离线仓库前,都会强制走一遍repoclosure和签名校验,确认无误再打包。希望帮到你。
本文还有配套的精品资源,点击获取