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)