Linux--轻松定义自己的RPM/DEB软件包

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

     [前言] 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. 









本文转自 waydee 51CTO博客,原文链接:http://blog.51cto.com/waydee/834002,如需转载请自行联系原作者
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
1月前
|
存储 Shell Linux
【Shell 命令集合 系统设置 】Linux 软件包管理工具 rpm命令 使用指南
【Shell 命令集合 系统设置 】Linux 软件包管理工具 rpm命令 使用指南
49 0
|
1月前
|
存储 算法 Shell
【Shell 命令集合 设备管理 】Linux 显示当前系统中定义的键盘映射表 dumpkeys命令 使用指南
【Shell 命令集合 设备管理 】Linux 显示当前系统中定义的键盘映射表 dumpkeys命令 使用指南
31 0
|
26天前
|
Linux
Linux: yum查看、安装、删除软件包
Linux: yum查看、安装、删除软件包
30 0
|
1月前
|
缓存 Linux Android开发
【Linux】软件包管理器 yum
【Linux】软件包管理器 yum
|
2月前
|
Linux Windows
【Linux】Linux 软件包管理器 yum
【Linux】Linux 软件包管理器 yum
【Linux】Linux 软件包管理器 yum
|
2月前
|
前端开发 Linux
Linux软件包管理器- yum
Linux软件包管理器- yum
|
2月前
|
Linux 开发工具 Windows
Linux软件包管理器yum
Linux软件包管理器yum
33 0
|
3月前
|
算法 Linux 应用服务中间件
【Linux】RPM包管理工具
【Linux】RPM包管理工具
36 0
|
3月前
|
算法 Ubuntu Linux
【Linux】DEB软件包
【Linux】DEB软件包
35 0
|
存储 缓存 Linux
Linux Command dnf 软件包管理
Linux Command dnf 软件包管理
Linux Command dnf 软件包管理