天天看點

Linux--輕松定義自己的RPM/DEB軟體包

     [前言] Linux管理者大多數時候都是通過源碼包編譯安裝軟體,在安裝過程中不斷的遇到問題,不斷解決;為了從重複的編譯安裝操作中解脫,很多人都會選擇制作自己的RPM/DEB包,然後可以很友善的安裝,但是要制作RPM或者DEB包就不得不學習如何編寫SPECS或debian控制檔案,如何build。最近發現了FPM這個工具,它可以讓你省去閱讀漫長的文檔時間,直接可以制作自己的軟體包。 

給感興趣的人:

目錄:

1. FPM介紹

2. FPM安裝

3. 編譯安裝Mysql

4. FPM制作RPM/DEB包

5. FPM參數詳解

FPM介紹

FPM的作者是jordansissel 

關于FPM的介紹

<a href="https://docs.google.com/present/view?id=0Aa9liCTsAyzRZGNtd3dkOTRfMTdmczY2azlkcg&amp;hl=en" target="_blank">https://docs.google.com/present/view?id=0Aa9liCTsAyzRZGNtd3dkOTRfMTdmczY2azlkcg&amp;hl=en </a>

FPM功能簡單說就是将一種類型的包轉換成另一種類型。

支援的源類型包:“dir”:将目錄打包成所需要的類型,可以用于源碼編譯安裝的軟體包

“rpm”:對rpm進行轉換

“gem”:對rubygem包進行轉換

“python”:将python子產品打包成相應的類型

支援的目标類型包:

“rpm”:轉換為rpm包

“deb”:轉換為deb包

                  “solaris”:轉換為solaris包

“puppet”:轉換為puppet子產品

這裡主要介紹如何将源碼安裝的包轉換為RPM/DEB包,其他功能感興趣的可以試試。

FPM安裝

FPM的安裝非常簡單,安裝FPM前需要先安裝ruby,rubygem

[root@client1 ~]# gem  install  fpm 

Building native extensions.  This could take a while... 

Successfully installed json-1.6.6 

Successfully installed cabin-0.4.4 

Successfully installed backports-2.3.0 

Successfully installed arr-pm-0.0.7 

Successfully installed clamp-0.3.1 

Successfully installed fpm-0.4.6 

6 gems installed 

Installing ri documentation for json-1.6.6... 

Installing ri documentation for cabin-0.4.4... 

Installing ri documentation for backports-2.3.0... 

Installing ri documentation for arr-pm-0.0.7... 

Installing ri documentation for clamp-0.3.1... 

Installing ri documentation for fpm-0.4.6... 

Installing RDoc documentation for json-1.6.6... 

Installing RDoc documentation for cabin-0.4.4... 

Installing RDoc documentation for backports-2.3.0... 

Installing RDoc documentation for arr-pm-0.0.7... 

Installing RDoc documentation for clamp-0.3.1... 

Installing RDoc documentation for fpm-0.4.6... 

編譯安裝Mysql

下載下傳mysql源碼包,下載下傳位址:http://dev.mysql.com/downloads/

解壓源碼包:

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

編譯安裝:

[root@client1 tmp]# cd mysql-5.1.41 

