一步步制作RPM包

来源 http://blog.51cto.com/laoguang/1103628

一.RPM制作步骤

我们在企业中有的软件基本都是编译的,我们每次安装都得编译,那怎么办呢?那就根据我们的需求制作RPM安装包吧。先来说说基本布骤:

1.Planning what you want             计划做什么rpm包。软件的?库的?

2.Gathering the software to package  收集原材料,即收集源码包

3.Patch the software as need         如果需要打补丁,收集补丁文件。此布骤不是必须

4.Outling any dependenies      确定依赖关系包

------------------  上述动作可由我们手动编译一次软件来确定  -------------------

5.Building RPMs                      开始动手制作RPM包

5.1 Set up the directory stucture 设定好目录结构,我们在这些目录中制作我们的RPM包,我们需要下列目录

BUILD 源代码解压后的存放目录

RPMS    制作完成后的RPM包存放目录,里面有与平台相关的子目录

SOURCES 收集的源材料,补丁的存放位置

SPECS   SPEC文件存放目录

SRMPS   存放SRMPS生成的目录

5.2 Place the Sources in the right directory   把源材料放到正确的位置

5.3 Create a spec file that tell rpmbuild command what to do 创建spec文件,这是纲领文件,rpmbuild命令根据spec文件来制作合适的rpm包

5.4 Build the source and binary RPMS 制作src或二进制rpm包

6.Test RPMS 测试制作的PRM包

7.Add signature for RPM  为RPM包签名

二.RPM包制作实例

我还是用连贯的话为大家叙述一遍吧,我们首先确实我们要为什么做rpm包,通常我们是为一些软件,比如httpd,nginx等,然后去收集这些软件包的源代码,如果有需要的话也收集这些补丁文件,手动编译安装一下这个软件(当然如果是不需要编译的就不用演练了),确定依赖的软件包,并记录下来,下面开始准备制作tengine的PRM包吧:

1.建立一个普通用户,有普通用户来制作rpm,用root的可能会因为代码问题导致毁灭的后果

  1. useradd ibuler
  2. su - ibuler

2.确定我们在哪个目录下制作RPM,通常这个目录我们topdir,这个需要在宏配置文件中指定,这个配置文件称为macrofiles,它们通常为 /usr/lib/rpm/macros:/usr/lib/rpm/macros.*:~/.rpmmacros,这个在rhel 5.8中可以通过rpmbuild --showrc | grep macrofiles  查看,6.3的我使用这个找不到,但使用是一样的。你可以通过rpmbuild --showrc | grep topdir 查看你系统默认的工作车间

  1. rpmbuild --showrc | grep topdir
  2. -14: _builddir  %{_topdir}/BUILD
  3. -14: _buildrootdir  %{_topdir}/BUILDROOT
  4. -14: _rpmdir    %{_topdir}/RPMS
  5. -14: _sourcedir %{_topdir}/SOURCES
  6. -14: _specdir   %{_topdir}/SPECS
  7. -14: _srcrpmdir %{_topdir}/SRPMS
  8. -14: _topdir    %{getenv:HOME}/rpmbuild

我们还是自定义工作目录(或车间)吧

  1. vi ~/.rpmmacros
  2. %_topdir        /home/ibuler/rpmbuild    ##目录可以自定义
  3. mkdir ~/rpmbuild

3.在topdir下建立需要的目录

  1. cd ~/rpmbuild
  2. mkdir -pv {BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}

4.把收集的源码放到SOURCES下

  1. cp /tmp/tengine-1.4.2.tar.gz SOURCES  ##事先放好的

5.在SPECS下建立重要的spec文件

  1. cd SPECS
  2. vi tengine.spec          ##内容见后讲解,rhel6.3会自动生成模板

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

  1. rpmbuild
  2. -ba 既生成src.rpm又生成二进制rpm
  3. -bs 只生成src的rpm
  4. -bb 只生二进制的rpm
  5. -bp 执行到pre
  6. -bc 执行到 build段
  7. -bi 执行install段
  8. -bl 检测有文件没包含

