TT Lab
开始
学习 学习路径 课程

RHEL 系管理

用 createrepo_c 做仓库

在 TT Lab 中继续学习

目标

把 rpm 汇集起来,用 createrepo_c 创建软件仓库,通过 .repo 文件登记,并仅用这个软件仓库完成安装。

为什么重要

隔离网络中最常被报告的问题是“放进仓库了却看不到”,而原因排第一的是遗漏 createrepo_c --update。文件明明看得见,dnf 却不知道。第二位是客户端缓存。只要把这两者的先后顺序刻进肌肉记忆,这类报告的 90% 几分钟就能解决。

此外,了解 repomd.xml 的结构,就能判断仓库里有什么、没有什么——例如,如果没有 updateinfo,dnf update --security 就会悄悄地什么都不做。

步骤

  1. 创建目录 /root/repo/pool,并在不安装的情况下,把 tree 软件包及其依赖下载到该目录。必须至少有 1 个 .rpm。
  2. 用 createrepo_c 在 /root/repo/pool 中创建元数据。必须生成 repodata/repomd.xml。
  3. 创建 /etc/yum.repos.d/labhub-local.repo。仓库 ID 为 labhub-local,name 中必须包含快照日期(snapshot 字符串和 YYYY-MM-DD),并且要包含 baseurl=file:///root/repo/pool、enabled=1、gpgcheck=0、metadata_expire=-1。
  4. 刷新缓存,并把软件仓库列表保存到 /root/repo/repolist.txt。必须能看到 labhub-local。
  5. 在关闭其他所有软件仓库、只开启 labhub-local 的状态下重新安装 tree,并把该命令的输出保存到 /root/repo/install.txt。
  6. 把 nano 软件包再下载到 pool 中,然后对元数据进行增量更新,更新后把 labhub-local 软件仓库的软件包数量写成一行数字,保存到 /root/repo/pkgcount.txt。
  7. 从 repomd.xml 中只提取元数据的类型名称,每行一个,写入 /root/repo/mdtypes.txt。primary、filelists、other 必须全部存在。
  8. 把 /root/repo/report.txt 写成下面这 4 行。 REPO_ID=labhub-local / PACKAGES=<6번 값> / MDTYPES=<7번 파일의 줄 수> / HAS_UPDATEINFO=<yes|no>(后三项的占位符依次为第 6 步的值、第 7 步文件的行数、yes 或 no)

参考

汇集 rpm

创建目录 /root/repo/pool,并在不安装的情况下,把 tree 软件包及其依赖下载到该目录。必须至少有 1 个 .rpm。

dnf 有不安装、只下载 rpm 的命令。请同时使用把依赖也一并下载的选项。

生成元数据

用 createrepo_c 在 /root/repo/pool 中创建元数据。必须生成 repodata/repomd.xml。

给 createrepo_c 指定目录后,会在其下创建 repodata。

编写软件仓库定义

创建 /etc/yum.repos.d/labhub-local.repo。仓库 ID 为 labhub-local,name 中必须包含快照日期(snapshot 字符串和 YYYY-MM-DD),并且要包含 baseurl=file:///root/repo/pool、enabled=1、gpgcheck=0、metadata_expire=-1。

这是 yum.repos.d 之下的 .repo 文件。方括号内是仓库 ID,name、baseurl、enabled 是必需的。

刷新缓存并确认

刷新缓存,并把软件仓库列表保存到 /root/repo/repolist.txt。必须能看到 labhub-local。

先把元数据缓存标记为过期,再查看软件仓库列表。必须能看到新的软件仓库。

仅用该软件仓库安装

在关闭其他所有软件仓库、只开启 labhub-local 的状态下重新安装 tree,并把该命令的输出保存到 /root/repo/install.txt。

有一种选项组合,可以关闭所有软件仓库而只开启一个。

添加软件包后更新

把 nano 软件包再下载到 pool 中,然后对元数据进行增量更新,更新后把 labhub-local 软件仓库的软件包数量写成一行数字,保存到 /root/repo/pkgcount.txt。

放入 rpm 并重新建立索引,dnf 才能看到。有增量更新选项。

确认 repomd.xml 的结构

从 repomd.xml 中只提取元数据的类型名称,每行一个,写入 /root/repo/mdtypes.txt。primary、filelists、other 必须全部存在。

每种元数据类型都以 type 属性标出。请只提取类型名称。

软件仓库报告

把 /root/repo/report.txt 写成下面这 4 行。 REPO_ID=labhub-local / PACKAGES=<6번 값> / MDTYPES=<7번 파일의 줄 수> / HAS_UPDATEINFO=<yes|no>(后三项的占位符依次为第 6 步的值、第 7 步文件的行数、yes 或 no)

请汇总软件包数量和元数据类型。值必须是实际确认的结果。