[前言] Linux管理员大多数时候都是通过源码包编译安装软件,在安装过程中不断的遇到问题,不断解决;为了从重复的编译安装操作中解脱,很多人都会选择制作自己的RPM/DEB包,然后可以很方便的安装,但是要制作RPM或者DEB包就不得不学习如何编写SPECS或debian控制文件,如何build。最近发现了FPM这个工具,它可以让你省去阅读漫长的文档时间,直接可以制作自己的软件包。 

给感兴趣的人:

RPM包制作: http://www.rpm.org/max-rpm/  

DEB包制作: http://www.debian.org/doc/manuals/maint-guide/

 

目录:

1. FPM介绍

2. FPM安装

3. 编译安装Mysql

4. FPM制作RPM/DEB包

5. FPM参数详解

 

FPM介绍

FPM的作者是jordansissel 

关于FPM的介绍

https://docs.google.com/present/view?id=0Aa9liCTsAyzRZGNtd3dkOTRfMTdmczY2azlkcg&hl=en 

FPM功能简单说就是将一种类型的包转换成另一种类型。

支持的源类型包:“dir”:将目录打包成所需要的类型,可以用于源码编译安装的软件包

“rpm”:对rpm进行转换

“gem”:对rubygem包进行转换

“python”:将python模块打包成相应的类型

支持的目标类型包:

“rpm”:转换为rpm包

“deb”:转换为deb包

                  “solaris”:转换为solaris包

“puppet”:转换为puppet模块

这里主要介绍如何将源码安装的包转换为RPM/DEB包,其他功能感兴趣的可以试试。

 

FPM安装

FPM的安装非常简单,安装FPM前需要先安装ruby,rubygem

 

  1. [root@client1 ~]# gem  install  fpm 
  2.  
  3. Building native extensions.  This could take a while... 
  4. Successfully installed json-1.6.6 
  5. Successfully installed cabin-0.4.4 
  6. Successfully installed backports-2.3.0 
  7. Successfully installed arr-pm-0.0.7 
  8. Successfully installed clamp-0.3.1 
  9. Successfully installed fpm-0.4.6 
  10. 6 gems installed 
  11. Installing ri documentation for json-1.6.6... 
  12. Installing ri documentation for cabin-0.4.4... 
  13. Installing ri documentation for backports-2.3.0... 
  14. Installing ri documentation for arr-pm-0.0.7... 
  15. Installing ri documentation for clamp-0.3.1... 
  16. Installing ri documentation for fpm-0.4.6... 
  17. Installing RDoc documentation for json-1.6.6... 
  18. Installing RDoc documentation for cabin-0.4.4... 
  19. Installing RDoc documentation for backports-2.3.0... 
  20. Installing RDoc documentation for arr-pm-0.0.7... 
  21. Installing RDoc documentation for clamp-0.3.1... 
  22. Installing RDoc documentation for fpm-0.4.6... 

 

编译安装Mysql

下载mysql源码包,下载地址:http://dev.mysql.com/downloads/

解压源码包:

  1. [root@client1 tmp]# unzip mysql-5.1.41.zip 

编译安装:

  1. [root@client1 tmp]# cd mysql-5.1.41 
  2.  
  3. [root@client1 mysql-5.1.41]# ./configure --prefix=/opt/mysql --localstatedir=/opt/var/mysql/var --with-unix-socket-path=/opt/mysql/mysql.sock --with-mysqld-user=mysql --with-plugins=archive,partition,myisam,innobase,heap,csv --with-extra-charsets=gbk,gb2312,utf8,ascii --with-charset=utf8 --with-collation=utf8_general_ci --with-big-tables --enable-assembler --enable-profiling --enable-local-infile --enable-thread-safe-client --with-fast-mutexes --with-pthread --with-zlib-dir=bundled --with-readline --without-geometry --without-embedded-server --without-debug --without-ndb-debug --with-client-ldflags=-all-static --with-mysqld-ldflags=-all-static   
  4.  
  5. [root@client1 mysql-5.1.41]#  make 
  6.  
  7. [root@client1 mysql-5.1.41]#  make all install 

 

安装中遇到的错误:

错误一:

checking for termcap functions library... configure: error: No curses/termcap library found

是因为没有安装ncurses包导致的

  1. [root@client1 mysql-5.1.41]# yum  list|grep ncurses*    
  2.  
  3. ncurses.x86_64                       5.7-3.20090208.el6        @base/$releasever 
  4.  
  5. ncurses-base.x86_64                  5.7-3.20090208.el6        @base/$releasever 
  6.  
  7. ncurses-libs.x86_64                  5.7-3.20090208.el6        @base/$releasever 
  8.  
  9. ncurses-devel.i686                   5.7-3.20090208.el6        base              
  10.  
  11. ncurses-devel.x86_64                 5.7-3.20090208.el6        base              
  12.  
  13. ncurses-libs.i686                    5.7-3.20090208.el6        base              
  14.  
  15. ncurses-static.x86_64                5.7-3.20090208.el6        base              
  16.  
  17. ncurses-term.x86_64                  5.7-3.20090208.el6        base              
  18.  
  19. php-pecl-ncurses.x86_64              1.0.1-1.el6               epel  
  20.  
  21.  
  22. [root@client1 mysql-5.1.41]# yum install ncurses  ncurses-libs  ncurses-devel 

 

