首页/系统/信创系统运维速查/制作内网本地 RPM 仓库
命令与包管理65 条

制作内网本地 RPM 仓库

离线内网标准组件:收集 rpm 到目录 → createrepo_c 生成元数据 → HTTP 或 file:// 发布,客户端配 .repo 即可使用。

信创系统运维速查系统更新于 2026-10-13

本地源是怎么搭起来的

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 与 Packages403/404 是服务端根目录或权限问题
dnf install 实测能解析依赖并装成功只报找不到包时优先怀疑缓存与元数据
文件属主Web 用户可读权限过紧会让 dnf 取不到包
新增或替换 rpm 后必须重新执行 createrepo_c --update,否则客户端元数据里根本没有这个包,表现为『包明明在里面但装不上』。
仓库目录建议按发行版与架构分开放置(如 kylin-v10/x86_64),避免不同版本的同名包混在一份元数据里引发依赖解析冲突。

易错点

  • 拷进新 rpm 后忘记 --update 元数据,客户端 repolist 看不到新包,是最高频的返工原因
  • 把不同发行版或不同架构的 rpm 混在一个目录生成元数据,依赖解析结果自相矛盾,安装时反复报冲突
  • 服务端目录权限只给 root 可读,dnf 以普通身份取包时报 403,表现为元数据能读、包下不下来
  • 自建源 gpgcheck 长期为 0 且没有变更记录,合规检查时不通过;有条件应签名并保留校验
  • 只用 file:// 方式发布给几十台客户端,介质或本地磁盘成为单点,且升级时难以统一,客户端数量多时应改用 HTTP

数据来源与参考

  • createrepo_c 文档
  • openEuler 内网源指南
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