最近,我正在构建一个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来散列文件争用。
答案 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相关))和包冲突。