linux - RPM 无法遵循安装时的依赖顺序

标签 linux rpm opensuse rpmbuild rpm-spec

我试图强制 rpm 遵循给定的安装顺序,但它没有按预期工作。我添加的 Requires 子句没有得到遵守。

我正在做裸机 Linux 安装程序(基于 openSUSE 42.2)。整个系统——数百个包——用一个 RPM 命令安装(使用 --root)。我在使用三个包时遇到了问题——pam-config、pam-script 和 openssh。 pam-config %post 脚本尝试修改包含在 pam-script 和 openssh 中的文件,但默认情况下在它们之前安装。默认情况下它没有依赖项,因此,有了源代码,我通过添加纠正了这一点:

Requires: pam-script
Requires: openssh

pam-config.spec。 (我还尝试了 Prereq:,结果相同。)正如预期的那样,通过此更改,它切换了 pam-script 的顺序并且该错误消失了。但它坚决拒绝改变openssh的安装顺序,在pam-config之后安装两个包。 [Openssh 依赖于 coreutils 和 shadow (pwdutil),此时两者都已安装。它还依赖于 (PreReq) 一个神秘的宏,%{fillup_prereq}。]

其他一切安装(和运行)都很好,但我想更好地理解 rpm 是如何工作的。我想如果我使用 Required: 在 pam-config 中指定 openssh,那 openssh 总是会在 pam-config 之前安装。它适用于 pam 脚本。

.rpm 文件上的

rpm -qp --requires 显示 openssh。我使用 -vv 选项而不是 -v 重复安装。我可以看到列出的 openssh 的 Requires: 与 pam-script 一样(YES (added provide))。我看到 pam-config-0.91xxx -> openssh-7.2p2xxx 列在 SCC#8: 11 members (100 external dependencies) 下。我看到了 pam-config 的安装,它没有依赖信息,除了生成错误的 %post scriptlet 命令之外没有什么特别的 (pam-config --service sshd --delete - -列表文件)。我应该查看哪些其他类型的东西来调试它?这些 SCC 是什么?我是否遗漏了有关 Requires 的内容?或者是否有一些我可能忽略的晦涩的东西,比如循环、间接或隐藏的依赖关系(我已经检查过,但排除了它)?我看过几个 RPM 教程并进行了一些网络搜索,但一无所获。

更新:与 pam-script 不同,openssh 似乎陷入了相互依赖的临界区。这是实际安装的包的顺序:

ruby2.1-rubygem-ruby-dbus-0.9.3-4.3.x86_64.rpm
pam-script-1.1.6-1.os42.gb01.x86_64.rpm
suse-module-tools-12.4-3.2.x86_64.rpm
kmod-17-6.2.x86_64.rpm
kmod-compat-17-6.2.x86_64.rpm
libcurl4-7.37.0-15.1.x86_64.rpm
pam-config-0.91-1.2.os42.gb01.x86_64.rpm
systemd-sysvinit-228-15.1.x86_64.rpm
krb5-1.12.5-5.13.x86_64.rpm
openssh-7.2p2-6.1.SBC.os42.gb01.x86_64.rpm
dracut-044-12.1.x86_64.rpm
systemd-228-15.1.x86_64.rpm

如果我在生产系统上进行安装并在 pam-config 之前停止,它会提示依赖于 krb5,这是 future 的事!如果我停在 ruby 上,它就会起作用。如果我停在 pam-script,它就可以工作。如果我在 suse-module-tools 处停止,它会提示对 dracut 的依赖性。所以我想知道 RPM 是否在相互依赖的关键部分中放弃了它的排序原则,或者是否存在我尚未发现的依赖关系。我正在使用 rpm -q --requiresrpm -q --provides 来解决这个问题。请继续关注。

最佳答案

您可以向 Requires 标签添加更明确的子字段,例如Requires(post): openssh-serverRequires(pre,post): openssh-server

单个 RPM 事务不是真正原子的,但会以这种方式处理。如果没有这些附加信息,它只会确保软件包在此交易结束时安装完毕,这在大多数情况下“足够好”。

另一种选择是将所需的配置放入 %triggerin 节,我相信只有在两个包都安装后才会执行。

关于linux - RPM 无法遵循安装时的依赖顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41618124/

相关文章:

dependencies - 如何在 setup.py 中包含 rpm 依赖项

linux - OpenSuse 中的 Realtek WiFi 问题

linux - 如果我有很多内存,我应该创建交换分区吗?

linux - Rsync:排除目录内容,但包含目录

java - Linux PC 和 Android 之间的 Wifi 文件传输

linux - 更改 python 头文件目录以进行配置

c - 如何在linux中使用c time打印函数运行时间?

linux - 如何告诉 rpm 查看特定目录的依赖项?

java - 在 Windows 下从 ANT 脚本创建 RPM 包

java - 模态对话框位于 Opensuse 上其他窗口的背面