rpmdistro-repoquery:一个跨发行版的 repoquery 工具

本文展示了 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 包装 作为参考。