报错二:

../depcomp: line 571: exec: g++: not found

错误原因没有安装gcc-c++包

  1. [root@client1 mysql-5.1.41]# yum install gcc-c++ 

报错三

./include/my_global.h:1099: 错误:对 C++ 内建类型 ‘bool’ 的重声明

这个错误是因为先./congfigure 又装的gcc-c++之后又make 导致的,解决方法是重新./configure,make,make install就可以恢复

 

FPM制作RPM/DEB包

开始打包安装好的mysql,并转换为rpm包,命令如下,具体参数解释在文章的最后:

  1. [root@client1 mysql-5.1.41]# cd .. 
  2.  
  3. [root@client1 tmp]# fpm -s dir  -t rpm -v 1.0 -n mysql_waydee  /opt/mysql/ 
  4.  
  5. /usr/lib/ruby/gems/1.8/gems/fpm-0.4.6/lib/fpm/package/deb.rb:19: warning: already initialized constant SCRIPT_MAP 
  6.  
  7. /usr/lib/ruby/gems/1.8/gems/fpm-0.4.6/lib/fpm/package/rpm.rb:23: warning: already initialized constant DIGEST_ALGORITHM_MAP 
  8.  
  9. /usr/lib/ruby/gems/1.8/gems/fpm-0.4.6/lib/fpm/package/rpm.rb:29: warning: already initialized constant COMPRESSION_MAP 
  10.  
  11. Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.XPQ8av 
  12.  
  13. Executing(%build): /bin/sh -e /var/tmp/rpm-tmp.j4a8lh 
  14.  
  15. Executing(%install): /bin/sh -e /var/tmp/rpm-tmp.sH6nx3 
  16.  
  17. Processing files: mysql_waydee-1.0-1.x86_64 
  18.  
  19. Wrote: /tmp/package-rpm-build20120413-13147-1by0r75/RPMS/x86_64/mysql_waydee-1.0-1.x86_64.rpm 
  20.  
  21. Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.9qzvuf 
  22.  
  23. Created rpm {"path":"mysql_waydee-1.0-1.x86_64.rpm"

查看制作的rpm包,并传到另一台服务器执行安装

  1. [root@client1 tmp]# ls -l mysql_waydee-1.0-1.x86_64.rpm 
  2.  
  3. -rw-r--r-- 1 root root 24893316  4月 13 15:15 mysql_waydee-1.0-1.x86_64.rpm 

使用rpm命令查看生成的rpm包文件

  1. [root@client1 tmp]# rpm -qpl mysql_waydee-1.0-1.x86_64.rpm |head -n10 
  2.  
  3. /opt/mysql/bin/innochecksum 
  4.  
  5. /opt/mysql/bin/msql2mysql 
  6.  
  7. /opt/mysql/bin/my_print_defaults 
  8.  
  9. /opt/mysql/bin/myisam_ftdump 
  10.  
  11. /opt/mysql/bin/myisamchk 
  12.  
  13. /opt/mysql/bin/myisamlog 
  14.  
  15. /opt/mysql/bin/myisampack 
  16.  
  17. /opt/mysql/bin/mysql 
  18.  
  19. /opt/mysql/bin/mysql_client_test 
  20.  
  21. /opt/mysql/bin/mysql_config 

将生成的rpm包传输到另外一台测试服务器,并安装

  1. [root@client1 tmp]# scp mysql_waydee-1.0-1.x86_64.rpm   192.168.2.102:/root 
  2.  
  3. The authenticity of host '192.168.2.102 (192.168.2.102)' can't be established. 
  4.  
  5. RSA key fingerprint is 7d:96:53:c2:ba:f3:e6:7b:b2:d2:f9:b1:3e:48:9a:88. 
  6.  
  7. Are you sure you want to continue connecting (yes/no)? yes 
  8.  
  9. Warning: Permanently added '192.168.2.102' (RSA) to the list of known hosts. 
  10.  
  11. root@192.168.2.102's password:  
  12.  
  13. mysql_waydee-1.0-1.x86_64.rpm                                                                                                                  100%   24MB  23.7MB/s   00:01  
  14.  
  15.  
  16.  
  17. [root@client2 ~]# rpm -ivh mysql_waydee-1.0-1.x86_64.rpm  
  18.  
  19. Preparing...                ########################################### [100%] 
  20.  
  21.    1:mysql_waydee           ########################################### [100%] 

可以顺利安装,当然在制作RPM包的时候可以增加想要的dependences,这个看个人要求。

下面是将安装好的mysql包制作为DEB包,省去不少时间

  1. [root@client1 tmp]# fpm -s dir  -t deb  -v 1.0 -n mysql_waydee  /opt/mysql/    
  2.  
  3. /usr/lib/ruby/gems/1.8/gems/fpm-0.4.6/lib/fpm/package/deb.rb:19: warning: already initialized constant SCRIPT_MAP 
  4.  
  5. /usr/lib/ruby/gems/1.8/gems/fpm-0.4.6/lib/fpm/package/rpm.rb:23: warning: already initialized constant DIGEST_ALGORITHM_MAP 
  6.  
  7. /usr/lib/ruby/gems/1.8/gems/fpm-0.4.6/lib/fpm/package/rpm.rb:29: warning: already initialized constant COMPRESSION_MAP 
  8.  
  9. Created deb package {"path":"/tmp/mysql-waydee_1.0_amd64.deb"

查看打包好的deb包

  1. [root@client1 tmp]# ls -l mysql-waydee_1.0_amd64.deb 
  2.  
  3. -rw-r--r-- 1 root root 25185038  4月 13 15:17 mysql-waydee_1.0_amd64.deb 

 

FPM参数详解

  1. Usage: fpm [options] 
  2.  
  3. -p, --package PACKAGEFILE        管理的软件包 
  4.  
  5. -n, --name PACKAGENAME           定义生成的软件包的名字 
  6.  
  7. -v, --version VERSION            定义生成的软件包的版本 
  8.  
  9.     --iteration ITERATION        (可选) 为软件包设置 iteration值 ('release' for RPM). 
  10.  
  11.     --epoch EPOCH                (可选) 为软件包设置 epoch值 
  12.  
  13. -d, —depends DEPENDENCY     设置软件包的依赖关系 
  14.  
  15.     --category SECTION_OR_GROUP 
  16.  
  17.     --provides PROVIDES 
  18.  
  19.     --conflicts CONFLICTS 
  20.  
  21.     --replaces REPLACES 
  22.  
  23.     --config-files PATH          (optional) Treat path as a configuration file. Uses conffiles in deb or %config 
  24.  
  25.                                  in rpm. (/etc/package.conf) 
  26.  
  27. -a, --architecture ARCHITECTURE 
  28.  
  29. -m, --maintainer MAINTAINER 
  30.  
  31. -C DIRECTORY                    在搜索files前先进入该目录 
  32.  
  33. -t PACKAGE_TYPE                 设置目标包的类型 
  34.  
  35. -s SOURCE_TYPE                   设置需要转换的包类型 
  36.  
  37. -S PACKAGE_SUFFIX                which suffix to append to package and dependencies 
  38.  
  39.     --prefix PREFIX              A path to prefix files with when building the target package. This may not be 
  40.  
  41.                                  necessary for all source types. For example, the 'gem' type will prefix with 
  42.  
  43.                                  your gem directory (gem env | grep -A1 PATHS:) 
  44.  
  45. -e, --edit                       Edit the specfile before building 
  46.  
  47. -x, --exclude PATTERN            Exclude paths matching pattern (according to tar --exclude) 
  48.  
  49.     --post-install SCRIPTPATH    Add a post-install action. This script will be included in the resulting package 
  50.  
  51.     --pre-install SCRIPTPATH     Add a pre-install action. This script will be included in the resulting package 
  52.  
  53.     --pre-uninstall SCRIPTPATH   Add a pre-uninstall action. This script will be included in the resulting package 
  54.  
  55.     --post-uninstall SCRIPTPATH  Add a post-uninstall action. This script will be included in the resulting package 
  56.  
  57.     --description DESCRIPTION    Add a description for this package. 
  58.  
  59.     --url URL                    Add a url for this package. 
  60.  
  61.     --inputs FILEPATH            The path to a file containing a newline-separated list of files and dirs to package. 
  62.  
  63.                                  Pass - as the only argument to have the list of files and dirs read from STDIN (e.g. 
  64.  
  65.                                  fpm -s dir -t deb - < FILELIST) 
  66.  
  67.     --gem-bin-path DIRECTORY     (gem source only) The directory to install gem executables 
  68.  
  69.     --gem-package-prefix PREFIX  (gem source only) Prefix for gem packages 
  70.  
  71.     --gem-gem PATH_TO_GEM        (gem source only) The path to the 'gem' tool (defaults to 'gem' and searches 
  72.  
  73.                                  your $PATH) 
  74.  
  75.     --python-bin PYTHON_BINARY_LOCATION 
  76.  
  77.                                  (python source only) The path to the python you want to run. Default is 'python' 
  78.  
  79.     --python-easyinstall EASY_INSTALL_PATH 
  80.  
  81.                                  (python source only) The path to your easy_install tool. Default is 'easy_install' 
  82.  
  83.     --python-pypi PYPI_SERVER    (python source only) PyPi Server uri for retrieving packages. Default 
  84.  
  85.                                  is 'http://pypi.python.org/simple' 
  86.  
  87.     --python-package-prefix PREFIX 
  88.  
  89.                                  (python source only) Prefix for python packages 
  90.  
  91.     --deb-ignore-iteration-in-dependencies 
  92.  
  93.                                  (deb target only) For = dependencies, allow iterations on the specified 
  94.  
  95.                                  version.  Default is to be specific. 
  96.  
  97.     --deb-pre-depends DEPENDENCY (deb target only) Add DEPENDENCY as Pre-Depends. 
  98.  
  99.     --deb-custom-control FILEPATH 
  100.  
  101.                                  (deb target only) Custom version of the Debian control file.