一步步製做RPM包

本文根據馬哥教育視頻http://mageedu.blog.51cto.com/4265610/919986 總結而來,若是想仔細學習請看該視頻。php

一.RPM製做步驟html

咱們在企業中有的軟件基本都是編譯的,咱們每次安裝都得編譯,那怎麼辦呢?那就根據咱們的需求製做RPM安裝包吧。先來講說基本布驟:nginx

1.Planning what you want             計劃作什麼rpm包。軟件的?庫的?bash

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

3.Patch the software as need         若是須要打補丁,收集補丁文件。此布驟不是必須ide

4.Outling any dependenies      肯定依賴關係包post

------------------  上述動做可由咱們手動編譯一次軟件來肯定  -------------------學習

5.Building RPMs                      開始動手製做RPM包測試

5.1 Set up the directory stucture 設定好目錄結構,咱們在這些目錄中製做咱們的RPM包,咱們須要下列目錄ui

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 

到此整個過程完畢,你也試試吧

PS:覺的寫的不錯就贊一下吧,寫篇文檔不容易啊。

相關文章
相關標籤/搜索