一步步制作RPM包

转载 2015年07月06日 23:20:51

本文根据马哥教育视频http://mageedu.blog.51cto.com/4265610/919986 总结而来,如果想仔细学习请看该视频。

一.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.  
  3. -14: _builddir  %{_topdir}/BUILD 
  4. -14: _buildrootdir  %{_topdir}/BUILDROOT 
  5. -14: _rpmdir    %{_topdir}/RPMS 
  6. -14: _sourcedir %{_topdir}/SOURCES 
  7. -14: _specdir   %{_topdir}/SPECS 
  8. -14: _srcrpmdir %{_topdir}/SRPMS 
  9. -14: _topdir    %{getenv:HOME}/rpmbuild 

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

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


本文出自 “Free Linux, Share Linux” 博客,请务必保留此出处http://laoguang.blog.51cto.com/6013350/1103628

简单 RPM 包制作

今天为了测试搭建自己的yum仓库并安装升级软件包,因此需要一个rpm包来做测试,所以就想到了自己来做一个最简单rpm,因为仅仅就是做一个测试所以没有添加需要编译的文件,而是只使用了一个shell文件来...
  • kongxx
  • kongxx
  • 2015年02月12日 13:21
  • 6277

如何制作rpm包

以前写的一篇文档,文章重点在于讲清如何快速上手和会碰到的问题。并不是软件文档的中文翻译,要看大全或faq的见参考文献1. 概述以及难点这里的概述仅仅是我的理解。如果要获得准确全面的信息,建议阅读“参考...
  • redguardtoo
  • redguardtoo
  • 2006年11月08日 17:08
  • 13581

rpm包打包过程详解(一)——rpm打包

制作rpm包 需要软件: 系统环境:[红帽企业Linux.6.4.服务器版].rhel-server-6.4-x86_64 首先安装rpmdevtools这个工具,该工具包含rpmbuild,r...
  • wutangkafei1990
  • wutangkafei1990
  • 2015年10月27日 15:55
  • 7555

rpm包制作之——nginx

rpmbuild安装 # yum install -y rpmdevtools rpm-build 创建一个RPM构建根目录结构(默认将再当前用户主目录下),如果需要改变次默认位置,可以修...
  • tshangshi
  • tshangshi
  • 2016年12月13日 21:11
  • 1192

rpm包如何制作-个人经验

原文链接:http://blog.chinaunix.net/uid-21123336-id-1830527.html 一 RPM介绍 RPM 前是Red Hat Pack...
  • bpingchang
  • bpingchang
  • 2013年09月02日 22:13
  • 17975

rpm包制作

SPEC文件 spec文件是整个RPM包建立过程的中心,它的作用就如同编译程序时的Makefile文件。spec文件包含建立一个RPM包必需的信息,包括哪些文件是包的一部分以及它们安装在哪个目录下。这...
  • cybertan
  • cybertan
  • 2010年10月28日 22:53
  • 7520

Linux: 学习如何制作RPM包, SPEC文件如何编写

一 RPM介绍 RPM 前是Red Hat Package Manager 的缩写,本意是Red Hat 软件包管理,顾名思义是Red Hat 贡献出来的软件包管理;现在应为RPM Pack...
  • elfprincexu
  • elfprincexu
  • 2015年08月27日 11:07
  • 1771

centOS下制作RPM包

1.环境的准备: 安装环境时当前用户要有系统管理权限。但是在制作RPM包时请一定要用无系统管理权限的用户来进行操作。在开始一切的准备工作之前,请先保证您的工作环境下已经安装了gcc和make。关于这...
  • Lin_litao
  • Lin_litao
  • 2014年04月18日 11:58
  • 6694

自己制作rpm软件包(1)

我们都知道,在目前的Linux环境下,要安装新软件,通常有两种方式:一是使用源码安装;二是使用rpm软件包。使用源码安装可以让用户了解编译过程,及定制一些模块,和修改编译参数,但其工作量通常都很大,而...
  • wisgood
  • wisgood
  • 2015年01月13日 17:25
  • 1142

rpmbuild RPM制作教程

  • 2011年06月06日 17:03
  • 231KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一步步制作RPM包
举报原因:
原因补充:

(最多只允许输入30个字)