我们可以一步步试,先rpmbuild -bp ,再-bc 再-bi 如果没问题,rpmbuild -ba 生成src包与二进制包吧

7.安装测试有没有问题,能否正常安装运行,能否正常升级,卸载有没有问题

root用户测试安装:

  1. cd /tmp
  2. cp /home/ibuler/rpmbuild/RPMS/x86_64/tengine-1.4.2-1.el6.x86_64.rpm /tmp
  3. rpm -ivh tengine-1.4.2-1.el6.x86_64.rpm  ##测试安装
  4. rpm -e tengine                           ##测试卸载,如果版本号比原来的高,升级测试

8.如果没问题为rpm包签名吧,防止有人恶意更改    ##这个先不写了,有点晚了,以后补上

到此整个流程完毕。下面来说说其中最最重要的spec的格式,先说最简单的,最容易实现的

  1. vi tengine.spec
  2. ### 0.define section               #自定义宏段,这个不是必须的
  3. ### %define nginx_user nginx       #这是我们自定义了一个宏,名字为nginx_user值为nginx,%{nginx_user}引用
  4. ### 1.The introduction section      #介绍区域段
  5. Name:           tengine            #名字为tar包的名字
  6. Version:        1.4.2              #版本号,一定要与tar包的一致哦
  7. Release:        1%{?dist}          #释出号,也就是第几次制作rpm
  8. Summary:        tengine from TaoBao  #软件包简介,最好不要超过50字符
  9. Group:          System Environment/Daemons  #组名,可以通过less /usr/share/doc/rpm-4.8.0/GROUPS 选择合适组
  10. License:        GPLv2                       #许可,GPL还是BSD等
  11. URL:            http://laoguang.blog.51cto.com   #可以写一个网址
  12. Packager:       Laoguang <ibuler@qq.com>
  13. Vendor:         TaoBao.com
  14. Source0:        %{name}-%{version}.tar.gz
  15. #定义用到的source,也就是你收集的,可以用宏来表示,也可以直接写名字,上面定义的内容都可以像上面那样引用
  16. #patch0:            a.patch                 #如果需要补丁,依次写
  17. BuildRoot:      %_topdir/BUILDROOT
  18. #这个是软件make install 的测试安装目录,也就是测试中的根,我们不用默认的,我们自定义,
  19. #我们可以来观察生成了哪此文件,方便写file区域
  20. BuildRequires:  gcc,make                           #制作过程中用到的软件包
  21. Requires:       pcre,pcre-devel,openssl,chkconfig  #软件运行需要的软件包,也可以指定最低版本如 bash >= 1.1.1
  22. %description                                       #软件包描述,尽情的写吧
  23. It is a Nginx from Taobao.                         #描述内容
  24. ###  2.The Prep section 准备阶段,主要目的解压source并cd进去
  25. %prep                                              #这个宏开始
  26. %setup -q                                          #这个宏的作用静默模式解压并cd
  27. #%patch0 -p1                                       #如果需要在这打补丁,依次写
  28. ###  3.The Build Section 编译制作阶段,主要目的就是编译
  29. %build
  30. ./configure \                                      #./configure 也可以用%configure来替换
  31. --prefix=/usr \                                  #下面的我想大家都很熟悉
  32. --sbin-path=/usr/sbin/nginx \
  33. --conf-path=/etc/nginx/nginx.conf \
  34. --error-log-path=/var/log/nginx/error.log \
  35. --http-log-path=/var/log/nginx/access.log \
  36. --pid-path=/var/run/nginx/nginx.pid  \
  37. --lock-path=/var/lock/nginx.lock \
  38. --user=nginx \
  39. --group=nginx \
  40. --with-http_ssl_module \
  41. --with-http_flv_module \
  42. --with-http_stub_status_module \
  43. --with-http_gzip_static_module \
  44. --http-client-body-temp-path=/var/tmp/nginx/client/ \
  45. --http-proxy-temp-path=/var/tmp/nginx/proxy/ \
  46. --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \
  47. --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \
  48. --http-scgi-temp-path=/var/tmp/nginx/scgi \
  49. --with-pcre
  50. make %{?_smp_mflags}          #make后面的意思是:如果就多处理器的话make时并行编译
  51. ###  4.Install section  安装阶段
  52. %install
  53. rm -rf %{buildroot}                #先删除原来的安装的,如果你不是第一次安装的话
  54. make install DESTDIR=%{buildroot}
  55. #DESTDIR指定安装的目录,而不是真实的安装目录,%{buildroot}你应该知道是指的什么了
  56. ###  4.1 scripts section #没必要可以不写
  57. %pre        #rpm安装前制行的脚本
  58. if [ $1 == 1 ];then    #$1==1 代表的是第一次安装,2代表是升级,0代表是卸载
  59. /usr/sbin/useradd -r nginx 2> /dev/null  ##其实这个脚本写的不完整
  60. fi
  61. %post       #安装后执行的脚本
  62. %preun      #卸载前执行的脚本
  63. if [ $1 == 0 ];then
  64. /usr/sbin/userdel -r nginx 2> /dev/null
  65. fi
  66. %postun     #卸载后执行的脚本
  67. ###  5.clean section 清理段,删除buildroot
  68. %clean
  69. rm -rf %{buildroot}
  70. ###  6.file section 要包含的文件
  71. %files
  72. %defattr (-,root,root,0755)   #设定默认权限,如果下面没有指定权限,则继承默认
  73. /etc/           #下面的内容要根据你在%{rootbuild}下生成的来写
  74. /usr/
  75. /var/
  76. ###  7.chagelog section  改变日志段
  77. %changelog
  78. *  Fri Dec 29 2012 laoguang <ibuler@qq.com> - 1.0.14-1
  79. - Initial version

