rpm spec文件里的%postun

DongHao 2011-01-20 13:23

写了一个用于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了。

[返回] [原文链接]