1. 程式人生 > >一步步製作RPM包

一步步製作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. -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. [[email protected] 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: [email protected]<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. [[email protected] 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. 相關推薦

    步步製作RPM

    一.RPM製作步驟 我們在企業中有的軟體基本都是編譯的,我們每次安裝都得編譯,那怎麼辦呢?那就根據我們的需求製作RPM安裝包吧。先來說說基本布驟: 1.Planning what you want             計劃做什麼rpm包。軟體的?庫的? 2.G

    製作rpm時不生成debuginfo

    在打包nginx時,在一個環境下打包,能打出兩個包來,但是換了一個環境,私活只有一個,網上查了教程,在spec檔案裡增加%debug_package,安裝elfutils 也不管用,最後發現,用的非root使用者,最後切換root使用者,解決兩個openresty的包出來了 $ ls

    製作rpm

    如何在linux或CentOS下製作RPM包    但我覺得單純明白用.spec生成rpm是不夠的。常見有兩個原因值得我們去了解用如何用原始碼製作rpm: 引用 1、並不是所有的軟體都提供.rpm方式的。  這是最常見的原因。負責任的開發者應提供rpm方式的二進位制軟體包,以便使用者選擇使用。但也很常見就是軟

    Centos下用tar原始碼製作rpm

    公司有需求要求加密redis,本來是有個配置檔案選項requirepass 可以設定密碼,但是公司覺得可以通過修改配置檔案使密碼失效,感覺不安全,於是乎直接修改原始碼(強制設定requirepass為固定密碼),做成rpm包就非常安全了 1.下載redis原始碼包 2.修

    小白的Python3.6學習筆記--tkinter步步製作GUI讀取並實時顯示採集卡資料(二)

    上次我最終做出了一個簡易的串列埠助手,其效果如下: 但在反覆執行多次之後,發現了很多小毛病,接下來一一列舉並改正: 1.在電腦未接入裝置的時候,程式執行會報錯無法執行:        問題

    步步製作根檔案系統 (

                                開發環境:Ubuntu 12.04                             開發板:mini2440  256M NandFlash   64M SDRAM                              交叉編譯器:arm-

    步步製作 Arm-Linux交叉編譯環境

            我們使用以下版本的檔案為例子建立 arm-linux 交叉編譯環境: 編譯環境 redhat 7.2 或 8.0 binutils-2.14.tar.gz ftp://ftp.gnu.org/gnu/binutils/binutils-2.14.tar.g

    使用ruby的fpm模塊實現對二進制MySQL的RPM制作,實現鍵安裝

    rpm fpm 隨著互聯網的發展,一些互聯網企業,甚至於傳統企業的服務器也是越來越多。將面臨的挑戰其中之一就是自動化運維管理。假設我們需要自動化部署很多的應用,而這些應用又很復雜,過程多,需要源碼安裝。就算你能夠用自動化來完成這些工作,但配置起來也是相當的麻煩。那麽現在就有一種技術可以將源碼安裝的

    二十、安裝軟件的三種方法、RPM介紹、rpm工具用法、yum工具用法、yum搭建本地倉庫

    rpm工具 yum工具 二十一、安裝軟件包的三種方法、RPM包介紹、rpm工具用法、yum工具用法、yum搭建本地倉庫一、安裝軟件包的三種方法rpm工具、yum工具、源碼包RPM工具:是以一種數據庫記錄的方式將需要的套件安裝到Linux主機的一套管理程序。就是說,你的Linux系統中有一個關於RPM的

    第二十課 yum 更換國內源及下載rpm、源碼的安裝

    20180419一、yum更換國內源 1、下截: wget http://mirrors.163.com/.help/CentOS7-Base-163.repo 或者用curl -O 命令下載,然後刪除/etc/yum.repos.d/CentOS-Base.repo這個文件或更名。把CentOS7-Base

    【Android】從無到有:手把手步步使用android-gif-drawable載入GIF動圖

    轉載請註明出處,原文連結:https://blog.csdn.net/u013642500/article/details/80200129 【新增依賴】 首先需要新增android-gif-drawable依賴,請參考:【Android】實用教程:匯入android-gif-drawa

    perconabackup()--用rpm安裝perconaxtrabackup

    目錄 0、前言 1、安裝依賴包 2、安裝libv.so()(64bit)、 perl-Digest-MD5、rsync 3、安裝percona 0、前言 rh6和rh7是都支援yum源進行安裝,但是rh5不支援,可以使用以下方式安裝。 1、安裝依賴包 yum in

    rpm如何製作-個人經驗

    原文地址:http://blog.chinaunix.net/uid-21123336-id-1830527.html 一 RPM介紹 RPM 以前是Red Hat Package Manager 的縮寫,本意是Red Hat 軟體包管理,顧名思義是Red Hat 貢獻出來的軟體包管

    文學會製作R

    R語言小巧精悍,能在多個平臺上快速安裝,具有眾多的統計包,能快速畫出還算美觀的圖(推薦ggplot2),因此在程式語言的舞臺上佔有一席之地。 對於生物狗來說,主要用下面兩種方式來安裝R包: 1, install.packages() 2, source(“https://

    利用RubyGems的fpm製作zabbix_agent的rpm,並使用ansible批量部署

    一、 搭建rpm包製作環境 安裝gcc [[email protected] ~]# yum install gcc 安裝make [[email protected] ~]# yum install&nbs

    簡單 RPM 製作

    今天為了測試搭建自己的yum倉庫並安裝升級軟體包,因此需要一個rpm包來做測試,所以就想到了自己來做一個最簡單rpm,因為僅僅就是做一個測試所以沒有新增需要編譯的檔案,而是隻使用了一個shell檔案來輸出可愛的Hello World。1. 首先需要下載安裝rpm包製作工具$

    自己製作rpm軟體(1)

      我們都知道,在目前的Linux環境下,要安裝新軟體,通常有兩種方式:一是使用原始碼安裝;二是使用rpm軟體包。使用原始碼安裝可以讓使用者瞭解編譯過程,及定製一些模組,和修改編譯引數,但其工作量通常都很大,而且要求使用者有足夠的計算機知識。而rpm軟體包方式則相對來說比較

    NSIS製作安裝

    NSIS簡介: NISIS是win32免費的安裝,解除安裝系統。他的特點是指令碼簡潔高效;系統開銷小。當然進行安裝、解除安裝、系統設定、解壓檔案都沒有問題,幾乎可以做所有的事情。更多的功能請閱讀《NSIS幫助文件》 工具: NIS Edit + NSIS 思路: 基本上製作

    rpm打包過程詳解(二)——製作原始碼安裝

    製作原始碼安裝包(.tar.gz) 1.      解決依賴的軟體: 系統環境:[紅帽企業Linux.6.4.64位伺服器版].rhel-server-6.4-x86_64 原始碼製作中使用到的軟體為GNU M4,GNU autoconf,GNU automake;GNU

    ceph叢集 Centos7下RPM製作說明

     Centos RPM包製作說明 準備打包環境 1、centos系統下使用如下命令安裝rpmbuild #yum install rpmbuild 2、rpmbuild的工作目錄如下, ~/rpmbuild ~/rpmbuild/SOURCES ~/rp