一、 RPM简介
RPM的英文全称是Redhat Package Manager,是应用于Linux的软件包管理器。虽然其名称中还带有RedHat的标志,但是其原始设计理念是开放式的,现在很多的Linux的发行版本都采用,算是公认的行业标准。
RPM可以用于软件的安装、升级、卸载、查询、校验等功能,非常适合我们公司目前的产品使用。
二、 RPM安装
1、 使用RPM
如果只是使用RPM的功能的话,系统默认都已经安装好了。
2、 使用RPM Build
使用RPM Build用来制作RPM包的话,则需要额外的安装程序,包括:
bzip2-1.0.3-4.el5_2.i386.rpm
elfutils-0.137-3.el5.i386.rpm
patch-2.5.4-29.2.3.el5.i386.rpm
rpm-build-4.4.2.3-18.el5.i386.rpm
unzip-5.52-3.el5.i386.rpm
三、 RPM制作
1、 制作RPM包,最重要的就是编写spec文件。spec文件是整个RPM包建立过程的中心,它的作用就如同编译程序时的Makefile文件。spec文件包含建立一个RPM包必需的信息,包括哪些文件是包的一部分以及它们安装在哪个目录下。这个文件一般分为如下的几节:
(1)Preamle(序言)
包含用户请求包的信息时所显示的内容。它可以包含包的功能描述、包的软件版本、版权信息和所属的包组等。
主要有以下几类:
A. 版本: Name,Version,Release
这三样直接决定了你的RPM的文件名称,
Name是名称,Version为版本号,Release为子版本号
例如:Name为hello,Version为1.0.0,Release为1
则打出的包就叫hello-1.0.0-1.i386.rpm
B. 其它软件有关的信息: Group,License,URL,Summary
这些就是描述信息:
License就是版权,通常可选("GPL"、"Commercial"、"Shareware")
Group是组织名称,URL是网址,Summary是简要说明
C. 先决条件: PreReq,Requires,BuildPreRep
也就是所谓的依赖了:
PreReq是安装前需要的,Requires是安装后还需要的,
BuildPreRep是打包前需要的
D. 输入: Source[#],Patch[#]
这里就是源码了,包括Source:源码、Patch:补丁
(2)Prep节
Prep节进行实际的打包准备工作,它是使用节前缀%prep表示的。
它一般包含%setup与%patch两个命令。
%setup用于将软件源码包解开,%patch可将补丁文件加入解开的源程序中。
%setup
-n newdir---------将压缩的软件源程序在newdir目录下解开。
-c ---------------在解开源程序之前先创建目录。
-b num------------在包含多个源程序时,将第num个源程序解压缩。
-T----------------不使用缺省的解压缩操作。
%patch
%patchN-------这里N是数字,表示使用第N个补丁文件,等价于%patch -P N
-p0-----------指定使用第一个补丁文件,-p1指定使用第二个补丁文件。
-s------------在使用补丁时,不显示任何信息。
-b name-------在加入补丁文件之前,将源文件名上加入name。若为指定此参数,则缺省源文件加入.orig。
-T------------将所有打补丁时产生的输出文件删除。
(3)Build节
这一节主要用于编译源码,它是使用节前缀%build表示的。
这一节一般由多个make命令组成。
(4)Install节
这一节主要用于完成实际安装软件必须执行的命令,它是使用节前缀%install表示的。这一节一般是由make install指令构成,但是有时也会包含cp、mv、install等指令。
(5)Clean节
这一节所描述的内容表示在完成包建立的工作之后,自动执行此节下的脚本进行附加的清除工作,它是使用节前缀%clean表示的。
一般而言,这一节的内容是简单地使用rm -rf $RPM_BUILD_ROOT命令,不需要指定此节的其它内容。
(6)文件列表
这一节指定构成包的文件的列表,它是使用节前缀%files表示的。此外,它还包含一系列宏控制安装后的文件属性和配置信息。
注意:如果在 %files 下列出一个目录名,RPM 会包括该目录下的所有文件。通常这不是您想要的,特别对于 /bin 这样的目录。
(7)改动日志
这一节主要描述软件的开发记录,它是使用节前缀%changlog表示的。这个段的内容是为了开发人员能详细的了解该软件的开发过程,对于包的维护极有好处。
我的spec文件例子:
#--------------------hello-1.0.0-1.spec----------------begin
Summary: a simple "hello world" app
Name:hello
Version: 1.0.0
Release: 1
License: GPL
URL: http://www.kodak.com
Source: %{name}-%{version}.tar.gz
Vendor: Kodak Inc.
Packager: Jerry Chen <jerry.chen@kodak.com>
Group: Applications/Multimedia
#指定了$RPM_BUILD_ROOT的值
BuildRoot:/var/tmp/%{name}-%{version}-%{release}-root
%description
a simple "hello world" app. you can do nothing useful with it.
%prep
#解压缩源代码包,进入源代码包目录
%setup –c
%build
#就是make了
#make
%install
rm -rf $RPM_BUILD_ROOT
#编译好的二进制文件安装到环境变量$RPM_BUILD_ROOT所指定的目录中去。
#make DESTDIR="$RPM_BUILD_ROOT" install
%clean
rm -rf $RPM_BUILD_ROOT
%files
%defattr(-,root,root)
#hello文件放入最后生成的安装包中,其安装路径为/usr/local/bin
/usr/local/bin/hello
%changelog
#--------------------hello-1.0.0-1.spec----------------end
2、编写好spec文件,也准备好了程序文件,就可以进行制作了
A、将源代码或者发布程序进行打包,打包规定为tar.gz格式,文件名为跟Source标记相对应(注:我在操作时,发现需要在打包时创建一个跟要打出的RPM包名称一样的目录才可以成功,就像hello-1.0.0-1一样的目录,不然会报错,原因不明,待以后调查)
B、将hello-1.0.0-1.tar.gz 和hello-1.0.0-1.spec文件放在同一目录下,之后执行
rpmbuild -bb hello-1.0.0-1.spec,参数-bb的意思是只建立二进制包,如果用参数-ba那么就建立源码和二进制包
C、之后,就可以在默认的生成目录下,/usr/src/redhat/RPMS/i386/下,看到已经生成的RPM文件:hello-1.0.0-1.i386.rpm
D、测试,将hello-1.0.0-1.i386.rpm放到另外一台机器上,执行命令
rpm –ivh hello-1.0.0-1.i386.rpm
可以看到执行的结果,并且检查/usr/local/bin/hello是否已经成功创建
打包说明:
1:将hello目录和hello.spec文件拷到centos系统任何一个目录下,比如:/root。
2:使用命令:tar czvf hello.tar.gz hello/ 压缩hello文件
3:将hello.tar.gz拷到/usr/src/redhat/SOURCE目录下
4:执行打包命令:rpmbuild -bb /root/hello.spec开始打包
5:执行完毕后,会在/usr/src/redhat/RPMS/i386目录下生成安装包,文件名为:hello-4.0.0-1.i386.rpm
6:命令:rpm -ivh hello-4.0.0-1.i386.rpm安装程序,程序安装目录为/opt/hello