Linux – rpm

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

一人简单的例子:

    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的所以,如果安装的话,是会失败的):

    [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的信息:

    [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包。