2011
Dec
10

最近機器一直出問題,一下家裡的 Virtual PC 掛點,一下是 Amazon EC2 硬體炸掉,害我一直在make package , install package , 其中 make apache 和 mysql 最花時間,總是要跑好幾個小時,於是我決定使用 RPM Build ,將所有要安裝的檔案打包成package ,以後只要安裝就好囉!

在使用 RPM 之前,先簡單的描述一下軟體,我在還不懂事的時候,一直認為軟體安裝是一件很困難的事情,因為不懂軟體安裝的過程中,到底軟體會做什麼? 後來開始寫一些 library 之後,發現軟體安裝,不過是把程式搬到指定的目錄之下而已,就是這麼簡單的事!!

所以接下來我要做的事,就是把我的程式用 RPM 封裝成一個軟體,然後再透過 RPM 的方式安裝到我的 Linux 電腦。

RPM Build 資料夾結構

一個 RPM Package 的目錄結構如下,一開始要先建立好這個目錄,每個目錄都會放RPM 指定的內容。

  • BUILD : RPM 安裝內容自動建立的位置
  • RPMS : 最後建立成功的RPM Package
  • SOURCES : 要安裝的檔案,需用 tar ball 的方式包起來(如 example.tar)
  • SPECS : RPM 建立規格檔
  • SRPMS : source RPM ,原始檔案的意思(我不會用到!!)。

RPM Build 前置作業

  • mkdir -p /home/software/myrpm : 先建立我的RPM Builder 資料夾
  • cd /home/software/myrpm
  • mkdir RPMS SOURCES SPECS SRPMS BUILD : 建立RPM相關資料夾

建立安裝檔

接著將我要安裝的檔案放置在 SOURCE 裡

  • cd /home/software/myrpm/SOURCES
  • mkdir mypackage-1.0 : 建立 package 的資料夾與版號
  • cd mypackage-1.0
  • vim mytest : 建立一個要安裝的檔案,內容就輸入:
  1. echo "Auto install New File , sucess!"

用 Tar -zcvf 打包安裝檔

  • cd /home/software/myrpm/SOURCES :回到SOURCE打包 tar 檔
  • tar -zcvf mypackage.tar.gz mypackage-1.0

結果如下

  1. [puritys]SOURCES$ tar -zcvf mypackage.tar.gz mypackage-1.0
  2. mypackage-1.0/
  3. mypackage-1.0/mytest
  4. [puritys]SOURCES$ ls
  5. mypackage-1.0 mypackage.tar.gz
  6. [puritys]SOURCES$

建立安裝規格檔 (SPEC)

  • cd /home/software/myrpm/SPECS : 進入SPEC目錄
  • vim example.spec :內容如下
  1. #將設定的RPM名稱、版號、路徑,以變數的方式指定
  2. %define _topdir /home/software/myrpm/
  3. %define Version 1.0
  4. %define RPM_BUILD_ROOT _topdir
  5. %define Name mypackage
  6. %define BuildRoot /tmp/%{Name}-buildroot
  7. #RPM相關資料
  8. Summary: My First RPM Package
  9. Name: %{Name} # Package 名稱
  10. Version: %{Version} #版號
  11. Release: 1
  12. Vendor: no <cxxand@gmail.com>
  13. Packager: myName <mail@gmail.com> #開發者資料
  14. License: GPL
  15. Group: develope
  16. Source : mypackage.tar.gz #tar ball檔案
  17. BuildRoot: %{BuildRoot} # RPM Build 的暫存目錄
  18.  
  19. %description
  20. 其他相關說明
  21.  
  22. %prep
  23. %setup -q
  24.  
  25. %build
  26.  
  27. %install
  28. #設定安裝的實際路徑與檔案
  29. install -d %{BuildRoot}/home/mypackage/
  30. cp mytest %{BuildRoot}/home/mypackage/
  31.  
  32. %files
  33. #安裝時:設定預設的檔案權限
  34. %defattr(755,root,root)
  35. #安裝時:設定檔案的屬性 chmod,chown,chgrp
  36. %attr(755,root,root) /home/mypackage/mytest
  37.  
  38. %clean
  39. rm -rf %{BuildRoot}/
  40.  

SPEC 說明

  • %prep : prepare的意思,安裝前執行的語法
  • %setup -q : 解開打包的 tar檔 (mypackage.tar.gz)
  • %install : 建立 RPM 時,執行的內容
    • install -d %{BuildRoot}/home/mypackage/ : 建立資料夾
    • cp mytest %{BuildRoot}/home/mypackage/ : 將檔案搬到指定的路徑
    • 這裡的路徑,都要指定 RPM 建立的暫存根目錄 (BuildRoot),根目錄後面就是直實的系統資料,未來安裝時會自動去掉前面的根目錄。
  • %files : 設定要搬移的檔案與權限
    • /home/mypackage/mytest :指定要安裝這個檔案
  • %clean : 時束後,清除沒用的檔案

