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 : 建立一個要安裝的檔案,內容就輸入:
- echo "Auto install New File , sucess!"
用 Tar -zcvf 打包安裝檔
- cd /home/software/myrpm/SOURCES :回到SOURCE打包 tar 檔
- tar -zcvf mypackage.tar.gz mypackage-1.0
結果如下
- [puritys]SOURCES$ tar -zcvf mypackage.tar.gz mypackage-1.0
- mypackage-1.0/
- mypackage-1.0/mytest
- [puritys]SOURCES$ ls
- mypackage-1.0 mypackage.tar.gz
- [puritys]SOURCES$
建立安裝規格檔 (SPEC)
- cd /home/software/myrpm/SPECS : 進入SPEC目錄
- vim example.spec :內容如下
- #將設定的RPM名稱、版號、路徑,以變數的方式指定
- %define _topdir /home/software/myrpm/
- %define Version 1.0
- %define RPM_BUILD_ROOT _topdir
- %define Name mypackage
- %define BuildRoot /tmp/%{Name}-buildroot
- #RPM相關資料
- Summary: My First RPM Package
- Name: %{Name} # Package 名稱
- Version: %{Version} #版號
- Release: 1
- Vendor: no <cxxand@gmail.com>
- Packager: myName <mail@gmail.com> #開發者資料
- License: GPL
- Group: develope
- Source : mypackage.tar.gz #tar ball檔案
- BuildRoot: %{BuildRoot} # RPM Build 的暫存目錄
- %description
- 其他相關說明
- %prep
- %setup -q
- %build
- %install
- #設定安裝的實際路徑與檔案
- install -d %{BuildRoot}/home/mypackage/
- cp mytest %{BuildRoot}/home/mypackage/
- %files
- #安裝時:設定預設的檔案權限
- %defattr(755,root,root)
- #安裝時:設定檔案的屬性 chmod,chown,chgrp
- %attr(755,root,root) /home/mypackage/mytest
- %clean
- rm -rf %{BuildRoot}/
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
執行結果如下:
- [puritys]myrpm$ sudo rpm -ivh RPMS/i386/mypackage-1.0-1.i386.rpm
- Preparing... ########################################### [100%]
- 1:mypackage ########################################### [100%]
測試看看是否正常安裝成功
- cd /home/mypackage
- sh mytest
- [puritys]mypackage$ sh mytest
- Auto install New File , sucess!
自動打包,建立RPM
上面的步驟還是有點多,要先打包tar ,然後再建立package,感覺就很怪,為什麼要做兩次,我就寫個 Shell script來簡化一下作業程序。
- 先在 /home/software/myrpm/ 建立一個 mkMyCron.sh 的 shell script
- VERSION=1.0
- ROOT=/home/software/myrpm
- NAME=MyCron
- SOURCE_DIR=$ROOT/SOURCES/$NAME-$VERSION
- #自動建立 tar ball
- mkdir $SOURCE_DIR
- cp /etc/crontab $SOURCE_DIR/
- cd SOURCES && tar -zcvf $ROOT/SOURCES/$NAME.tar.gz $NAME-$VERSION
- cd ../
- #建立 SPEC file
- cat > SPECS/$NAME.spec << EOF
- %define _topdir $ROOT
- %define Version 1.0
- %define RPM_BUILD_ROOT _topdir
- %define Name $NAME
- %define BuildRoot /tmp/%{Name}-buildroot
- Summary: My First RPM Package
- Name: %{Name}
- Version: %{Version}
- Release: 1
- Vendor: no <cxxand@gmail.com>
- Packager: myName <mail@gmail.com>
- License: GPL
- Group: develope
- Source : $NAME.tar.gz
- BuildRoot: %{BuildRoot}
- %description
- 其他相關說明
- %prep
- %setup -q
- %build
- %install
- #設定安裝的實際路徑與檔案
- install -d %{BuildRoot}/home/mycron/
- cp crontab %{BuildRoot}/home/mycron/
- %files
- #安裝時:設定預設的檔案權限
- %defattr(755,root,root)
- #安裝時:設定檔案的屬性
- /home/mycron/crontab
- %clean
- rm -rf %{BuildRoot}/
- EOF
- rpmbuild -bb SPECS/$NAME.spec
- 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下做的,但是有问题。
ReplyAdmin
我是在 centos 5.8 下執行的, 或許你可以貼上你的錯誤訊息,這樣我才知道哪邊有錯。