到此一个简单的tengine RPM包制作好了。

三.RPM包制作拓展

下面我们来拓展一下,比如:我们想为tengine增加控制脚本,可以通过start|stop控制,我们还想更换一下默认的首页index.html,默认的fastcgi_params是不能直接连接php的,所以我们替换为新的配置文件,我们也可以用设置好的nginx.conf替换原来的nginx.conf。基于上述步骤下面继续

1.把修改后的首页文件index.html,控制脚本init.nginx,fastCGI配置文件fastcgi_params,Nginx配置文件nginx.conf 放到SOURCES中 。

  1. [ibuler@ng1 rpmbuild]$ ls SOURCES/
  2. fastcgi_params  index.html  init.nginx  nginx.conf  tengine-1.4.2.tar.gz

2 编辑tengine.spec,修改

2.1 介绍区域的SOURCE0下增加如下

  1. Source0:        %{name}-%{version}.tar.gz
  2. Source1:        index.html
  3. Source2:        init.nginx
  4. Source3:        fastcgi_params
  5. Source4:        nginx.conf

2.2 安装区域增加如下

  1. make install DESTDIR=%{buildroot}
  2. %{__install} -p -D %{SOURCE1} %{buildroot}/usr/html/index.html  #%{__install}这个宏代表install命令
  3. %{__install} -p -D -m 0755 %{SOURCE2} %{buildroot}/etc/rc.d/init.d/nginx
  4. %{__install} -p -D %{SOURCE3} %{buildroot}/etc/nginx/fastcgi_params
  5. %{__install} -p -D %{SOURCE4} %{buildroot}/etc/nginx/nginx.conf

2.3 脚本区域增加如下

  1. %post
  2. if [ $1 == 1 ];then
  3. /sbin/chkconfig --add nginx
  4. fi

