本地源是怎么搭起来的
RPM 仓库的本质是『一堆 rpm 包 + repodata 元数据目录』:dnf 先读元数据知道有哪些包与依赖,再去取包体。内网离线环境的标准做法是把收集到的 rpm 放进一个目录,用 createrepo_c 生成元数据,再通过 HTTP 或 file:// 发布出去,客户端写一个 .repo 文件即可像用官方源一样安装。
基本信息
| 核心工具 | createrepo_c(dnf install -y createrepo_c) |
|---|---|
| 产出物 | 目标目录下的 repodata/ 子目录 |
| 发布方式 | HTTP(推荐多客户端)、file://(单机或挂载介质) |
| 增量更新 | createrepo_c --update 目录 |
| 客户端配置 | /etc/yum.repos.d/ 下新增 .repo 文件 |
| 权限要求 | 服务端 root 或具写目录权限;客户端需 root 改 repo 文件 |
典型使用场景
- 完全无外网的生产网内做补丁与中间件分发
- 把外网下载好的 rpm 批量带进内网,形成统一装机源
- 多个系统版本混用时按发行版分目录建多个源
- 临时排障需要安装离线依赖包,快速建一个一次性源
- 把官方 ISO 里的包抽出来做成本地源,减少手工逐个 rpm 安装的依赖地狱
制作流程
制作流程
dnf install -y createrepo_c # 在可联网的机器上先装工具
mkdir -p /data/repo/Packages # 建仓库根目录与包目录
cp /media/rpms/*.rpm /data/repo/Packages/ # 把收集到的 rpm 放进去
createrepo_c /data/repo # 生成 repodata 元数据
createrepo_c --update /data/repo # 后续新增 rpm 后用增量更新
find /data/repo/Packages -name '*.rpm' | wc -l # 核对包数量与预期一致
ls /data/repo/repodata/ # 确认元数据文件已生成发布与客户端配置
发布与客户端配置
# 服务端用 nginx/httpd 把 /data/repo 发布为 http://10.0.0.10/repo
# 客户端新增 /etc/yum.repos.d/local-rpm.repo:
[local-rpm]
name=Local RPM Repo
baseurl=http://10.0.0.10/repo
enabled=1
gpgcheck=0 # 自建源未签名时保持 0;有签名条件时应改为 1 并配 gpgkey
# 客户端刷新验证:
# dnf clean all && dnf makecache && dnf repolist验证与故障对照
| 检查点 | 期望结果 | 异常含义 |
|---|---|---|
| ls repodata | 存在 repomd.xml 等文件 | 缺文件说明 createrepo_c 未成功执行 |
| dnf repolist | 能看到 local-rpm 且包数不为 0 | 包数为 0 说明元数据没更新或路径不对 |
| 浏览器访问 baseurl | 能列出 repodata 与 Packages | 403/404 是服务端根目录或权限问题 |
| dnf install 实测 | 能解析依赖并装成功 | 只报找不到包时优先怀疑缓存与元数据 |
| 文件属主 | Web 用户可读 | 权限过紧会让 dnf 取不到包 |
新增或替换 rpm 后必须重新执行 createrepo_c --update,否则客户端元数据里根本没有这个包,表现为『包明明在里面但装不上』。
仓库目录建议按发行版与架构分开放置(如 kylin-v10/x86_64),避免不同版本的同名包混在一份元数据里引发依赖解析冲突。