自定义RPM,用于传送文件和备份任何预先存在的同名文件

时间:2014-01-15 19:20:46

标签: rpm rpmbuild

我计划创建一个RPM,它将提供一些自定义文件(这些文件是全新的),并且还将替换一些预先存在的文件,例如/etc/resolv.conf文件。虽然我能够使用我的自定义RPM提供新的/etc/resolv.conf文件,但我想备份以前存在的文件,如果我卸载这个自定义RPM,它应该会恢复运行。任何关于如何实现这一点的想法将不胜感激。

1 个答案:

答案 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 -qlrpm -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。这使您的设置不那么灵活,但您不需要考虑安装顺序的所有排列。
  • 在某些发行版中,某些配置文件不是由软件包提供的,而是由其他文件生成的。 IIRC,RedHat和Suse分发中/etc/sysconfig/的情况属实,此文件的真实来源位于%config下的某处。所以你不应该为这些文件尝试这个配方。

警告:我看到这种技术被误用了。以这种方式编写的规范通常会变成一个可怕的混乱,表现出乎意料,与其他软件包交互不良,并且将您的灵魂窃取到漫长而丑陋的调试会话中。如果可能的话,尝试使用%config(noreplace)和{{1}},它已经被加入到RPM中,虽然不能完全满足您的要求,但要以简单可靠的方式完成它。