建立自已的 PRM

  • cd /home/software/myrpm/SPECS
  • rpmbuild -bb example.spec

如果沒發生錯誤的話,檔案就會建立在 RPM/i386/mypackage-1.0-1.i386.rpm (OS版本不同,有可能出現 i686 之類的)

安裝我們建立的 RPM

  • cd /home/software/myrpm/
  • sudo rpm -ivh RPMS/i386/mypackage-1.0-1.i386.rpm

執行結果如下:

  1. [puritys]myrpm$ sudo rpm -ivh RPMS/i386/mypackage-1.0-1.i386.rpm
  2. Preparing... ########################################### [100%]
  3. 1:mypackage ########################################### [100%]
  4.  

測試看看是否正常安裝成功

  • cd /home/mypackage
  • sh mytest
  1. [puritys]mypackage$ sh mytest
  2. Auto install New File , sucess!

自動打包,建立RPM

上面的步驟還是有點多,要先打包tar ,然後再建立package,感覺就很怪,為什麼要做兩次,我就寫個 Shell script來簡化一下作業程序。

  • 先在 /home/software/myrpm/ 建立一個 mkMyCron.sh 的 shell script
File:mkMyCron.sh
  1. VERSION=1.0
  2. ROOT=/home/software/myrpm
  3. NAME=MyCron
  4. SOURCE_DIR=$ROOT/SOURCES/$NAME-$VERSION
  5.  
  6. #自動建立 tar ball
  7. mkdir $SOURCE_DIR
  8. cp /etc/crontab $SOURCE_DIR/
  9. cd SOURCES && tar -zcvf $ROOT/SOURCES/$NAME.tar.gz $NAME-$VERSION
  10. cd ../
  11.  
  12. #建立 SPEC file
  13. cat > SPECS/$NAME.spec << EOF
  14. %define _topdir $ROOT
  15. %define Version 1.0
  16. %define RPM_BUILD_ROOT _topdir
  17. %define Name $NAME
  18. %define BuildRoot /tmp/%{Name}-buildroot
  19. Summary: My First RPM Package
  20. Name: %{Name}
  21. Version: %{Version}
  22. Release: 1
  23. Vendor: no <cxxand@gmail.com>
  24. Packager: myName <mail@gmail.com>
  25. License: GPL
  26. Group: develope
  27. Source : $NAME.tar.gz
  28. BuildRoot: %{BuildRoot}
  29.  
  30. %description
  31. 其他相關說明
  32. %prep
  33. %setup -q
  34.  
  35. %build
  36.  
  37. %install
  38. #設定安裝的實際路徑與檔案
  39. install -d %{BuildRoot}/home/mycron/
  40. cp crontab %{BuildRoot}/home/mycron/
  41.  
  42. %files
  43. #安裝時:設定預設的檔案權限
  44. %defattr(755,root,root)
  45. #安裝時:設定檔案的屬性
  46. /home/mycron/crontab
  47.  
  48. %clean
  49. rm -rf %{BuildRoot}/
  50. EOF
  51.  
  52.  
  53. rpmbuild -bb SPECS/$NAME.spec
  54.  
  • sh mkMyCron.sh : 執行他,只要寫好script,一步就完成RPM Build囉!有空趕快把你的程式、設定檔建立成Package,以後安裝就方便多了。

RPM使用方式

  • rpm -ivh example.rpm : 安裝
  • rpm -e example : 刪除安裝檔,會自動移除相關的檔案
  • rpm -qa | grep example : 查詢系統安裝的package
  • rpm -qi rpmName:查詢 RPM Info
  • rpm -q --filesbypkg rpmName: 搜尋 RPM 中安裝的所有檔案
  • rpm -qid packagename : 取得 RPM 說明
  • rpm -qf filename: 查詢某個檔案所屬的 package 名稱

RPM 相關文件

線上的tutorial .寫的很詳盡,不過我覺得算是很爛的文件,範例給的少,文字描述又多,英文不好的人真的很難看懂...。

這個也是英文的教學,不過範例算是很ok了.


目前回應 Comments(3 comments)

  • npes87184 2015/08/12

    照打很像真的不行,絕的路徑有問題。

  • 張旭 2015/05/14

    wow! 感謝

  • NEIL 2013/11/21

    写的很详细,但是我不知道你在上面环境下做的。我做的时候是在centos 6.4下做的,但是有问题。

    Reply

    Admin

    我是在 centos 5.8 下執行的, 或許你可以貼上你的錯誤訊息,這樣我才知道哪邊有錯。

回應 (Leave a comment)