[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   

[root@client1 mysql-5.1.41]#  make 

[root@client1 mysql-5.1.41]#  make all install 

安裝中遇到的錯誤:

錯誤一:

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

是因為沒有安裝ncurses包導緻的

[root@client1 mysql-5.1.41]# yum  list|grep ncurses*    

ncurses.x86_64                       5.7-3.20090208.el6        @base/$releasever 

ncurses-base.x86_64                  5.7-3.20090208.el6        @base/$releasever 

ncurses-libs.x86_64                  5.7-3.20090208.el6        @base/$releasever 

ncurses-devel.i686                   5.7-3.20090208.el6        base              

ncurses-devel.x86_64                 5.7-3.20090208.el6        base              

ncurses-libs.i686                    5.7-3.20090208.el6        base              

ncurses-static.x86_64                5.7-3.20090208.el6        base              

ncurses-term.x86_64                  5.7-3.20090208.el6        base              

php-pecl-ncurses.x86_64              1.0.1-1.el6               epel  

[root@client1 mysql-5.1.41]# yum install ncurses  ncurses-libs  ncurses-devel 

報錯二:

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

錯誤原因沒有安裝gcc-c++包

[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包,指令如下,具體參數解釋在文章的最後:

[root@client1 mysql-5.1.41]# cd .. 

[root@client1 tmp]# fpm -s dir  -t rpm -v 1.0 -n mysql_waydee  /opt/mysql/ 

/usr/lib/ruby/gems/1.8/gems/fpm-0.4.6/lib/fpm/package/deb.rb:19: warning: already initialized constant SCRIPT_MAP 

/usr/lib/ruby/gems/1.8/gems/fpm-0.4.6/lib/fpm/package/rpm.rb:23: warning: already initialized constant DIGEST_ALGORITHM_MAP 

/usr/lib/ruby/gems/1.8/gems/fpm-0.4.6/lib/fpm/package/rpm.rb:29: warning: already initialized constant COMPRESSION_MAP 

Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.XPQ8av 

Executing(%build): /bin/sh -e /var/tmp/rpm-tmp.j4a8lh 

Executing(%install): /bin/sh -e /var/tmp/rpm-tmp.sH6nx3 

Processing files: mysql_waydee-1.0-1.x86_64 

Wrote: /tmp/package-rpm-build20120413-13147-1by0r75/RPMS/x86_64/mysql_waydee-1.0-1.x86_64.rpm 

Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.9qzvuf 

Created rpm {"path":"mysql_waydee-1.0-1.x86_64.rpm"} 

檢視制作的rpm包,并傳到另一台伺服器執行安裝

[root@client1 tmp]# ls -l mysql_waydee-1.0-1.x86_64.rpm 

-rw-r--r-- 1 root root 24893316  4月 13 15:15 mysql_waydee-1.0-1.x86_64.rpm 

使用rpm指令檢視生成的rpm封包件

[root@client1 tmp]# rpm -qpl mysql_waydee-1.0-1.x86_64.rpm |head -n10 

/opt/mysql/bin/innochecksum 

/opt/mysql/bin/msql2mysql 

/opt/mysql/bin/my_print_defaults 

/opt/mysql/bin/myisam_ftdump 

/opt/mysql/bin/myisamchk 

/opt/mysql/bin/myisamlog 

/opt/mysql/bin/myisampack 

/opt/mysql/bin/mysql 

/opt/mysql/bin/mysql_client_test 

/opt/mysql/bin/mysql_config 

将生成的rpm包傳輸到另外一台測試伺服器,并安裝

[root@client1 tmp]# scp mysql_waydee-1.0-1.x86_64.rpm   192.168.2.102:/root 

The authenticity of host '192.168.2.102 (192.168.2.102)' can't be established. 

RSA key fingerprint is 7d:96:53:c2:ba:f3:e6:7b:b2:d2:f9:b1:3e:48:9a:88. 

Are you sure you want to continue connecting (yes/no)? yes 

Warning: Permanently added '192.168.2.102' (RSA) to the list of known hosts. 

[email protected]'s password:  

mysql_waydee-1.0-1.x86_64.rpm                                                                                                                  100%   24MB  23.7MB/s   00:01  

[root@client2 ~]# rpm -ivh mysql_waydee-1.0-1.x86_64.rpm  

Preparing...                ########################################### [100%] 

   1:mysql_waydee           ########################################### [100%] 

可以順利安裝,當然在制作RPM包的時候可以增加想要的dependences,這個看個人要求。

下面是将安裝好的mysql包制作為DEB包,省去不少時間

[root@client1 tmp]# fpm -s dir  -t deb  -v 1.0 -n mysql_waydee  /opt/mysql/    

Created deb package {"path":"/tmp/mysql-waydee_1.0_amd64.deb"} 

檢視打包好的deb包

[root@client1 tmp]# ls -l mysql-waydee_1.0_amd64.deb 

-rw-r--r-- 1 root root 25185038  4月 13 15:17 mysql-waydee_1.0_amd64.deb 

FPM參數詳解

Usage: fpm [options] 

-p, --package PACKAGEFILE        管理的軟體包 

-n, --name PACKAGENAME           定義生成的軟體包的名字 

-v, --version VERSION            定義生成的軟體包的版本 

    --iteration ITERATION        (可選) 為軟體包設定 iteration值 ('release' for RPM). 

    --epoch EPOCH                (可選) 為軟體包設定 epoch值 

-d, —depends DEPENDENCY     設定軟體包的依賴關系 

    --category SECTION_OR_GROUP 

    --provides PROVIDES 

    --conflicts CONFLICTS 

    --replaces REPLACES 

    --config-files PATH          (optional) Treat path as a configuration file. Uses conffiles in deb or %config 

                                 in rpm. (/etc/package.conf) 

-a, --architecture ARCHITECTURE 

-m, --maintainer MAINTAINER 

-C DIRECTORY                    在搜尋files前先進入該目錄 

-t PACKAGE_TYPE                 設定目标包的類型 

-s SOURCE_TYPE                   設定需要轉換的包類型 

-S PACKAGE_SUFFIX                which suffix to append to package and dependencies 

    --prefix PREFIX              A path to prefix files with when building the target package. This may not be 

                                 necessary for all source types. For example, the 'gem' type will prefix with 

                                 your gem directory (gem env | grep -A1 PATHS:) 

-e, --edit                       Edit the specfile before building 

-x, --exclude PATTERN            Exclude paths matching pattern (according to tar --exclude) 

    --post-install SCRIPTPATH    Add a post-install action. This script will be included in the resulting package 

    --pre-install SCRIPTPATH     Add a pre-install action. This script will be included in the resulting package 

    --pre-uninstall SCRIPTPATH   Add a pre-uninstall action. This script will be included in the resulting package 

    --post-uninstall SCRIPTPATH  Add a post-uninstall action. This script will be included in the resulting package 

    --description DESCRIPTION    Add a description for this package. 

    --url URL                    Add a url for this package. 

    --inputs FILEPATH            The path to a file containing a newline-separated list of files and dirs to package. 

                                 Pass - as the only argument to have the list of files and dirs read from STDIN (e.g. 

                                 fpm -s dir -t deb - &lt; FILELIST) 

    --gem-bin-path DIRECTORY     (gem source only) The directory to install gem executables 

    --gem-package-prefix PREFIX  (gem source only) Prefix for gem packages 

    --gem-gem PATH_TO_GEM        (gem source only) The path to the 'gem' tool (defaults to 'gem' and searches 

                                 your $PATH) 

    --python-bin PYTHON_BINARY_LOCATION 

                                 (python source only) The path to the python you want to run. Default is 'python' 

    --python-easyinstall EASY_INSTALL_PATH 

                                 (python source only) The path to your easy_install tool. Default is 'easy_install' 

    --python-pypi PYPI_SERVER    (python source only) PyPi Server uri for retrieving packages. Default 

                                 is 'http://pypi.python.org/simple' 

    --python-package-prefix PREFIX 

                                 (python source only) Prefix for python packages 

    --deb-ignore-iteration-in-dependencies 

                                 (deb target only) For = dependencies, allow iterations on the specified 

                                 version.  Default is to be specific. 

    --deb-pre-depends DEPENDENCY (deb target only) Add DEPENDENCY as Pre-Depends. 

    --deb-custom-control FILEPATH 

                                 (deb target only) Custom version of the Debian control file. 

本文轉自 waydee 51CTO部落格,原文連結:http://blog.51cto.com/waydee/834002,如需轉載請自行聯系原作者