- 论坛徽章:
- 0
|
本帖最后由 duanjigang 于 2012-12-18 20:05 编辑
tag的说明就到此结束,下来看看spec中的
scripts 脚本
spec 中的脚本,也称为 hook 脚本,因为他们就想 netfilter 中的 hook 函数,就像 yum 的 plugin,在一个流程的不同点去执行,控制流程的行为,丰富流程的功能。
spec 中的脚本可以分为三大类,根据执行的场景划分:
(1): build 时脚本:在 RPM 的编译过程中执行
(2): 安装/卸载时脚本:在RPM的安装/升级/卸载时执行
(3): 校验时脚本: 在 RPM 命令校验已安装 RPM 时执行。
(4): 另外,还会再补充下 触发器(Trigger)脚本
build 时脚本:
作为开发人员可能都知道。源代码编译成二进制包,基本上分为以下不可缺少的四步:
- 1): 解压缩源码
- 2): 编译源码
- 3): 安装二进制程序/软件
- 4):清除编译环境
复制代码 对应于这四个不同的点,SPEC 提供了四个脚本hook点,每个hook点的声明:
- %hook_name #比如 %pre, %build, %install, %clean
- hook点的脚本内容
复制代码 每个hook点的脚本都会最终被存储到一个脚本文件中去解释,因此,在这些hook点,你就当是在写你的脚本文件。
在 %pre 这个hook点一般做的事情都是编译前环境准备,大致有:
- (1):创建工作的顶级目录
- (2): 把源代码解压缩到 build 目录。
- (3): 如果有patch定义的话,patch所有代码。
- (4): 其它事情,为代码build做好准备。
复制代码 %build hook点的脚本一般就是configure和build源码,比如 wget 的SPEC中的 %build 段是这么写的:
- %build
- ./configure --with-ssl=openssl
- make
复制代码 %install 是包build过程中安装到buid_root时执行的脚本。
最常见的执行脚本就是:
- %install
- make install prefix=$RPM_BUILD_ROOT/usr
- mkdir -p $RPM_BUILD_ROOT/usr/xxoo
- install binname $RPM_BUILD_ROOT/usr/xxoo/bin
复制代码 等。
%clean 这个hook点脚本是rpm build完成后执行的脚本,大多数内容是直接删除build 目录:
- %clean
- [ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT
复制代码 RPM 的 安装/升级/卸载 hook 脚本
在一个机器上第一次安装一个RPM,那是很容易而且简单的事情,但是,一旦目标机器已经安装了某个包,软件升级和卸载就不像
初次安装那么容易了。
我们很容易能想到的事情有:
第一:软件自带的默认配置文件,你可能在使用一段时间后,已经做了很多修改,当然不希望升级时默认的配置将其覆盖或者
软件卸载时将其删除。
第二:软件产生的数据和日志文件,有时我们希望都保留下来或者删除日志,保留数据等等。
要完成这些任务,仅仅靠RPM的文件安装功能是不能做到的,必须得在一些执行点执行某些命令来配合完成。
因此,RPM提供了四个安装/卸载时执行的hook函数可以潜入在RPM中,两个给安装用,两个给卸载用。
这种在一些列操作流程中注入hook操作点的方法,在软件中已经很常见了,比如 yum 的 branch插件,netfilter的hook模块等,都是
典型的范例。
%pre 段的命令会在 rpm 安装前执行
%post 段的命令会在 rpm 安装后执行。
%preun 段的命令会在 rpm 卸载前执行。
%postun 段的命令会在 rpm 卸载后执行。
然后看下 rpm 升级时 rpm 命令的流程。
RPM升级流程
(1): 执行 新版rpm 的 pre 段命令
(2): 安装新版RPM的文件列表
(3): 执行新版RPM的post 段命令
(4): 执行老版本rpm 的 preun 段命令
(5): 删除老版本RPM中没有被新版本RPM覆盖的文件(也就是说不再被新版本RPM使用的文件),这个过程是自动的。
(6): 执行老版本RPM的 postun 段命令。
关于以上这个顺序,一定要牢记和理解,因为,如果理解不对的话,在 rpm 升级时很可能就造成很大的差错。
举一个最常见的例子,好多人不知道老版本的rpm的文件在升级时会被自动删除掉,就认为需要人为来删除这些文件。
于是他会在rpm的 postun 中写入脚本去 rm -fr /安装目录。
这样会出现什么问题呢?
我们可以看到,卸载的话,是没问题的,先 preun, 再postun.
但是如果是升级呢?
最后一步执行的老版本的postun,这样的话,新安装的文件都会被干掉,导致不仅升级失败,而且原来的文件也丢失了。
为了保证 rpm 的制作者或者开发人员能够灵活的使用这四个hook,rpm 为 四个hook点的执行命令提供了一个参数,来区分是安装,还是升级
还是卸载操作,如下:
(1): %pre 如果参数是1,说明是初次安装,如果是2,说明是版本升级
(2): %post 参数1表示首次安装,2表示升级
(3): %preun 和 %postun 的参数如果是1,表示是升级
(4): %preun 和 %postun 的参数是0,表示是卸载。
hook点的命令默认是用shell解释期来解释执行的,当然你也可以自己定义解释器,比如:
- %pre -p /usr/bin/perl
- if ( $ARGV[0] == 1 ) {
- print "Preparing for initial install...\n"
- }
- elsif ( $ARGV[0] == 2 ) {
- print "Preparing to upgrade software...\n"
- }
复制代码 |
|