本文展示了 rpmdistro-repoquery,并描述了如何使用它来简化跨多个发行版执行基于 RPM 的包操作。 这不需要使用 SSH 登录到另一台主机或启动容器或 VM。
介绍
无论您是打包者、系统管理员还是 Fedora Linux、CentOS Stream 或它们的衍生产品(RHEL、AlmaLinux、Rocky Linux 等),您可能已经熟悉 dnf repoquery。 此工具允许您查询系统上配置的存储库以获取有关可用包的信息,无论它们当前是否安装在本地计算机上。
这很好,在限制范围内。 例如,在 Fedora Linux,您可以查询为稳定版和分支版构建的包 Fedora Linux 发布,如果你安装了 fedora-repos-rawhide,则在开发分支中打包。 需要足够的小心以确保您不启用针对不同的回购协议 Fedora Linux默认发布,因此不小心升级了正在运行的系统。
Enter rpmdistro-repoquery: 它为不同的基于 RPM 的发行版提供了一组 repo 定义,但不是将它们放在 /etc/yum.repos.d 和实际使用的存储库中,而是将它们放在 /usr/share/rpmdistro-repoquery (或者,如果您愿意,您可以克隆存储库并使用结帐中的定义)。 然后使用自定义配置文件和自定义缓存位置调用 DNF,该位置指向其中一个发行版的存储库之一,而不是默认位置。
各种受支持的发行版都带有默认启用的相关存储库。 有些有额外的存储库需要明确启用。 为了 example,默认情况下源代码库是关闭的。 此外,CentOS Stream 配置附带 SIG 组件的额外回购协议,默认情况下是关闭的。
这开辟了很多用例。 我在下面重点介绍其中一些。
注意:此工具的主要作者, 尼尔贡巴, 适用于许多基于 RPM 的 Linux 发行版。 我开始参与在 ebranch 中使用它。
现实生活中的 rpmdistro-repoquery 用例
快速查看 CentOS Stream 更新是否已进入镜像
在 Fedora的构建系统,更新通过 菩提,一旦它们被标记为测试或稳定,这意味着有一个包含这些更新的组合,并且它们往往会在不久之后击中镜像。
在 CentOS Stream 中,情况更为复杂,因为 QA 过程对公众不可见。 以铿锵声为 example: 给出一个 犯罪和一个匹配 曲构建 1 月 27 日,我们可以确定这是推送到镜子上的吗?
事实证明,截至 2 月 9 日,它还没有出现在镜子中:
$ rpmdistro-repoquery centos-stream 9 clang 2>/dev/null clang-0:14.0.0-1.el9.i686 clang-0:14.0.0-1.el9.x86_64 clang-0:14.0.5-1.el9.i686 clang-0:14.0.5-1.el9.x86_64 clang-0:14.0.6-1.el9.i686 clang-0:14.0.6-1.el9.x86_64 clang-0:15.0.1-2.el9.i686 clang-0:15.0.1-2.el9.x86_64 clang-0:15.0.7-2.el9.i686 clang-0:15.0.7-2.el9.x86_64
比较不同发行版中打包的内容
场景:您使用/管理不同分布的异构车队。 你想知道是否所有你需要的包都可用(因为你可能需要打包缺少的东西)。
让我们看看是否 myrepos 在 openSUSE Tumbleweed(滚动发行版)上可用:
$ rpm -q myrepos myrepos-1.20180726-14.fc37.noarch $ rpmdistro-repoquery opensuse-tumbleweed 0 myrepos $ rpmdistro-repoquery opensuse-tumbleweed 0 /usr/bin/mr mr-0:1.20180726-1.9.noarch
搜索的 Fedora Linux 包名称没有产生任何结果,但在这种情况下,通过二进制搜索显示匹配项(因为它们在 RPM 元数据中):myrepos 可用,但您需要在配置管理中使用不同的包名称。
分支机构
这是前者的特例。 分支机构 是分支的工具 Fedora EPEL 的 Linux 软件包。
鉴于 CentOS Stream(及其下游,如 Red Hat Enterprise Linux、AlmaLinux 和 Rocky Linux)仅承载 Fedora Red Hat 承诺支持的 Linux 软件包,EPEL 为社区提供了一种方法来维护针对 RHEL(或 CentOS Stream)构建的其他软件包。
这里的一个主要问题是处理依赖地狱:一个丢失的包可能有几个丢失的依赖项,而这些依赖项又缺少更多的依赖项…… EPEL 9 中的 retsnoop 共涉及分支189个包!
ebranch 利用 rpmdistro-repoquery 比较 Rawhide(rpmdistro-repoquery fedora rawhide)和 CentOS Stream + EPEL(rpmdistro-repoquery centos-stream-legacy 8 和 rpmdistro-repoquery centos-stream 9)中可用的内容以构建缺少依赖项的传递闭包并报告任何依赖项循环。 ebranch 还为缺失的依赖项计算链构建顺序,对可以并行构建的包进行分组。
检查 soname 碰撞的影响
Fedora的 更新稳定版本的政策 和 EPEL 的 不兼容的升级政策 两者都不鼓励破坏 ABI 的更新,但有时它们是必要的,例如 库转储文件 在 EPEL 中。
使用 rpmdistro-repoquery,找到它支持的任何两个发行版之间的差异是微不足道的:
$ comm <(rpmdistro-repoquery fedora rawhide --provides libkdumpfile >/dev/null) <(rpmdistro-repoquery centos-stream 9 --provides libkdumpfile >/dev/null) libaddrxlat.so.2()(64bit) libaddrxlat.so.2(LIBADDRXLAT_0)(64bit) libaddrxlat.so.3 libaddrxlat.so.3()(64bit) libaddrxlat.so.3(LIBADDRXLAT_0) libaddrxlat.so.3(LIBADDRXLAT_0)(64bit) libkdumpfile = 0.4.1-5.el9 libkdumpfile = 0.5.0-3.fc38 libkdumpfile(x86-32) = 0.5.0-3.fc38 libkdumpfile(x86-64) = 0.4.1-5.el9 libkdumpfile(x86-64) = 0.5.0-3.fc38 libkdumpfile.so.10 libkdumpfile.so.10()(64bit) libkdumpfile.so.10(LIBKDUMPFILE_0) libkdumpfile.so.10(LIBKDUMPFILE_0)(64bit) libkdumpfile.so.9()(64bit) libkdumpfile.so.9(LIBKDUMPFILE_0)(64bit)
同样,找到所述更新的爆炸半径:
$ rpmdistro-repoquery centos-stream 9 --whatrequires "libaddrxlat.so.2()(64bit)" libkdumpfile-devel-0:0.4.1-5.el9.x86_64 libkdumpfile-util-0:0.4.1-5.el9.x86_64 python3-libkdumpfile-0:0.4.1-5.el9.x86_64 $ rpmdistro-repoquery centos-stream 9 --whatrequires "libkdumpfile.so.9()(64bit)" drgn-0:0.0.22-1.el9.x86_64 libkdumpfile-devel-0:0.4.1-5.el9.x86_64 libkdumpfile-util-0:0.4.1-5.el9.x86_64 python3-libkdumpfile-0:0.4.1-5.el9.x86_64 $ rpmdistro-repoquery centos-stream-legacy 8 --whatrequires "libaddrxlat.so.2()(64bit)" libkdumpfile-devel-0:0.4.1-5.el8.x86_64 libkdumpfile-util-0:0.4.1-5.el8.x86_64 python3-libkdumpfile-0:0.4.1-5.el8.x86_64 $ rpmdistro-repoquery centos-stream-legacy 8 --whatrequires "libkdumpfile.so.9()(64bit)" drgn-0:0.0.22-1.el8.x86_64 libkdumpfile-devel-0:0.4.1-5.el8.x86_64 libkdumpfile-util-0:0.4.1-5.el8.x86_64 python3-libkdumpfile-0:0.4.1-5.el8.x86_64
构建操作系统映像
姆科西 是用于生成操作系统映像的工具; 目前它包含不同分布的逻辑(例如 Fedora, 中央操作系统), 但这很难, 因为 example为 CentOS SIG 构建镜像,例如 超大规模.
和 Daan De Meyer 的重构 rpmdistro-repoquery 的 repo 文件现在可以被 mkosi 重用,所以在未来,定制用于构建操作系统映像的存储库应该容易得多。
结论
这个工具的贡献者发现它在我们的 Linux 发行版工作中非常有用,我们希望这篇文章可以帮助将它介绍给同样发现它有用的其他人。
请自己尝试 — on Fedora Linux,以及任何 CentOS Stream 或衍生产品 EPEL 启用,只需执行以下操作:
$ sudo dnf install rpmdistro-repoquery
如果不支持您要使用的发行版, 拉 要求 受欢迎的! 同样与 建议 或者 要求. 如果你想在不同的发行版中打包 rpmdistro-repoquery,请随意使用 这 Fedora 包装 作为参考。