感谢支持
我们一直在努力

教你学会制作rpm安装包

一.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 

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

本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-02/140714.htm

赞(0) 打赏
转载请注明出处:服务器评测 » 教你学会制作rpm安装包
分享到: 更多 (0)

听说打赏我的人,都进福布斯排行榜啦!

支付宝扫一扫打赏

微信扫一扫打赏