【问题标题】:How RPM detect conflicts?RPM 如何检测冲突?
【发布时间】:2015-10-05 08:44:28
【问题描述】:

最近,我正在构建一个 rpm 包。我跑了sudo rpm -ivh A.rpm,但是得到了一个错误file _binary_ from install of A conflicts with file from package B,我之前遇到过这个问题,是因为我制作的_binary_不同。现在我查看了两个rpm中的_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 对文件内容进行哈希处理。

【问题讨论】:

    标签: rpm rpmbuild


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 什么决定一个包一样?我安装了拥有相同文件的包,但现在它输出冲突,我不知道如何检查问题。
      • 如果两个不同的包(不同的名字)试图安装同一个文件,RPM 会报错。它不允许这样做。你在这里处理什么包?
      • 它不是公共包,是我自己制作的(用于Ksplice热更新Linux内核,Ksplice决定卸载后不删除)。有没有可能低版本的rpm允许同名的文件(内容也一样),但高版本的rpm不允许同名的文件(不是说内容)?我在rhel5上测试,还可以,但是rhel6失败了。
      • 新版本的 rpm 完全有可能变得更加严格,尽管我认为他们在这方面没有这样做(但我没有尝试过知道)。您正在打包哪些其他包已经拥有的文件?内核映像文件?
      • Perl 脚本将 Ksplice 封装到热更新中,因为如果它被移除,属于其他包的其他补丁将无法再撤消。
      【解决方案3】:

      我通过添加强制散列算法的解决方法解决了这个问题

      %global _source_filedigest_algorithm    md5
      %global _binary_filedigest_algorithm    md5
      

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

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-07-09
          • 1970-01-01
          • 1970-01-01
          • 2012-03-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多