2.4 %file区域增加如下

  1. %files
  2. %defattr (-,root,root,0755)
  3. /etc/
  4. /usr/
  5. /var/
  6. %config(noreplace) /etc/nginx/nginx.conf  #%config表明这是个配置文件noplace表明不能替换
  7. %config(noreplace) /etc/nginx/fastcgi_params
  8. %doc /usr/html/index.html  #%doc表明这个是文档
  9. %attr(0755,root,root) /etc/rc.d/init.d/nginx #%attr后面的是权限,属主,属组

3. 生成rpm文件测试

  1. rpmbuild -ba tengine.spec

4. 安装测试

到此RPM包制作完毕,你可以根据你的需求制作RPM包吧。

四.RPM包签名

1.生成GPG签名密钥,我用的是root用户

  1. gpg --gen-key
  2. Your selection?1<Enter>  ##默认即可
  3. What keysize do you want? (2048) 1024<Enter>  ##密钥长度
  4. Key is valid for? (0) 1y<Enter>  ##有效期
  5. Is this correct? (y/N) y<Enter>  ##确认
  6. Real name: LaoGuang<Enter>  ##密钥名称
  7. Email address: ibuler@qq.com<Enter>  ##邮件
  8. Comment: GPG-RPM-KEY<Enter>  ##备注
  9. Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O<ENTER>
  10. Enter passphrase  OK <Enter>  ##使用空密码,也可以输入
  11. <Take this one anyway> <Enter>
  12. <Take this one anyway> <Enter>

有时可能因为随机数不够导致卡在那里,这时候你就yum 安装几个包组,马上就够了。

2.查看成生的密钥

  1. [root@ng1 dev]# gpg --list-keys
  2. /root/.gnupg/pubring.gpg
  3. ------------------------
  4. pub   1024R/49C99488 2012-11-28 [expires: 2013-11-28]
  5. uid                  LaoGuang (GPG-RPM-KEY) <ibuler@qq.com>
  6. sub   1024R/69BA199D 2012-11-28 [expires: 2013-11-28]

3.导出公钥以供大家使用验证

  1. gpg --export -a "LaoGuang" > RPM-GPG-KEY-LaoGuang

4.编缉 .rpmmacros说明我们用哪一个密钥加密,我们用root加密的那就在/root下编辑

  1. vi ~/.rpmmacros
  2. %_gpg_name LaoGuang

5.为rpm包加签名

  1. rpm --addsign tengine-1.4.2-1.el6.x86_64.rpm
  2. Enter pass phrase:   ##输入密钥
  3. Pass phrase is good.
  4. tengine-1.4.2-1.el6.x86_64.rpm:

到此签名添加成功,下面来验证

6.讲刚才导出的公钥导入rpm中

  1. rpm --import RPM-GPG-KEY-LaoGuang

7.验证

  1. rpm --checksig tengine-1.4.2-1.el6.x86_64.rpm
  2. tengine-1.4.2-1.el6.x86_64.rpm: rsa sha1 (md5) pgp md5 OK

到此整个过程完毕,你也试试吧

