我计划创建一个RPM,它将提供一些自定义文件(这些文件是全新的),并且还将替换一些预先存在的文件,例如/etc/resolv.conf文件。虽然我能够使用我的自定义RPM提供新的/etc/resolv.conf文件,但我想备份以前存在的文件,如果我卸载这个自定义RPM,它应该会恢复运行。任何关于如何实现这一点的想法将不胜感激。
答案 0 :(得分:2)
如果你在谈论随包提供的配置文件,那么我会说%config
部分中的%file
语句是可行的方法。请参阅:RPM, %config, and (noreplace)
但是,在您的情况下,您正在讨论更改由其他软件包提供的文件。
这虽然不是最佳的,但可能需要使用%pre
和%postun
scriptlet来备份和恢复文件。
如果当前操作是安装/卸载或升级,您的scriptlet可以依赖于$1
变量来告诉您的包。
请参阅中的安装/删除时间脚本部分 Maximum RPM book, Chapter 13. Inside the Spec File
示例:强>
假设您的系统上安装了existing-1.0-norach.rpm
:
%files
%config(norplace) /etc/existing
并且您希望custom-0.1-noarch.rpm
需要替换/etc/existing
:
您可以在custom.spec
文件中找到:
%files
%config(noreplace) /etc/%{name}/existing
和
%post
# backup existing file, and replace with a symlink to custom file.
if [ $1 -eq 1 ] ; then
mv /etc/existing /etc/existing.%{name}
ln -s /etc/%{name}/existing /etc/existing
fi
%preun
# remove symlink to custom file and restore original.
if [ ( $1 -eq 0 ) -a ( -l /etc/existing ) ] ; then
rm /etc/existing
mv /etc/existing.%{name} /etc/existing
fi
备注:强>
rpm -ql
,rpm -qf
以及通过查看符号链接指向的内容来确定哪个文件属于哪个包。%config(noreplace)
通常会做正确的事情。如果在existing-1.0-norach.rpm
之后安装custom-0.1-noarch.rpm
或在此之前删除custom-0.1-noarch.rpm
,情况也是如此。%require
existing-1.0-norach.rpm
resolve.conf
。这使您的设置不那么灵活,但您不需要考虑安装顺序的所有排列。/etc/sysconfig/
的情况属实,此文件的真实来源位于%config
下的某处。所以你不应该为这些文件尝试这个配方。 警告:我看到这种技术被误用了。以这种方式编写的规范通常会变成一个可怕的混乱,表现出乎意料,与其他软件包交互不良,并且将您的灵魂窃取到漫长而丑陋的调试会话中。如果可能的话,尝试使用%config(noreplace)
和{{1}},它已经被加入到RPM中,虽然不能完全满足您的要求,但要以简单可靠的方式完成它。