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

时间:2017-01-12 16:20:32

标签: linux rpm opensuse rpmbuild rpm-spec

我试图强制rpm遵循给定的安装订单,但它无法按预期工作。我添加的Requires条款没有得到尊重。

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

来纠正它
Requires: pam-script
Requires: openssh

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

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

rpm -qp --requires文件上的

.rpm显示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 --listfile)之外没什么了不起的。我应该考虑哪些其他类型的东西来调试它?这些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,这是将来的!如果我停在红宝石,那就行了。如果我停在pam脚本,它的工作原理。如果我停止使用suse-module-tools,它会抱怨对dracut的依赖。因此,我想知道RPM是否在相互依赖性关键部分中放弃了它的排序原则,或者是否存在依赖性,我还没有发现它。我正在使用rpm -q --requiresrpm -q --provides来解决这个问题。请继续关注。

1 个答案:

答案 0 :(得分:1)

您可以向Requires标记添加更多显式子字段,例如Requires(post): openssh-serverRequires(pre,post): openssh-server

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

另一种选择是将所需的配置放入%triggerin节,我相信仅在安装两个软件包后执行。