rpm spec文件里的%postun
写了一个用于rpm打包装包的spec文件,大概如下:
%post
insmod hello.ko
%postun
rmmod hello.ko
%post段里是在rpm安装完成后执行的脚本,%postun段则是在rpm包卸载后执行的脚本
现在,这个rpm正常工作,安装后会自动加载hello.ko,卸载后会自动移除hello.ko
但是,麻烦出现了,当我们用yum来update这个包时,发现包在update后居然没有加载hello.ko。原来,yum的update操作实际执行了(假设旧包叫old_pack,新包叫new_pack):
1. new_pack %install
2. new_pack %post
3. old_pack %postun
在新包%install和%post执行后,旧包才执行%postun,结果,新包刚insmod的hello.ko,旧包的%postun把它给rmmod了。yum这样执行有它的道理:new_pack万一执行失败,还能回滚。
那么,这个%postun要怎么写呢?
查了半天,终于找到了一篇文档 http://www.ibm.com/developerworks/library/l-rpm2/ ,感谢Martin Streicher同学的详细介绍。
只要在%postun里判断第一个参数的值,就可以知道现在是执行update还是在执行uninstall,于是,正确的spec应该是
%post
insmod hello.ko
%postun
# if uninstall then rmmod
if [ "$1" = "0" ]; then
rmmod hello.ko
fi
这样,在update的时候,就不会误卸载hello.ko了。
相关文章
- 制作rpm之spec文件小提示 - 08 11, 2009
- fedora 9 小集 - 01 05, 2009
- 多线程调试 - 12 17, 2008
留言: