当前位置: > CentOS > CentOS入门 >

CentOS 6.6 x86_64 RPM包制作教程

时间:2016-05-16 10:47来源:111cn.net 作者:IT
RPM是RPM Package Manager(RPM软件包管理器)的缩写,这一文件格式名称虽然打上了RedHat的标志,但是其原始设计理念是(www.111cn.net)开放式的,现在包括OpenLinux、S.u.S.E.以及Turbo Linux等Linux的分发版本都有采用,可以算是公认的行业标准了。



一、RPM包介绍

对RPM包有五种基本的操作功能:安装、卸载、升级、查询和验证。


linux软件包分为两大类:
    1. 二进制类包:包括rpm安装包(一般分为i386和x86_64这几种)
    2. 源码类包:源码包和开发包(.src.rpm)都是属于此类
有时候为了方便源码包的安装,和我们自己订制软件包的需求,我们会把一些源码包按照我们的需求来做成rpm包,当有源码包就可以直接编译得到二进制安装和其他任意包,另外,我们也可以使用rpm包来打包一些文件或者自己开发的一套软件,使用rpm有数据库协助软件升级、文件检验,对于用户,提供rpm包还是最值的方法。spec文件是制作rpm包最核心的部分,rpm包的制作就是根据spec文件来实现的。在制定rpm包的时候最好不要使用管理员进行,因为管理员权限过大,如果一个命令写错了,结果可能就是灾难性的,而制作一个rpm包普通用户完全可以实现。制作rpm包需要使用rpmbuild工具来操作,如果没有安装rpmbuild命令的话,使用yum install rpm-build进行安装


二、RPM打包环境介绍及配置
1. 环境介绍及配置
使用rpmbuild工具打包,需要有一个”工作车间”,”工作车间“需要以下六个目录,如下表:
目录 作用
BUIILD 源代码解压以后存放的位置,在这个目录进行编译操作。
RPMS 制作完成后的rpm包存放位置,rpm包会放在对应平台类型的子目录下。
SOURCES 制作rpm包的源材料文件,包括源码包,其它的各种
SPECS 存放spec文件的位置,后缀名一般写为.spec
SRPMS 存放src格式的rpm包位置
BUILDROOT 假根,使用install临时安装到这个目录,把这个目录当成根来使用。
如果是使用redhat系统的话,这几个目录可以在/usr/local/src目录下,但是在centos上是没有这几个目录的,所以需要自己创建,一般使用普通用户目录,对这几个目录进行创建,而这几个目录的位置,则由宏来控制。

rpmbulid –showrc 显示所有的宏,以下划线开头,一个下划线:定义环境的使用情况;二个下划线:通常定义的是命令。为什么要定义宏呢,因为不同的系统,命令的存放位置可能不同,所以通过宏的定义找到命令的真正存放位置。
查看默认的工作车间,只要我们修改了这个宏,我们就可以自定义工作车间了。


[zhanghong@localhost ~]$ rpmbuild --showrc | grep topdir
-14: _builddir %{_topdir}/BUILD
-14: _buildrootdir %{_topdir}/BUILDROOT
-14: _rpmdir %{_topdir}/RPMS
-14: _sourcedir %{_topdir}/SOURCES
-14: _specdir %{_topdir}/SPECS
-14: _srcrpmdir %{_topdir}/SRPMS
-14: _topdir /home/zhanghong/rpmbuild/


可以发现,这几个工作车间目录都是在%{_topdir}这个宏目录下的,我自定义_topdir目录为/home/zhanghong/rpmbuild这个目录,然后我使用zhanghong这个用户,在家目录创建以下几个目录就可以了。如下命令:
[zhanghong@localhost ~]$ mkdir -pv rpmbuild/{RPMS,SRPMS,SOURCES,SPECS,BUILD,BUILDROOT}
我们需要自定义宏的话,需要在当前用户家目录下创建.rpmmacros文件,然后写上宏变量及对应值就行了,如下图:
[zhanghong@localhost ~]$ cat .rpmmacros
%_topdir /home/zhanghong/rpmbuild/
%_gpg_name ZhangHong
%_signature gpg


写完之后,进行保存,然后使用rpmbuild –showrc命令查看值有没有生效。


2. rpm制作过程:


    在sources目录下,我们放好所有的源码包,在specs目录里面,我们写好spec文件,然后我们使用rpmbuild命令去制作。首先会先读取SOURCES目录,将SOURCES目录下面的文件解压到BUILD目录当中,解压完成之后,会在BUILD生成软件包的子目录,然后就会跳到软件包的目录里面去执行编译过程,configure make。 make完成之后,就要进行安装,不会安装到系统中,会安装到一个临时目录,会安装到BUILDROOT这个目录里面去,把BUILDROOT目录当成系统的根目录。当文件生成完成后。将文件打包好,就要进行clean段,会将BUILDROOT和BUILD解压的文件夹也会删除。
3. rpm包制作原理图

三、spec文件介绍(最重要)


1. 基本介绍
spec文件中包含以下信息:
    1) 软件的基础信息,就是我们使用rpm -qi 软件包看到的信息。
    2) pre准备阶段,其实这个操作就是把文件解压到BUILD目录下
    3) 编译阶段,根据我们设定好的编译参数,对源码包进行编译
    4) 安装阶段,将编译好的文件进行安装
    5) 清理阶段,完成包的建立工作之后,将编译产生的文件进行清理。
    6)  文件列表, 指定构成包的文件列表,文件不能多,也不能少,会报错的。
    7) 修改日志, 就是软件的改动日志。

 


2. spec文件示例与讲解
说明:以下spec文件是制作nginx-1.9.3的spec文件
%define nginx_user nginx        //使用%define命令,定义nginx_user值为nginx,下面就可以使用%{nginx_user}对这个值进行调用了。
Name:  nginx        //软件包的名称,不能使用"-"这个符号 
Version: 1.9.3                //软件包的版本 
Release: 2%{?dist}        //软件发行号,默认为1,修改一次加1,标明第几次打包。
Summary: A free, open-source, high-performance HTTP server and reverse proxy                //软件包的简介
Group:  Applications/Internet    //软件包的分类,这个分类不是乱写的,需要是在 /usr/share/doc/rpm-4.8.0/GROUPS 这个文件中存在的组
License: BSD    //授权协议,这个授权协议一般看软件包的介绍,不能乱写。
URL:  http://nginx.org/download/%{name}-%{version}.tar.gz    //软件包的主页地址
Source0: %{name}-%{version}.tar.gz        //制作rpm包的源码文件,多个文件的话,从0开始,如Source0, Source1..这样。
Source1: nginx.sysinit        //同上。nginx的启动脚本
BuildRoot: %{_topdir}/BUILDROOT    //安装的假根,打包时,编译后安装的文件会放在这个目录下。
Vendor:  http://www.lookingss.org    //发行商或打包组织的标识
Packager: zhanghong <1259001226@qq.com>    //制作这个软件包的作者及邮箱,格式不能错了
BuildRequires: pcre-devel,openssl-devel,openssl    //编译软件时要求的软件包,写不全也没关系
Requires: gcc        //运行需要的软件包
Provides: webserver        //提供的功能。
%description        //对软件包的描述
nginx [engine x] is an HTTP and reverse proxy server, a mail proxy server, and a generic TCP proxy server, originally written by Igor Sysoev. For a long time, it has been running on many heavily loaded Russian sites including Yandex, Mail.Ru, VK, and Rambler. According to Netcraft, nginx served or proxied 22.27% busiest sites in July 2015. Here are some of the success stories: Netflix, WordPress.com, FastMail.FM.
说明:以下部分就是软件的基础信息部分,Name Version Release Group这四个是必须
%prep        //准备编译阶段
%setup -q    //这步操作其实就是解压文件到BUILD目录。
说明:
    %setup -n %{name}-%{version} 把源码包解压并放好,一般使用%setup -c就可以了,但有两种情况:一就是同时编译多个源码包;二就是源码的tar包的名称与解压出来的目录不一致,此时,就需要使用-n参数指定一下。
附:
%build    //编译阶段
export DESTDIR=%{buildroot}        指定安装目录为buildroot
./configure \
  --sbin-path=/usr/sbin/nginx \
  --conf-path=/etc/nginx/nginx.conf \
  --error-log-path=/var/log/nginx/error.log \
  --http-log-path=/var/log/nginx/access.log \
  --pid-path=/var/run/nginx/nginx.pid \
  --user=%{nginx_user} \
  --group=%{nginx_user} \
  --with-poll_module \
  --with-http_sub_module \
  --with-http_flv_module \
  --with-http_gzip_static_module \
  --http-fastcgi-temp-path=/var/tmp/nginx/fastcgi \
  --http-client-body-temp-path=/var/tmp/nginx/client    //以上是编译参数,默认会有一个%configure的,建议把默认的%configure删除掉,自己写编译参数
make %{?_smp_mflags}        //进行编译,后面的%{?_smp_mflags}是表示,如果支持_smp_mflags这个宏就开启,不支持就不开启,smp_mflags这个是多处理编译,如果在多核心cpu的机器上会开启的
%install    //安装阶段
rm -rf %{buildroot}
make install DESTDIR=%{buildroot}
%{__install} -p -d -m 0755 %{buildroot}/var/tmp/nginx/fastcgi
%{__install} -p -d -m 0755 %{buildroot}/var/tmp/nginx/client
%{__install} -p -d -m 0755 %{buildroot}/usr/local/nginx/proxy_temp
%{__install} -p -d -m 0755 %{buildroot}/usr/local/nginx/scgi_temp
%{__install} -p -d -m 0755 %{buildroot}/usr/local/nginx/uwsgi_temp
%{__install} -p -d -m 0755 %{buildroot}/var/log/nginx
%{__install} -p -d -m 0755 %{buildroot}/var/run/nginx
%{__install} -p -D -m 0755 %{SOURCE1} %{buildroot}/etc/rc.d/init.d/nginx
说明:以上是在操作目录及拷贝文件,如果不明白参数,具体可以看install命令,其实也可以通过rpmbuild --showrc这个命令获知%{__install}这个宏就是指install命令的。
%clean    //清理阶段
rm -rf %{buildroot}        //将buildroot目录删除
%pre    //安装前操作
if [ $1 == 1 ];
then
 /usr/sbin/useradd -s /sbin/false -M %{nginx_user} > /dev/null 2>&1 || :
fi
%post    //安装后操作
if [ $1 == 1 ];
then
 /sbin/chkconfig --add %{name}
fi
%preun    //卸载前操作
if [ $1 == 0 ];
then
 /sbin/service %{name} stop
 /sbin/chkconfig --del %{name}
fi
说明:$1一共有三个值,1表示安装 0表示卸载 2表示升级
%files    //文件列表段,这个阶段是把前面已经编译好的内容打包文件。
%defattr(-,root,root,-)    //指定默认权限
%doc CHANGES LICENSE README       
%{_sbindir}/%{name}
%dir /var/run/nginx   
%dir /var/log/nginx
/var/tmp/nginx/
/usr/local/nginx/
/usr/local/nginx/html/50x.html
/usr/local/nginx/html/index.html
%config(noreplace) /etc/nginx/%{name}.conf
%config(noreplace) /etc/nginx/mime.types
%config(noreplace) /etc/nginx/fastcgi.conf
%config(noreplace) /etc/nginx/fastcgi_params
%config(noreplace) /etc/nginx/koi-utf
%config(noreplace) /etc/nginx/koi-win
%config(noreplace) /etc/nginx/scgi_params
%config(noreplace) /etc/nginx/uwsgi_params
%config(noreplace) /etc/nginx/win-utf
%config(noreplace) /etc/nginx/fastcgi.conf.default
%config(noreplace) /etc/nginx/fastcgi_params.default
%config(noreplace) /etc/nginx/mime.types.default
%config(noreplace) /etc/nginx/nginx.conf.default
%config(noreplace) /etc/nginx/scgi_params.default
%config(noreplace) /etc/nginx/uwsgi_params.default
%attr(0755,root,root) /etc/rc.d/init.d/%{name}
%attr(0755,%{nginx_user},%{nginx_user}) /var/tmp/nginx
%attr(0755,%{nginx_user},%{nginx_user}) /usr/local/nginx
说明:
    1.%config 表示该文件为配置文件,noreplace是表示不替换,比如说,安装好一个软件包之好,然后进行升级,如果发现配置文件没有修改,就会直接替换,如果发现修改,就会把原来的新的配置改名成.new
    2. %{buildroot}里的所有文件要明确被指定是否要被打包到rpm里面。什么意思呢?假如,%{buildroot}目录下有4个目录a、b、c和d,在%files里仅指定a和b要打包到rpm里,如果不把c和d用exclude声明是要报错的;
    3. 如果声明了%{buildroot}里不存在的文件或者目录也会报错。
%changelog
* Tue Aug 2 2015 zhanghong <1259001226@qq.com> - 1.9.3-2
- Add temp directory
* Sat Aug 1 2015 zhanghong <1259001226@qq.com> - 1.9.3-1
- Initial version
说明:
   1. 修改日志,标准格式为
    * date +"%a %b %d %Y" 修改人 邮箱  本次版本x.y.z-p     (* 英文简写星期 英文简写月份 日 年 修改者姓名 修改者邮箱 版本号)
    -本次变更的内容。

3. rpm打包
写好了spec文件,就需要使用rpmbuild命令进行打包。
基本格式:rpmbuild [options] [spec文档]
选项:
    -bp    #只执行spec的%pre段(解于源码包关打补丁,即只做准备)
    -bc    #执行spec的%pre和build段(准备并编译)
    -bi    #执行spec中的%pre,%build与%install(准备,编译并安装)
    -bl    #检查spec中的%file段(查看文件是否齐全)
    -ba    #建立源码包和二进制包(常用)
    -bb    #只建立二进制包(常用)
    -bs    #只建立源码包
一般制作出源码包和二进制包
[zhanghong@localhost ~]$ rpmbuild -ba nginx-1.9.3.spec
执行成功后,就可以在RPMS目录看到生成的二进制包(.src.rpm)和SRPMS生成的源码包(.src.rpm)
说明:建议刚开始打包,可以先一个阶段一个阶段来测试,先使用bp 后使用bc 这样确保各个阶段流程没有问题,最后使用ba进行全部打包。

四、RPM包签署密钥
1. 介绍

    RPM是在Redhat和SUSE上安装和管理软件的标准。像Yum和Zypper这样的元数据包处理软件可以很容易的安装软件包。但是RPM可能有风险,因为其在安装过程中以root权限自动执行脚本。因此要确保你使用的RPM包值得信任。如果是自己创建的RPM包,可以用GPG密钥来签署它们。
2. 操作
    1) 安装

[zhanghong@localhost ~]$ yum install gnupg -y
#系统基本都安装了。所以一般不需要手动进行yum安装
    2) 生成密钥
[zhanghong@localhost ~]$ gpg --gen-key
    回车以后,会跳出一大段文字:
gpg (GnuPG) 2.0.14; Copyright (C) 2009 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
#版权声明
Please select what kind of key you want:
   (1) RSA and RSA (default)
   (2) DSA and Elgamal
   (3) DSA (sign only)
   (4) RSA (sign only)
Your selection?
#请你选择加密方式,一般是默认
    回车,默认选择第一个选项,表示加密和签名都使用RSA算法
    然后,系统就会问你密钥的长度
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048)
# 默认2048位,密钥越长越安全,同时计算生成时间也长
    回车,默认选择2048位。
    接着,设定密钥的有效期。
Please specify how long the key should be valid.
         0 = key does not expire
      <n>  = key expires in n days
      <n>w = key expires in n weeks
      <n>m = key expires in n months
      <n>y = key expires in n years
Key is valid for? (0)
# 选项默认是0,0表示永不过期,n表示在n后过期,nw表示在n周后过期,依次就是n月,n年了。
一般选项永不过期。
回答完上面三个问题后,系统让你确认
Is this correct? (y/N)
    输入y,系统就要求你提供个人信息
GnuPG needs to construct a user ID to identify your key.
Real name:
# 真实姓名
    输入一下,输入完之后,会让你输入电子邮件。
GnuPG needs to construct a user ID to identify your key.
Real name: Zhang Hong
Email address:
# 输入电子邮件
    输入完之后,会让你输入注释
Real name: Zhang Hong
Email address: 1259001226@qq.com
Comment:
# 输入注释,也可以空着
    输入完之后,系统会让你确认。
GnuPG needs to construct a user ID to identify your key.
Real name: Zhang Hong
Email address: 1259001226@qq.com
Comment: Test Key
You selected this USER-ID:
    "Zhang Hong (Test Key) <1259001226@qq.com>"
Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit?
#输入O表示Okay 确认,输入其它的,是修改对应的值。
    输入O表示确定。然后就等待生成密钥。
    3) 导出密钥
[zhanghong@localhost ~]$ gpg --list-key    #列出密钥
/home/zhanghong/.gnupg/pubring.gpg
----------------------------------
pub   1024R/3AB354FD 2015-08-11
uid                  Zhang Hong (soft of du-game.com) <1259001226@qq.com>
sub   1024R/D9CC5C71 2015-08-11
#可以看到刚刚生成的密钥
[zhanghong@localhost ~]$ gpg --export -a 'Zhang Hong' > RPM-GPG-KEY-DUGAME
    4) 给rpm包签署密钥
    需要添加两个rpm宏变量的值,编辑~./rpmmacros文件
[zhanghong@localhost ~]$ vim ~/.rpmmacros
%_gpg_name Zhang Hong
%_signature gpg
#gpg_name是对应前面的Real Name
    添加好之后,签署密钥
[zhanghong@localhost ~]$ rpm --addsign zabbix-server-2.4.6-3.el6.x86_64.rpm
Enter pass phrase:
Pass phrase is good.
zabbix-server-2.4.6-3.el6.x86_64.rpm:
    然后在需要安装包的机器上导入公钥
[root@localhost RPMS]# rpm --import RPM-GPG-KEY-DUGAME
    查看包的状态
    

    校验包是否正常

[root@localhost RPMS]# rpm --checksig wxWidgets-3.0.2-1.el6.x86_64.rpm
wxWidgets-3.0.2-1.el6.x86_64.rpm: rsa sha1 (md5) pgp md5 OK
    自此,RPM包签署密钥完成。


五、后续添加
1. spec文件其它选项
    Build Arch:    指编译的目标处理器架构,noarch标识不指定,但是通常以/usr/lib/rpm/marcros中的内容为默认值。



(责任编辑:IT)
------分隔线----------------------------
栏目列表
推荐内容