RPM(Red Hat Package Manager)是用于 Linux分发版(distribution)的最常见的软件包管理器。因为它允许分发已编译的软件,所以用户只用一个命令就可以安装软件。
1、 基本概念
RPM包命名方式:name-version-release.architecture.rpm ,如indent-2.2.6-1.x86_64.rpm,libevent-1.2-1.el6.x86_64.rpm等
RPM有五种基本的操作功能:安装、卸载、升级、查询和验证。这五种基本功能的实现仅仅需要用rpm + 选项 + rpm包就能轻易地实现。
安装:
rpm –ivhmysql-5.1.61-4.el6.i686.rpm
查询:
rpm –qa mysql:查询跟mysql有关的包。
删除:
rpm –emysql-5.1.61-4.el6.i686,一般的话都会先通过查询已经安装好的包,然后执行删除命令,上述命令,即可卸载掉系统安装好的rpm包。
升级:
rpm –Uvh mysql-5.1.61-4.el6.i686.rpm
验证:
rpm –Vmysql-5.1.61-4.el6.i686.rpm。对已经安装了的程序进行验证。
2、 一个简单的例子
为让读者明白生成RPM包的流程,我们在这里不使用默认目录,而是自行定义。
第一步,创建工作目录/data/rpmbuild
第二步,创建RPM打包过程所需子目录:
/data/rpmbuild/SPECS,存放rpmbuild打包所需要的spec文件
/data/rpmbuild/SOURCES,存放rpmbuild打包所需要的代码源文件
/data/rpmbuild/RPMS, 存放生成的rpm包
/data/rpmbuild/SRPMS, 存放生成的rpm源码包
/data/rpmbuild/BUILD, 打包过程的临时工作目录
/data/rpmbuild/BUILDROOT, 虚拟根目录,临时存放编译后文件
第三步,将源码文件放到SOURCES目录下
第四步:转入SPECS目录,编写indent.spec文件(文件名随意)
第五步,rpm -ba filename.spec –define “_topdir /data/rpmbuild”。执行完毕后再RPMS目录中可看到生成的RPM文件:
其中带有debuginfo的RPM包为包含调试信息的安装包,不需要的话忽略即可,也可以通过修改配置项使之不生成。
3、 SPEC文件详解
A. 文件头
Summary:一句话概括软件包尽可能多的信息
Name:将要打包的软件名称
Version:将要打包的软件的源码版本
Release:将要打包的软件的发布版本号
Vendor:软件开发者的名字
Copyright:软件包所采用的版权规则,如GPL、commercial等
License:软件所使用的许可证
Group:软件包所属的类别
Packager:封包者名称
Source:源代码包,可以带多个用Source1、Source2等源,后面也可以用%{source1}、%{source2}引用
BUILDROOT: 这个是安装或编译时使用的“虚拟目录”,考虑到多用户的环境,一般定义为:%{_tmppath}/%{name}-%{version}-%{release}-root或
%{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u}-n}
该参数非常重要,因为在生成rpm的过程中,执行make install时就会把软件安装到上述的路径中,在打包的时候,同样依赖“虚拟目录”为“根目录”进行操作。后面可使用$RPM_BUILD_ROOT 方式引用
Patch: 补丁源码,可使用Patch1、Patch2等标识多个补丁,使用%patch0或%{patch0}引用
Requires: 该rpm包所依赖的软件包名称,可以用>=或<=表示大于或小于某一特定版本,例如:libpng-devel >= 1.0.20 zlib
B. %description宏
软件的详细说明,这是SPEC文件中唯一可以跨行的部分,所以一般放在文件头的最后声明。
C. %prep部分
这个段是预处理段,通常用来执行一些解开源程序包的命令,为下一步的编译安装作准备。%prep和下面的%build,%install段一样,除了可以执行RPM所定义的宏命令(以%开头)以外,还可以执行SHELL命令,命令可以有很多行,如我们常写的tar解包命令。
%setup -n %{name}-%{version} 把源码包解压并放好
通常是从/SOURCES里的包解压到BUILD/%{name}-%{version}中。一般用%setup-c就可以了,但有两种情况:一就是同时编译多个源码包,二就是源码的tar包的名称与解压出来的目录不一致,此时,就需要使用-n参数指定一下了。
%patch打补丁,补丁一般在tar.gz包中,或者放到SOURCES目录下。一般参数为:
%patch -p1 使用前面定义的Patch补丁进行,-p1是忽略patch的第一层目录
%Patch2 -p1 -b xxx.patch 打上指定的补丁,-b是指生成备份文件
D. %build部分
这一部分执行编译动作。一般执行configure,make等命令,如:
%configure --prefix=/usr
Make
E. %install部分
这一部分执行安装动作。因为在一般情况下,我们仅仅是想完成打包工作,而并不像在本机安装相应的程序,因此我们往往使用虚拟根目录。
rm -rf $RPM_BUILD_ROOT
make DESTDIR=$RPM_BUILD_ROOT install
执行后,在BUILDROOT目录的下层目录下会看到,相应软件已经安装到该目录下。
F. %clean
顾名思义,这一部分执行打包后的清理动作。如rm -rf $RPM_BUILD_ROOT
G. %file部分
这一部分定义哪些文件或者目录会被放入到rpm中
%defattr(-,root,root,0755)指名安装时文件的用户,用户组和存取权限。一般形式如下:
%defattr(-,root,root,0755)
/usr/bin/event_rpcgen.py
/usr/include/evdns.h
/usr/lib64/libevent-1.4.so.2
执行安装命令后,libevent-1.4.so.2将被安装到/usr/lib64目录下。
H. 其他部分
%pre rpm安装前执行的脚本
%post rpm安装后执行的脚本
%preun rpm卸载前执行的脚本
%postun rpm卸载后执行的脚本
相关参考链接:http://book.51cto.com/art/201401/427743.htm
http://bbs.voip88.com/home.php?mod=space&uid=1&do=blog&id=727