如何使用rpm更新/替换现有文件?

24

我有几个应用程序想使用rpm进行部署。其中一些文件会覆盖其他已部署软件包中的文件。简单地将新文件包含在部署软件包中将导致rpm冲突。

我正在寻找正确的方法来使用rpm更新/替换已安装的文件。

我已经想出了一些解决方案,但似乎都不太对。

  • 维护包含原始文件的自定义软件包版本。

即使这听起来比其他可能的解决方案更像一个专业技巧,但为了相对较小的回报而言,这似乎需要大量工作。

  • 使用另一个名称在rpm中包含文件,并在post节中复制它们。

这样做可以行得通,但意味着在系统上散布多个副本的文件。此外,这意味着每个文件在rpm构建规范中需要额外进行维护。

  • 在post节中使用wget替换某些已知服务器中的原始文件。

这与复制技术类似,但是文件甚至不会存在于rpm中。这可能表现得像一个不错的集中配置管理机构。

  • 将文件部署为新文件,然后使用符号链接覆盖原始文件。

这也类似于复制技术,但是更少的杂乱。问题在于某些文件作为符号链接时不会表现良好。

3个回答

10
据我所知,RPM不是设计用于允许更新/替换现有文件的,因此你所做的任何操作都将成为一个hack。
在你列出的选项中,如果目标系统是我管理的系统(如你所说,这需要更多的工作但是是最干净的解决方案),我会选择#1;如果我正在为别人的系统创建RPMs(避免分发一堆RPMs,但我会在文档中非常清楚地说明我的操作采用了组合方式#2和#4(尽可能使用符号链接,无法使用时复制)。
你没有描述哪些文件需要更新或替换以及它们需要如何更新。根据这些问题的答案,你可能会有一些其他选项:
- 许多程序被设计为使用单个默认配置文件,并从` .d `子目录中获取配置文件。例如,Apache使用` /etc/httpd/conf/httpd.conf `和` /etc/httpd/conf.d/*.conf `,因此您的RPM可以将文件放在` /etc/httpd/conf.d `下而不是修改`/etc/httpd/conf/httpd.conf`。如果需要修改的文件是不遵循此模式但可以进行修改的配置文件,则可以建议软件包维护者添加此功能。这不会立即帮助到您,但会使未来的版本更容易。 - 对于像` sendmail `和` lpr `这样可以由多个软件包提供的命令行实用程序,` alternatives `系统(请参见` man alternatives`)允许安装提供这些实用程序的超过1个RPM。同样,如果需要修改的文件是不遵循此模式但可以进行修改的命令行实用程序,则可以建议软件包维护者添加此功能。
  • 在您管理的系统上进行配置文件更改最好通过像CfenginePuppet这样的工具管理,而不是通过自定义RPM。我认为Red Hat更偏爱Puppet。
  • 如果我要为我不管理的系统创建RPM,我会考虑使用Bitrock等第三方工具,并将所有内容都放在/opt下,这样我就不必覆盖其他管理员安装的RPM文件。
  • 编辑(2019):现在,软件集合提供了有用的替代方案。您可以创建安装在/opt下的软件包,而软件集合工具则提供了一种标准化的方式,让用户选择使用这些软件包,而不是通常安装在/usr下的东西。Red Hat使用此方法为他们的稳定和长寿命(即旧版)Red Hat Enterprise Linux发行版分发较新版本的工具。

  • 据我所知,RPM并不是为了允许更新/替换现有文件而设计的,因此你所做的任何事情都将是一种hack。但这并不完全正确——配置文件是原始所有者明确允许更新和替换的。否则,是的,你在这方面已经正确了十年。 :-) - Rich
    %post中,黑客可以更改属于另一个RPM的文件,但当其他软件包更新并整理其内容时,它还需要在%triggerin -- otherpackage中具有相同的条款。再次强调,您列出的所有其他内容都是正确的答案。 - Rich

    5

    您也可以执行 rpm -U --replacefiles --replacepkgs ... 命令,这将满足您的需求。


    不完全正确。虽然安装会替换文件,但该操作并非持久性的。下一次升级将撤消--replacefiles。请注意,除非软件包具有相同的名称,否则--replacepkgs基本上是无关紧要的。 - Jeff Johnson
    1
    同时,当用户从yum服务器拉取您的软件包时,您不能指望它能够正常工作。 - Jolta

    3
    请参阅以下链接以获取有关RPM%files指令的更多信息: http://www.rpm.org/max-rpm/s1-rpm-inside-files-list-directives.html 您可以使用RPM脚本中的%post和%pre部分的参数来确定您是安装,升级还是删除软件包。
    如果$1为0-则我们正在删除旧内容。 目标是卸载0个软件包。 如果$1为1-则我们正在安装新内容。 目标是安装1个软件包。 如果$1为2或更多-则我们正在升级此软件包,并且$1表示已安装的软件包数量。
    这些部分有助于在不同版本之间管理文件。 在版本之间跟踪您正在进行的操作,并考虑如果跳过一两个版本可能会发生什么。
    请考虑这些事情,您就可以开始了!

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接