23

我有几个希望使用 rpm 部署的应用程序。我的应用程序部署中的某些文件会覆盖其他已部署包中的文件。简单地在部署包中包含新文件会导致 rpm 冲突。

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

我已经提出了一些解决方案,但似乎没有什么是完全正确的。

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

尽管与其他一些可能的解决方案相比,这看起来不像是黑客攻击,但这似乎是一项相对较小回报的大量工作。

  • 将 rpm 中的文件包含在另一个名称中,然后将它们复制到帖子部分。

这会起作用,但意味着会在系统中乱扔文件的多个副本。这也意味着每个文件的 rpm 构建规范中的额外维护。

  • 在 post 部分使用 wget 替换来自某些已知服务器的原始文件。

这类似于复制技术,但文件甚至不会存在于 rpm 中。不过,这可能就像一个很好的中央配置机构。

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

这也类似于复制技术,但更简洁。这里的问题是某些文件不像符号链接那样表现得很好。

4

3 回答 3

10

据我所知,RPM 并非旨在允许更新/替换现有文件,因此您所做的任何事情都将成为黑客攻击。

在您列出的选项中,如果目标系统是我管理的系统(正如您所说,它的工作量更大,但它是最干净的解决方案)以及#2 和#4 的组合(如果我正在为其他人的系统创建 RPM(以避免分发一堆 RPM,但我会在文档中非常清楚地说明我在做什么)。

您还没有描述需要更新或替换哪些文件以及如何更新它们。根据这些问题的答案,您可能还有其他几种选择:

  • 许多程序设计为使用单个默认配置文件并从.d子目录中获取配置文件。例如,Apache 使用/etc/httpd/conf/httpd.confand /etc/httpd/conf.d/*.conf,因此您的 RPM 可以将文件放在下面/etc/httpd/conf.d而不是修改/etc/httpd/conf/httpd.conf. 如果您需要修改的文件是不遵循此模式但可以修改的配置文件,您可以建议包维护者添加此功能;这不会立即帮助您,但会使将来的版本更容易。
  • 对于可以由多个软件包提供的命令行实用程序sendmail,系统(请参阅参考资料)允许并排安装提供这些实用程序的 1 个以上的 RPM。同样,如果您需要修改的文件是不遵循此模式但可以修改的命令行实用程序,您可以建议包维护人员添加此功能。lpralternativesman alternatives
  • 您管理的系统上的配置文件更改最好通过CfenginePuppet等工具进行管理,而不是通过自定义 RPM。我认为 Red Hat 偏爱 Puppet。
  • 如果我为我不管理的系统创建 RPM,我会考虑使用像 Bitrock 这样的第三方工具并将我所有的东西都倾倒在下面/opt,这样我就不必踩其他管理员的 RPM 安装的文件.
  • 编辑(2019):如今,Software Collections提供了一个有用的选择。您可以创建/opt安装在/usr. Red Hat 使用它来分发更新版本的工具,用于其他稳定和长期(即较旧)的 Red Hat Enterprise Linux 发行版。
于 2009-04-06T17:32:53.857 回答
4

你也可以执行rpm -U --replacefiles --replacepkgs ...,这会给你你想要的。

于 2015-04-21T18:39:03.007 回答
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 代表已经安装的包的数量。

这些部分有助于管理版本之间的文件。跟踪您在不同版本之间所做的事情,并考虑如果他们跳过一两个版本可能会做什么。

考虑这些事情,你应该很高兴!

于 2013-09-11T17:05:04.160 回答