httpd
安装64 位和 32 位软件包时遇到问题。
当通过卸载其中一个软件包时yum remove
,它会删除某些共享文件,例如/etc/httpd/conf/httpd.conf
.
有没有办法通过rpm
或排除文件的删除yum
?我查看了两个man
页面,但没有看到任何相关选项。
顺便说一句:我知道我们可以备份文件并在卸载后恢复它们。我只是想知道是否有更干净、更优雅的选择。
答案1
不理想,但我刚刚解决了类似的问题,将rpm -e --justdb
pkg 记录为已删除而不删除文件。我有旧的rpm
v4.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 rpm
if来看还不清楚。也可能需要。--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 已经指出的那样。