歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> 教你學會制作rpm安裝包

教你學會制作rpm安裝包

日期:2017/2/28 13:39:27   编辑:Linux教程

一.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 <[email protected]>
  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 <[email protected]> - 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: [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. [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) <[email protected]>
  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

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

Copyright © Linux教程網 All Rights Reserved