rpm是redhat(系列)系统软件安装,管理的工具。相对于针对仓库而言的yum,rpm是针对单个软件包的。通常情况下Linux发布软件是通过源代码方式,一般情况下就是对源码./configure, make,make install。除了这种方式外,比较常用的就是rpm包,它则可提供完整的已经编译好的二进制程序或者其它东西(帮助文件,源码等)。这里不说.deb。

rpm的使用不说,直接看帮助,常用的就是-qa, -e,-ivh等几个选项。

下面说说rpm包的制作(在制作过程中发现并不是那么顺利,还不如用源代码方式发布),制作是用rmpbuild这个命令完成的。这里仅说下简单的制作以供以后参考。

rpm包的结构一般为: name-version-release.architecture.rpm

|名称|说明|
|—-|:—-|
|name-version-release| 命名版本号之类的,如MySQL-server-5.0.i386.rpm|
|architecture| 适用的结构,如i386, i686, x86_64, noarch|

RPM系统要求有以下几个文件夹(如果是安装系统的时候安装了rmpbuild, 则在redhat系列是在/usr/src/redhat, 如果自行安装的话,可能在你的主目录的rpbbuild的目录下面)。

|名称|说明|
|—-|:—-|
|BUILD |rpmbuild在此目录构建软件|
|RPMS |rmpbuild存储生成的二进制rpm文件目录|
|SOURCES |所要构建软件的源码|
|SPECS |SPECS文件所在的目录|
|SRPMS |rmpbuild存储生成的src rpm包的目录|

rpmbuild最重要的是书写SPECS文件,写好的specs文件丢到SPECS目录(也可以不用)。SPECS比较烦琐,下面列出一些常用的,但不完全(#开头表示注释)。

|名称|说明|
|—-|:—-|
|Summary| 软件包简要的描述|
|Name| 软件包名称|
|Version| 软件包定义的版本|
|Release| 软件包发布版本|
|License| 软件包许可|
|Group| 软件包分类(在GNOME应用程序可看到)如Applications/Media|
|Source| 软件包源码下载地址|
|URL| 源码相关网站|
|Distribution| 发行版系列|
|Packager| 打包人的信息|
|Requires| 如 mysql >= 3.30 或者 mysql|
|sources| 源码tar包,可以这样设置为通用的:%{name}-%{version}.tar.gz|
|Buildroot| rmpbuild的暂存区,可以设置为通用的:%{_tmppath}/%{name}-%{version}-root|
|%description| 软件详细描述,可多行|
|%prep| 软件编译之前的处理,如解压|
|%setup| 不知道什么用,不过通常在%prep下面%setup -q|
|%build| 开始编译软件,如make|
|%install| 开始安装软件,如make install|
|%makeinstall| 调用Makefiel的make install|
|%clean| rmpbuild的clean命令|
|%post| rmpbuild构建完成的命令|
|%files| 要打包的文件|

如果用VIM新建.spec文件,在新建的时候会弹出相应的模板给你填,这个不错。

rmpbuild的编译选项大致有下面几种类型:

|名称|说明|
|—-|:—-| |-ba |构建所有的东西,包含二进制和源码的RPM| |-bb |构建二进制的RPM| |-bc |构建(编译)程序,但不生成RPM| |-bp |准备构建RPM| |-bi |构建二进制的RPM并安装之| |-bl |检查RPM文件列表| |-bs |构建源码的RPM|

一人简单的例子:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
    Name:           jmm
    Version:        1.0
    Release:        1
    Summary:        Process pool server

    Group:          Applications/Internet
    License:        LGPL 2.0
    URL:            www.google.com
    Source0:        jmm-1.0.tar.gz
    BuildRoot:      %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)

    #BuildRequires:
    #Requires:       libevent >= 2.0

    %description
    Process pool server base on libevent


    %prep
    %setup -q

    %build
    make

    %install
    mkdir -p %{buildroot}/usr/local/bin
    #make install DESTDIR=%{buildroot}
    install -m755 jmm %{buildroot}/usr/local/bin/jmm

    %clean
    rm -rf %{buildroot}


    %files
    /usr/local/bin/jmm
    #%defattr(-,root,root,-)
    #%doc

我的机子是x86_64的,在我机子上运行rmpbuil –ba jmm.spec将在RPMS目录生成x86_64/jmm-1.0-1.x86_68.rpm,在SRPMS目录生成jmm-1.0-1.src.rpm。
要注意一点的就是%files下面的文件是要写buildroot下面的文件。
查看刚才编译的文件信息(PS这个东西是要libevent2的所以,如果安装的话,是会失败的):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
    [heidong@CLOUD x86_64]$ rpm -qpi jmm-1.0-1.x86_64.rpm    
    Name        : jmm                          Relocations: (not relocatable)
    Version     : 1.0                               Vendor: (none)
    Release     : 1                             Build Date: Thu Sep 13 07:07:07 2012
    Install Date: (not installed)               Build Host: CLOUD.NODE.0
    Group       : Applications/Internet         Source RPM: jmm-1.0-1.src.rpm
    Size        : 45357                            License: LGPL 2.0
    Signature   : (none)
    URL         : www.google.com
    Summary     : Process pool server
    Description :
    Process pool server base on libevent
    [heidong@CLOUD x86_64]$ rpm -qpl jmm-1.0-1.x86_64.rpm   
    /usr/local/bin/jmm
    [heidong@CLOUD x86_64]$

查看源RPM的信息:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
    [heidong@CLOUD SRPMS]$ rpm -qpi jmm-1.0-1.src.rpm           
    Name        : jmm                          Relocations: (not relocatable)
    Version     : 1.0                               Vendor: (none)
    Release     : 1                             Build Date: Thu Sep 13 07:07:07 2012
    Install Date: (not installed)               Build Host: CLOUD.NODE.0
    Group       : Applications/Internet         Source RPM: (none)
    Size        : 17198                            License: LGPL 2.0
    Signature   : (none)
    URL         : www.google.com
    Summary     : Process pool server
    Description :
    Process pool server base on libevent
    [heidong@CLOUD SRPMS]$ rpm -qpl jmm-1.0-1.src.rpm   
    jmm-1.0.tar.gz
    jmm.spec
    [heidong@CLOUD SRPMS]$ 

关于源RPM的安装,与编译好的二进制文件不一样,源RPM是要编译的。一般是包含压缩包和SPEC文件。安装后,源码文件是在SOURCE目录,SPEC文件是在SPEC目录。要进得编译方可得到二进制RPM包。