如何删除 rpm 包同时保留某些文件

如何删除 rpm 包同时保留某些文件

httpd安装64 位和 32 位软件包时遇到问题。

当通过卸载其中一个软件包时yum remove,它会删除某些共享文件,例如/etc/httpd/conf/httpd.conf.

有没有办法通过rpm或排除文件的删除yum?我查看了两个man页面,但没有看到任何相关选项。

顺便说一句:我知道我们可以备份文件并在卸载后恢复它们。我只是想知道是否有更干净、更优雅的选择。

答案1

不理想,但我刚刚解决了类似的问题,将rpm -e --justdbpkg 记录为已删除而不删除文件。我有旧的rpmv4.4.2.3,其中仅在安装部分man rpm列出--justdb,而不在删除部分列出,但它也适用于删除。

概述:

  • 列出每个 pkg 声明的文件列表
  • 从数据库中删除传出的 pkg 而不删除内容rpm -e --justdb PKG
  • 整理,删除已删除的 pkg 声明但剩余的 pkg 未声明的文件

准备

pkg_keep="asterisk-core-1.6.2.24-1_centos5"
pkg_del="asterisk16-core-1.6.2.20-2_centos5"

# Record files claimed by each package
rpm -ql "${pkg_del}" > "files.${pkg_del}"
rpm -ql "${pkg_keep}" > "files.${pkg_keep}"

列出由传出 pkg 声明但其余 pkg 未声明的文件。 警告: --line-regexp很重要,因此 eg/file不会被过滤掉/file2

grep -v -F --line-regexp -f "files.${pkg_keep}" "files.${pkg_del}" > files.cleanup

从 RPM DB 中删除传出的 PKG,而不删除其文件。从隐含的man rpmif来看还不清楚。也可能需要。--noscripts--justdb--nodeps

rpm -e --justdb --noscripts "${pkg_del}"

审查小心的内容files.cleanup,并删除其中列出的文件。

虽然您可以自动删除 IMO 中列出的文件,但files.cleanup在这里给出执行此操作的命令可能会伤害复制/粘贴读者。

etckeeper另外,如果您所关心的只是在 下,那么使用类似的东西会有所帮助/etc/

答案2

听起来好像对包进行了配置,因此 httpd.conf 文件未声明为“配置”文件,因此在删除包时它们不会被保存。如果 httpd.conf 已声明为配置文件并在安装后更改,则在删除软件包期间它将被保存为 httpd.conf.rpmsave。看http://ftp.rpm.org/max-rpm/ch-rpm-erase.html有关删除包期间采取的步骤。

您必须提前预测这种情况,以便做好准备 - 正如您所提到的,通过文件备份和恢复,或者通过使用rpm -qc <package>.

  • 如果您查询包的配置文件并执行了不是在其中找到 httpd.conf,那么您可以预期该文件会在软件包删除过程中被删除,并且可以提前将其复制到安全的地方。

  • 如果包裹做过将 httpd.conf 列为配置文件,然后:(1) 您对该文件进行了有意义的更改,并且它将在软件包删除期间保留下来,或者 (2) 自软件包安装以来该文件未更改,并且将是 (无害地)在包装移除过程中被移除。

答案3

可悲的是(或者幸运的是,取决于您如何看待它)没有选择性文件删除之类的东西。我的建议是列出文件、标记为此类的配置文件以及每个相关包的文档,并浏览您想要保留的列表。

使用

  • rpm -ql packagename用于列出文件
  • rpm -qc packagename用于列出配置文件
  • rpm -qd packagename用于列出文档文件

并浏览这些列表并手动为应该是配置文件但未标记为配置文件(即出现在rpm -ql输出中)的文件创建备份,正如 @Jeff Schaller 已经指出的那样。

相关内容