用 createrepo_c 做仓库
目标
把 rpm 汇集起来,用 createrepo_c 创建软件仓库,通过 .repo 文件登记,并仅用这个软件仓库完成安装。
为什么重要
隔离网络中最常被报告的问题是“放进仓库了却看不到”,而原因排第一的是遗漏 createrepo_c --update。文件明明看得见,dnf 却不知道。第二位是客户端缓存。只要把这两者的先后顺序刻进肌肉记忆,这类报告的 90% 几分钟就能解决。
此外,了解 repomd.xml 的结构,就能判断仓库里有什么、没有什么——例如,如果没有 updateinfo,dnf update --security 就会悄悄地什么都不做。
步骤
- 创建目录
/root/repo/pool,并在不安装的情况下,把tree软件包及其依赖下载到该目录。必须至少有 1 个.rpm。 - 用
createrepo_c在/root/repo/pool中创建元数据。必须生成repodata/repomd.xml。 - 创建
/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。 - 刷新缓存,并把软件仓库列表保存到
/root/repo/repolist.txt。必须能看到labhub-local。 - 在关闭其他所有软件仓库、只开启
labhub-local的状态下重新安装tree,并把该命令的输出保存到/root/repo/install.txt。 - 把
nano软件包再下载到 pool 中,然后对元数据进行增量更新,更新后把labhub-local软件仓库的软件包数量写成一行数字,保存到/root/repo/pkgcount.txt。 - 从
repomd.xml中只提取元数据的类型名称,每行一个,写入/root/repo/mdtypes.txt。primary、filelists、other必须全部存在。 - 把
/root/repo/report.txt写成下面这 4 行。REPO_ID=labhub-local/PACKAGES=<6번 값>/MDTYPES=<7번 파일의 줄 수>/HAS_UPDATEINFO=<yes|no>(后三项的占位符依次为第 6 步的值、第 7 步文件的行数、yes 或 no)
参考
- 下载用
dnf download --resolve --destdir=/root/repo/pool tree。 - 只使用一个软件仓库的形式是
dnf --disablerepo='*' --enablerepo=labhub-local install -y tree。如果已经安装过而想重新下载安装,不要用install --reinstall,而要使用reinstall子命令——在这个 dnf(4.14)中,install --reinstall会因unrecognized arguments而报错退出。 - 增量更新用
createrepo_c --update /root/repo/pool。 - 每个软件仓库的软件包数量,可以用
dnf --disablerepo='*' --enablerepo=labhub-local list available --all | wc -l等方式统计。repoquery也不错。 - 常见错误 1:在第 6 步重新建立索引后,没有执行
dnf clean expire-cache,结果看到的是旧信息。 - 常见错误 2:在第 3 步把
baseurl中斜杠的数量写错。本地路径是file://后面跟绝对路径,所以是三个斜杠。
汇集 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)
请汇总软件包数量和元数据类型。值必须是实际确认的结果。