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 下執行的, 或許你可以貼上你的錯誤訊息,這樣我才知道哪邊有錯。