一步步制作RPM包的更多相关文章

  1. 制作rpm包步骤

    由于项目需要,需要自行制作rpm包.比较全面的可以参考如下链接: http://blog.chinaunix.net/uid-23069658-id-3944462.html 大致框架如下: 1,安装 ...

  2. 烂泥:Linux源码包制作RPM包之Apache

    本文由秀依林枫提供友情赞助,首发于烂泥行天下 公司服务器比较多,需要把apache源码包制作成rpm包,然后放到公司内网yum源上进行下载安装.apache的rpm包安装方式比源码安装方式比较快,这能 ...

  3. 手动制作rpm包

    制作RPM包的过程,简单的说,就是为制作过程提供一个“工作车间”,即一个目录,里面需要包含以下几个子目录: BUILD        ————编译相关源码包时的工作目录: RPMS         — ...

  4. 速成制作rpm包

    FPM 由于很多软件在安装时需要编译,这会浪费不少的时间,为了提升部署效率,于是就想到制作rpm包.通常rpm包的制作是使用rpmbuild命令来制作,但是你需要知道它的语法,比较繁琐.这就用到了FP ...

  5. 利用fpm制作rpm包

    使用fpm制作rpm包 安装如下 [root@web01 ~]# yum install -y gcc zlib zlib-devel wget http://ruby.taobao.org/mirr ...

  6. fpm制作rpm包

    一.前言 在企业中我们有事安装软件包.部分都是源码安装,如nginx安装路径都已经固化了,但实际业务中,我们都是把软件包安装到固定目录下,不满足需要,这是其一.其二,编译安装很耗时,比如mysql,特 ...

  7. fpm 制作rpm包

    使用fpm命令制作rpm包并安装 工作中有如下情况需要将文件打包rpm: 避免重复工作,将源码程序打包为rpm 使用yum发布项目,项目打包为rpm 将自己写好的程序打包为rpm,提供给用户下载 其他 ...

  8. linux制作RPM包

    制作rpm包 1.制作流程1.1 前期工作 1)创建打包用的目录rpmbuild/{BUILD,SPECS,RPMS, SOURCES,SRPMS} 建议使用普通用户,在用户家目录中创建 2)确定好制 ...

  9. 制作RPM包

    RPM包制作过程 1.1 前期工作 1)创建打包用的目录rpmbuild/{BUILD,SPECS,RPMS, SOURCES,SRPMS} 建议使用普通用户,在用户家目录中创建 2)确定好制作的对象 ...

随机推荐

  1. block简介

    ios4.0系统已开始支持block,在编程过程中,blocks被Obj-C看成是对象,它封装了一段代码,这段代码可以在任何时候执行.Blocks可以作为函数参数或者函数的返回值,而其本身又可以带输入 ...

  2. vue登录插件引来的后续问题

    上次介绍了下写的登录弹框插件,过了几天发现点击去注册或者改密码的跳转失效.报错this.$router.push is not a function,继续打印this.$router也是undefin ...

  3. spring-mybatis整合异常

    Failed to read artifact descriptor for XXXXXX:jar:XXXX.RELEAS 原因是maven的本地仓库没有设置好.在别处拷贝过来的项目会有自己的仓库位置 ...

  4. JS下载文件常用的方式

    下载附件(image,doc,docx, excel,zip,pdf),应该是实际工作中经常遇到一个问题:这里使用过几种方式分享出来仅供参考; 初次写可能存在问题,有问题望指出 ​ 主要了解的几个知识 ...

  5. (转)Clang 比 GCC 编译器好在哪里?

    编译速度更快.编译产出更小.出错提示更友好.尤其是在比较极端的情况下.两年多前曾经写过一个Scheme解释器,词法分析和语法解析部分大约2000行,用的是Boost.Spirit--一个重度依赖C++ ...

  6. bin/postconf: error while loading shared libraries: libmysqlclient

    今天在编译安装postfix的时候 make install 出现如下错误 bin/postconf: error while loading shared libraries: libmysqlcl ...

  7. protues7.5安装

    win8 + protues7.5的安装  首先找到解压的文件夹,然后按照一步一步安装,如果中间出现不一样的,请退到前一步重新安装, 注意,安装的目录不要出现中文路径.

  8. easypoi 一行代码搞定excel导入导出

    开发中经常会遇到excel的处理,导入导出解析等等,java中比较流行的用poi,但是每次都要写大段工具类来搞定这事儿,此处推荐一个别人造好的轮子[easypoi],下面介绍下“轮子”的使用. pom ...

  9. Postgres常用命令之增、删、改、查

    增.删.改.查: postgres=# \password postgres 为postgres进行密码设置: postgres=# CREATE USER test WITH PASSWORD '1 ...

  10. 7-1 寻找大富翁 PTA 堆排序

    7-1 寻找大富翁 (25 分) 胡润研究院的调查显示,截至2017年底,中国个人资产超过1亿元的高净值人群达15万人.假设给出N个人的个人资产值,请快速找出资产排前M位的大富翁. 输入格式: 输入首 ...