我试图强制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 --requires
和rpm -q --provides
来解决这个问题。请继续关注。
答案 0 :(得分:1)
您可以向Requires
标记添加更多显式子字段,例如Requires(post): openssh-server
或Requires(pre,post): openssh-server
。
单个RPM事务不是真正原子,但是这样处理。如果没有这些附加信息,它只会确保在此事务结束时安装软件包,这在大多数情况下都“足够好”。
另一种选择是将所需的配置放入%triggerin
节,我相信仅在安装两个软件包后执行。