RPM如何检测冲突?

时间:2015-07-16 03:59:49

标签: rpm rpmbuild

最近,我正在构建一个rpm包。我跑sudo rpm -ivh A.rpm,但收到错误file _binary_ from install of A conflicts with file from package B,之前我遇到过这个问题,这是因为我所做的_binary_的区别。现在我在两个rpms中检查_binary_,有相同的,我想问一下在rpm安装过程中是否还有其他具体原因导致冲突?

我抛弃了已安装的软件包,它就像

一样

$rpm -ql --dump khotfix-g4hk4hzq-2.6.32-220.23.2.ali878.el6.x86_64-1.0-1.el6.x86_64 ... /usr/local/sbin/ksplice-undo 6436 1428483796 f3dbddfb7820413cc4d97cda2df9388a 0100755 root root 0 0 0 X ... ksplice-undo是md5 f3dbddfb7820413cc4d97cda2df9388a

我丢弃了要安装的软件包,它像

一样输出

$rpm -qlp --dump khotfix-35692936-2.6.32-220.23.2.ali878.el6.x86_64-1.0-1.el6.x86_64.rpm ... /usr/local/sbin/ksplice-undo 6436 1437038808 a6dc8be59d4a2627b73240adcca41716d8ea0001d9d5cd973694e8779ef9d6b1 0100755 root root 0 0 0 X ... ksplice-undo md5为a6dc8be59d4a2627b73240adcca41716d8ea0001d9d5cd973694e8779ef9d6b1

然后我运行$cat /usr/local/sbin/ksplice-undo | md5sum,输出为f3dbddfb7820413cc4d97cda2df9388a

我通过运行$rpm2cpio khotfix-35692936-2.6.32-220.23.2.ali878.el6.x86_64-1.0-1.el6.x86_64.rpm | cpio -div $cat ./usr/local/sbin/ksplice-undo | md5sum解压缩要安装的打包,输出为f3dbddfb7820413cc4d97cda2df9388a

所以,我猜这是转储输出中的md5导致冲突,并且散列值比md5输出长。较高版本rpm使用sha256来散列文件内容,但较低版本rpm使用md5来散列文件争用。

4 个答案:

答案 0 :(得分:2)

rpm会查看%files部分中使用的路径名,并考虑使用%exclude标记告诉它忽略的路径名。虽然您可以使用--replacefiles选项覆盖,并安装冲突的文件,但这通常不是一个好主意,因为对软件包的更新将需要额外的覆盖,并且通常yum升级将失败。

因为rpm只查看这个路径名列表,所以你可以(以复杂的代价)设计附加软件包,这些软件包在安装前/安装后的脚本中重命名另一个软件包的文件(并放置它们的在所需的地方拥有文件。例如,我发现这在某些情况下很有用,在这种情况下,供应商已打包其产品的配置文件,而没有在带有%config的规范文件中标记它们。它会干扰rpm -V验证包,但替代方案似乎更糟。

答案 1 :(得分:0)

rpm并不关心文件的内容。它关心两个包声称拥有该文件。它不允许这样做(除了我认为具有不同架构的两个相同的包拥有一个公共文件)。

此刻文件可能相同,但以后情况可能并非如此。它还使得删除其中一个软件包时rpm必须执行的操作变得复杂(是否删除了文件)?

简而言之,不要有两个包含相同文件的包。

答案 2 :(得分:0)

我通过添加强制哈希算法

的解决方法来解决此问题
%global _source_filedigest_algorithm    md5
%global _binary_filedigest_algorithm    md5

但正如@Etan Reisner所说,这不是很好的设计,我应该将包文件重新排列为独立的包。

从我采取的步骤开始,rpm检查哈希值以检测冲突,但哈希算法可能会有所不同。

答案 3 :(得分:0)

rpm确实关心文件冲突(两个或多个包拥有相同的文件但这些文件不相同(或与multilib相关))和包冲突。

http://www.rpm.org/wiki/PackagerDocs/MultipleVersions