卸载后是否可以将 RPM 内容保留在文件系统中?
基本上,当有人运行 rpm -e 时,我不想删除 RPM 生成的文件,但仍然从已安装的 RPM 列表中删除该软件包。我想从服务器手动卸载我的应用程序,但我找不到这样做的方法。
提前致谢。
从这个角度,作为包创建者,您可以将文件标记为配置。Cambridge Uni 的 John Warbrick 对您可以在 RPM 规范文件中使用的不同文件标记以及它们在升级期间的行为方式进行了很好的概述。
标记为%config
的文件(如果已更改)为:
.rpmsave
扩展名重命名.rpmnew
扩展名Warbrick 不处理直接删除包:如果标记%config
为未更改的文件,擦除包将删除该文件。(请记住,根据RPM scriptlet 的顺序,RPM更新或重新安装从删除旧包开始,在新文件放下之前。即,旧的未更改配置被新配置替换。)
%config
标记不是真正配置的东西将是滥用 RPM 文件分类。这很重要,因为系统管理员需要能够信任包有效负载。另外,您可能不希望使用扩展名重命名此类文件。
您最大的希望是在 RPM %post 期间创建文件。复制到文件系统的文件根据列表%install
检查%files
并存储在 RPM 数据库中,但创建的文件%post
不是。同样,这是对 RPM 规范文件格式的滥用,但如果您在%description
和任何其他文档中提到它,特别是如果它在您的包的上下文中是合乎逻辑的预期行为,您可能会得到一些同情。
对于想要删除软件包而不删除其有效负载的系统管理员,您可以使用rpm --justdb
. 首先,检查文件列表:
# rpm -ql $PACKAGE | tee $PACKAGE.payload
[rpm returns list of files, tee saves it in the file $PACKAGE.payload]
# rpm -e --justdb $PACKAGE
(在这个阶段,您可能会收到有关 deps 的投诉,因此--nodeps
如果必须,请重复。)
最后,检查包是否已经消失,但有效载荷仍然存在:
# rpm -q $PACKAGE
package $PACKAGE is not installed
# ls -l $(<$PACKAGE.payload)
[ls queries list of files saved in $PACKAGE.payload]
(或者如果文件名包含空格,则更可靠ls
,这在 RPM 中是不合情理的。)
# cat $PACKAGE.payload|xargs -d '\n' ls -l
请注意,对于使用我的答案顶部概述的方法创建的包,尝试列出它拥有的文件rpm -ql $PACKAGE
将不会显示这些持久文件。在此期间丢弃文件的另一个后果%post
是“拥有”这些文件的另一个包可能会意外地覆盖它们——它们没有在 RPM 数据库中列出,因此它们不受保护。
我概述的两种方法都破坏了 RPM 包创建和系统管理员的最佳实践。请非常小心如何使用这种危险的“小知识”。也许您还可以采取其他措施来创造理想的情况。
(最后,我知道这是四年前的一个问题。它没有得到回答。它需要回答。干杯。)
rpm -e --repackage package_name
将在/var/spool/repackage
. rpm2cpio
如果您需要单独返回这些文件,您可以从该 rpm 中提取。
RPMS 的优点之一正是:您可以轻松卸载(删除)所有文件。如果您想手动安装 RPM 提供的文件,只需以 root 身份解压 RPM,使用:
cd / && rpm2cpio *.rpm | cpio -idmv
这不是一个好主意,但是您可以在其他地方(例如在 ${HOME} 下)解压缩 RPMS,这非常有用。不过,您可能需要调整一些环境变量。您不会污染 RPM 数据库,但仍会使用 RPM 的内容。当然,您的应用程序可能会被系统更新破坏,因为它不受依赖项保护。无论如何,如果您不是 root,这就是您“安装”和 RPM 的方式。拆卸也很容易(如果选择合适的安装路径)。