• RPM包的原理与制作

    RPM包基本概念

    rpm (RedHat Package Management) 是操作系统用来维护各组件版本的一种方式,对于软件发行者来说,将自己的程序制作成标准的rpm格式也会使得程序的安装、升级和卸载变得非常容易。因此linux下几乎所有流行的程序都有rpm格式的包,有些是发行者自己打包,也有些第三方提供rpm包,例如redhat发行版里的rpm都是redhat自己打包,他们定期打patch,升级并且维护包之间的依赖关系,他们制作的rpm包是最可以信任的。

    下面提供以下几种rpm包的查找方式:

    http://www.rpmfind.net/

    http://rpm.pbone.net/

    https://pkgs.org/

    http://rpm.pbone.net/

    http://www.rpmseek.com/index.html

    RPM命令

    rpm  -q  mysql    ——  查询是否安装mysql软件包

    rpm -qa                    ——  查询系统中所有已经安装的包

    rpm -ql  mysql        ——  查询安装的mysql软件包的位置

    rpm -qf  文件名     —— 查询文件属于哪个安装包

    rpm -qi  mysql       —— 查询已安装的mysql的基本信息

    rpm -qc mysql      —— 查询mysql的配置文件

    rpm -qR mysql      —— 查询mysql所依赖的软件包

    RPM包管理

    1. 安装

    rpm -ivh  file.rpm

    •   -i  表示install 安装
    •   -v表示显示安装过程
    •   -h 表示显示安装进度
    2. 升级

    rpm -Uvh file.rpm  

    •  -U表示update ,升级

    注1: 如果有依赖关系的,需解决依赖关系。 如果找不到依赖关系的包,可以用下面的命令强制安装:

    rpm -ivh –nodeps –force file.rpm

    rpm -Uvh –nodeps –force file.rpm

    注2 : –test参数表示测试,并不真正安装。

    rpm -ivh –test mplayer-1.0pre7try2-2.i386.rpm

    注3:–relocate 参数为软件包指定安装目录

    rpm -ivh –relocate /=/usr/local/mplayer mplayer-1.0pre7try2-2.i386.rpm

    3. 卸载

    rpm -e file.rpm

    注: 如果有其它的rpm依赖于该rpm包,系统会出现警告。 如果一定要卸载,可以用选项 –nodeps 忽略依赖关系。但最好不要这么做。

    RPM 包制作

    接下来我们以制作一个NginxRPM安装包为例

    1. 准备工作

    1. 我们打开http://www.nginx.org/ 并且搜索下载nginx的源码包。

    wget -c http://nginx.org/download/nginx-1.6.0.tar.gz

    2. 若需要打补丁,则收集补丁文件。

    3. 确定依赖关系包。

    4. 安装rpm-build

    yum  install  rpm-build

    2. RPM的制作需要在特定的目录下进行,通常这个目录我们称之为topdir;一般情况下,系统已经为我们指明了默认的topdir目录了,可通过以下命令查看:

    如上,我的系统默认的topdir在我当前用户的家目录下,名称为rpmbuild。 那么我就可以在我的家目录下创建rpm工作目录了:

    $ mkdir ~/rpmbuild

    $ cd ~/rpmbuild

    $ mkdir -pv {BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}

    当然,我们也可以通过在家目录下添加.rpmmacros文件来修改topdir目录到我们自己指定的地方,例如:

    $ cat ~/.rpmmacros

    % _topdir “/usr/local/rpmbuild”

    修改之后我们再通过rpmbuild命令查看:

    这里可能会有疑问,那么为什么非要以这样的目录结构来构建RPM包呢 ?这里的每个目录都分别代表什么含义?

    目录 用途
    BUILD rpmbuild在这个目录下编译软件
    RPMS 生成的RPM包和debuginfo包存储在这个目录
    SOURCES 将源码放在这个目录
    SPECS 生成RPM包的SPEC文件放在这个目录
    SRPMS 存放rpmbuild生成的源码包

    3. 将源码包放置于正确的位置,如SOURCES

    cp   nginx-1.6.0.tar.gz   ~/rpmbuild/SOURCES/

    4. 创建SPEC文件,这是纲领文件,rpmbuild命令根据spec文件来制作合适的rpm包。当我们创建一个后缀名为.spec 的rpm包时,系统会默认生成以下格式:

    vim nginx.spec

    5. 用rpmbuild命令制作rpm包,rpmbuild命令会根据spec文件来生成rpm包

    $ rpmbuild  -ba  nginx.spec

    我上面直接用ba生成了,当然也可以一步步试,先rpmbuild -bp ,再-bc 再-bi 如果没问题,rpmbuild -ba 生成src包与二进制包吧。

    执行成功后,我们可以再看看rpmbuild的目录结构变化:

    如上,和我们当初对rpmbuild目录下的目录属性定义一样吧 ? 我们发现在RPMS/x86_64目录底下已经存在我们可以直接使用的rpm包了。

    RPM 包个性化制作

    在上面的内容中我们制作的RPM包仅仅只是将源码包打包编译成了我们需要的一个代码包而已,如果我们想在打包中加入一些比较个性化的东西,例如:我想把默认的nginx.conf文件替换为我们自定义的,或者加入一些管理脚本到安装目录下该怎么做呢?

    其实原理很简单,将这些文件放在SOURCE目录地下,并修改spec文件,使得在打包的时候一起混进去就可以了:

    $ ls SOURCES/

    load_nginx.sh  nginx-1.6.0.tar.gz  nginx.conf

    $ vim nginx.spec

    Source0:        %{name}-%{version}.tar.gz

    Source1:        nginx.conf

    Source2:        load_nginx.sh

    ………

    make install DESTDIR=%{buildroot}

    %{__install} -p -D %{SOURCE1} %{buildroot}/usr/local/nginx/conf/nginx.conf

    %{__install} -p -D -m 0755 %{SOURCE2} %{buildroot}/usr/local/nginx/load_nginx.sh

     

    重新用rpmbuild命令即可生成我们个性化的rpm了。

    参考

    http://www.cnblogs.com/bangerlee/archive/2013/04/13/3019484.html

    http://laoguang.blog.51cto.com/6013350/1103628