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了。


相关文章

分类

留言:

关于文章

This page contains a single entry by DongHao published on 01 20, 2011 1:23 PM.

tilera试用 was the previous entry in this blog.

ext2/ext3/ext4 文件系统初探 is the next entry in this blog.

Find recent content on the main index or look in the 存档 to find all content.