Linux FPM制作RMP包

一.FPM的介绍:

1.FPM项目地址:("https://github.com/jordansissel/fpm")

2.FPM是一个打包工具[ruby的一个模块]

二.FPM的安装:

1.安装依赖包:

    [CentOS类系统]

    yum -y groupinstall "Development Tools"

    yum -y install ruby ruby-devel rubygems gcc openssl-devel

2.安装FPM:

    *添加淘宝的Ruby仓库

        gem sources --add http://ruby.taobao.org/

    *移除原生的Ruby仓库

        gem sources --remove http://rubygems.org/

    *安装fpm

        gem install arr-pm fpm

3.shell脚本化安装FPM:

    [root@localhost ~]# cat fpm_install.sh

    #!/bin/bash

    Fpm_Install(){

    cat <

        Install Fpm packages

        Fpm is based on ruby,Frist you need to install ruby and Install Fpm after that.

    EOF

        yum -y install ruby rubygems ruby-devel gcc openssl-devel

        gem sources --add https://ruby.taobao.org/

        gem sources --remove http://rubygems.org/

        gem install arr-pm fpm

    }

    Fpm_Install

三.FPM常用参数:

-f :强制覆盖[覆盖同名rpm包]

-n :指定的rpm包名

-p :指定的rpm包文件放置位置

-v :指定的rpm包版本

-d :指定依赖的软件  ( [-d 'name'] or [-d 'name > version'] 例子: -d 'libstdc++ >= 4.4.3')

-a :指定系统架构,如果是noarch则为'-a all' 或者 '-a native' [x86_64] 当软件不区分64位或32位的时候可以 noarch

-s :指定INPUT的数据类型 (["-s dir"] 省略数据类型)

-m :指定打包人员[Packager]  ([ -m 'user'])

-C :指定打包的相对路径,类似于buildroot. 譬如-C /tmp/apr/ 而打包机器的数据包路径是/tmp/apr/{opt,usr,etc} 那安装这个rpm包后,在本地的数据就是/opt/,/usr/,/etc/

-t :指定需要制作成什么包,可选项有(deb,rpm,solaris,etc)

    支持的源类型::

        "dir" "rpm" "gem" "python" "empty" "tar" "deb" "cpan" "npm" "osxpkg" "pear" "pkgin" "virtualenv" "zip"

    支持的目标类型:

        "rpm" "deb" "solaris" "puppet" "dir" "osxpkg" "p5p" "puppet" "sh" "solaris" "tar" "zip"

--description        :软件包描述

--conflicts        :指定冲突软件

--url                :指定站点[惯例都是添加软件的官网 例如: --url "http://www.cnblog.com/roach57" ]

--verbose            :安装过程详细打印

--after-install    :包安装之后执行的脚本 也可写作 --post-install FILE

--before-install    :包安装之前执行的脚本

--after-remove        :包卸载之后执行的脚本

--before-remove    :包卸载之前执行的脚本

--after-upgrade    :包更新之后执行的脚本[仅支持 deb 和 rpm 这两种包]

--before-upgrade    :包更新之前执行的脚本

--iteration        :发布序号[就是rpm包里面的release]

--epoch            :纪元  [不知道干嘛用的]

--no-rpm-sign        :不使用rpm签名  Signature

--license            :证书许可 [可选项有 'BSD(开源软件)' 'GPLv2(自由软件)' 'MIT' 'Public Domain(公共域)' 'Distributable(贡献)' 'commercial(商业)' 'Share(共享)等',一般的开发都写'BSD'或'GPL']

--vendor            :供应商名称 [ --vendor 'roach57@163.com']

--no-depends        :代表没有任何依赖包,和-d是对立的,不能共用

--config-files        :指定配置文件,可以指定目录[递归]

--directories        :指定包目录

--category            :软件所属的类别[这是个什么软件]下面有个对应的表格:

    [参考这个文件 /usr/share/doc/rpm-x.x.x/GROUPS ]

    Amusements/Games [娱乐/游戏]

    Amusements/Graphics [娱乐/图形]

    Applications/Archiving [应用/文档]

    Applications/Communications [应用/通讯]

    Applications/Databases [应用/数据库]

    Applications/Editors [应用/编辑器]

    Applications/Emulators [应用/仿真器]

    Applications/Engineering [应用/工程]

    Applications/File [应用/文件]

    Applications/Internet [应用/因特网]

    Applications/Multimedia [应用/多媒体]

    Applications/Productivity [应用/产品]

    Applications/Publishing [应用/印刷]

    Applications/System [应用/系统]

    Applications/Text [应用/文本]

    Development/Debuggers [开发/调试器]

    Development/Languages [开发/语言]

    Development/Libraries [开发/函数库]

    Development/System [开发/系统]

    Development/Tools [开发/工具]

    Documentation [文档]

    System Environment/Base [系统环境/基础]

    System Environment/Daemons [系统环境/守护]

    System Environment/Kernel [系统环境/内核]

    System Environment/Libraries [系统环境/函数库]

    System Environment/Shells [系统环境/接口]

    User Interface/Desktops [用户界面/桌面]

    User Interface/X [用户界面/X窗口]

    User Interface/X Hardware Support [用户界面/X硬件支持]

四.RPM包的组成格式:

roach-1.0.1-57.el6.x86_64.rpm

  |    |    |      |    |

软件名称|    |      |    |

    版本号  |      |    |

          发布号    |      |

                  硬件平台  |

                            扩展名

例子备注:

    roach  :软件名称

    1.0.1  :软件版本号

    57.el6 :发布号主要是对软件存在的bug或漏洞进行修补,在软件功能上并没有变化,el6指的是rhel6系统中发布

    x86_64 :指64位的PC架构,另外还有'i386' 'i686' 等32位的PC架构,noarch是指不区分硬件架构

    rpm    :扩展名

五.RPM包制作实例:

1.实例一[用源码包自定义RPM包]:

    以Nginx为例:

        * 解压nginx的tar包:

            [root@localhost nginx]# tar -zxf nginx-1.6.2.tar.gz

        * 进入到解压目录中进行预编译:

            [root@localhost nginx]# cd nginx-1.6.2

            [root@localhost nginx-1.6.2]# ./configure \

            --prefix=/usr/local/nginx \

            --sbin-path=/usr/sbin/nginx \

            --conf-path=/etc/nginx/nginx.conf \

            --error-log-path=/var/log/nginx/error.log \

            --http-log-path=/var/log/nginx/access.log \

            --pid-path=/var/run/nginx/nginx.pid  \

            --lock-path=/var/lock/nginx.lock \

            --user=nginx \

            --group=nginx \

            --with-http_ssl_module \

            --with-http_flv_module \

            --with-http_stub_status_module \

            --with-http_gzip_static_module \

            --http-client-body-temp-path=/var/tmp/nginx/client/ \

            --http-proxy-temp-path=/var/tmp/nginx/proxy/ \

            --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \

            --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \

            --http-scgi-temp-path=/var/tmp/nginx/scgi \

            --with-pcre \

            --with-debug \

        * 编译

            [root@localhost nginx-1.6.2]# make -j24 //使用多核编译

            [root@localhost nginx-1.6.2]# mkdir -p /temp/fpm_install/

        * 安装到指定的目录中:

            [root@localhost nginx-1.6.2]# make -j24 install DESTDIR=/temp/fpm_install/

            [root@localhost nginx-1.6.2]# ll /temp/fpm_install/

            total 16

            drwxr-xr-x. 4 root root 4096 Jan 11 08:22 etc

            drwxr-xr-x. 2 root root 4096 Jan 11 08:37 tmp

            drwxr-xr-x. 4 root root 4096 Jan 11 08:20 usr

            drwxr-xr-x. 4 root root 4096 Jan 11 08:20 var

            [root@localhost nginx-1.6.2]# cd /temp/fpm_install/tmp

            [root@localhost nginx-1.6.2]# cat install_after.sh

            #!/bin/bash

            source /etc/rc.d/init.d/functions

            groupadd -r nginx

            useradd -r -g nginx nginx

            exit $?

            [root@localhost nginx-1.6.2]# cat remove_after.sh

            #!/bin/bash

            source /etc/rc.d/init.d/functions

            rm -rf /usr/local/nginx

            rm -rf /etc/nginx

            userdel nginx

            exit $?

        * 制作RPM包:

            [root@localhost nginx-1.6.2]# fpm -f -s dir \

            -t rpm \

            -n nginx \

            -v 1.6.2 \

            --iteration 1.el6 \

            -C /temp/fpm_install/ \

            -p /temp/nginx_rpm/ \

            --description 'nginx1.6.2_rpm' \

            --url 'http://nginx.org/en/' \

            --after-install /temp/fpm_install/tmp/install_after.sh \

            --after-remove /temp/fpm_install/tmp/remove_after.sh

            [root@localhost nginx-1.6.2]# cd /temp/nginx_rpm/;ls

            nginx-1.6.2-1.el6.x86_64.rpm

2.实例二[简单的软件包制作]:

        * 创建测试目录:

            [root@localhost install_rpm]# mkdir /temp/install_rpm

            [root@localhost install_rpm]# cd /temp/install_rpm

        * 创建测试用的文件和脚本:

            [root@localhost install_rpm]# tree roach

            roach

            ├── roach_test

            └── tmp

                ├── mk_dir.sh

                └── rm_dir.sh

            [root@localhost install_rpm]# cat roach/roach_test

            this is the test file!

            [root@localhost tmp]# cat mk_dir.sh

            #!/bin/bash

            source /etc/rc.d/init.d/functions

            mkdir -p /temp/roach

            exit $?

            [root@localhost install_rpm]# cat roach/tmp/mk_file.sh  //安装rpm后执行的脚本

            #!/bin/bash

            source /etc/rc.d/init.d/functions

            cd /temp/roach/

            touch  {1..10}

            exit $?

            [root@localhost install_rpm]# cat roach/tmp/rm_dir.sh  //卸载完后执行的脚本

            #!/bin/bash

            source /etc/rc.d/init.d/functions

            rm -rf /temp/roach

            rm -rf /roach

            exit $?

        * 制作一个属于自己的RPM包:

            [root@localhost install_rpm]# mkdir -p /temp/roach_rpm

            [root@localhost install_rpm]# fpm -f -s dir \

            -t rpm \

            -n roach \

            -v 1.0.1 \

            --iteration 1.el6 \

            -C /temp/install_rpm/ \

            -p /temp/roach_rpm/ \

            --description 'roach_test_1.0.1.rpm' \

            --url 'http://www.cnblogs.com/roach57' \

            --before-install /temp/install_rpm/roach/tmp/mk_dir.sh \

            --after-install /temp/install_rpm/roach/tmp/mk_file.sh \

            --after-remove /temp/install_rpm/roach/tmp/rm_dir.sh \

            --license 'BSD' \

            --verbose \

            --category 'Application/File' \

            -m 'roach' \

            --vendor 'roach57@163.com'

        * 查看生成的RPM包的信息:

            [root@localhost install_rpm]# cd /temp/roach_rpm;ls

            roach-1.0.1-1.el6.x86_64.rpm

            [root@localhost roach_rpm]# rpm -qp --scripts roach-1.0.1-1.el6.x86_64.rpm

            preinstall scriptlet (using /bin/sh):

            #!/bin/bash

            source /etc/rc.d/init.d/functions

            mkdir -p /temp/roach

            exit $?

            postinstall scriptlet (using /bin/sh):

            #!/bin/bash

            source /etc/rc.d/init.d/functions

            cd /temp/roach/

            touch  {1..10}

            exit $?

            postuninstall scriptlet (using /bin/sh):

            #!/bin/bash

            source /etc/rc.d/init.d/functions

            rm -rf /temp/roach

            rm -rf /roach

            exit $?

            [root@localhost roach_rpm]# rpm -qpi roach-1.0.1-1.el6.x86_64.rpm

            Name        : roach                        Relocations: /

            Version    : 1.0.1                            Vendor: roach57@163.com

            Release    : 1.el6                        Build Date: Thu 14 Jan 2016 05:44:17 AM EST

            Install Date: (not installed)              Build Host: localhost

            Group      : Application/File              Source RPM: roach-1.0.1-1.el6.src.rpm

            Size        : 259                              License: BSD

            Signature  : (none)

            Packager    : roach

            URL        : http://www.cnblogs.com/roach57

            Summary    : roach_test_1.0.1.rpm

            Description :

            roach_test_1.0.1.rpm

        * 安装rpm包:

            [root@localhost roach_rpm]# rpm -ivh roach-1.0.1-1.el6.x86_64.rpm

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

              1:roach                  ########################################### [100%]

            [root@localhost roach_rpm]# tree /roach; tree /temp/roach

            /roach

            ├── roach_test

            └── tmp

                ├── mk_dir.sh

                ├── mk_file.sh

                └── rm_dir.sh

            1 directory, 4 files

            /temp/roach

            ├── 1

            ├── 10

            ├── 2

            ├── 3

            ├── 4

            ├── 5

            ├── 6

            ├── 7

            ├── 8

            └── 9

            0 directories, 10 files

        * 指定目录安装RPM:

            [root@localhost roach_rpm]# rpm -ivh roach-1.0.1-1.el6.x86_64.rpm --prefix=/temp

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

              1:roach                  ########################################### [100%]

            [root@localhost tmp]# tree /temp/roach

            /temp/roach

            ├── 1

            ├── 10

            ├── 2

            ├── 3

            ├── 4

            ├── 5

            ├── 6

            ├── 7

            ├── 8

            ├── 9

            ├── roach_test

            └── tmp

                ├── mk_dir.sh

                ├── mk_file.sh

                └── rm_dir.sh

            1 directory, 14 files

        * 卸载rpm包:

            [root@localhost roach_rpm]# rpm -e roach-1.0.1-1.el6.x86_64

        * 实例二完结!

3.FPM运行报错解决方法如下:

    注: 如果正常按照gem去安装,如果调用fpm失败,可能是因为cabin的版本有问题[报错如下]:

    [root@localhost ~]# fpm

    /usr/lib/ruby/gems/1.8/gems/cabin-0.8.0/lib/cabin/mixins/logger.rb:12:in 'included': undefined method 'options' for # (NoMethodError)

    from /usr/lib/ruby/gems/1.8/gems/cabin-0.8.0/lib/cabin/channel.rb:105:in 'call'

    解决方法如下:

          卸载当前cabin版本:

            [root@localhost ~]# gem uninstall cabin

        用旧版本的cabin:

            [root@localhost ~]# gem install cabin -v 0.7.2

六.RPM包信息:

1.查看RPM包中的脚本信息:

    [root@localhost ~]# rpm -qp --scripts roach-1.0.1-57.el6.x86_64.rpm

        postinstall scriptlet (using /bin/sh):

        #!/bin/bash

        source /etc/rc.d/init.d/functions

        cd temp/roach/

        for i in {1..10};do

            touch  $i

        done

        exit 0

        postuninstall scriptlet (using /bin/sh):

        #!/bin/bash

        source /etc/rc.d/init.d/functions

        rm -rf temp/roach

        exit 0

2.查看RPM包目录结构:

    [root@localhost ~]# rpm -qpl roach-1.0.1-57.el6.x86_64.rpm

        /temp/roach/tmp/mk_dir.sh

        /temp/roach/tmp/rm_dir.sh

        /temp/roach/roach_test

3.RPM包验证:

    [root@localhost ~]# rpm -K roach-1.0.1-57.el6.x86_64.rpm

        roach-1.0.1-57.el6.x86_64.rpm: sha1 md5 OK

4.查看RPM包的属性:

    [root@localhost ~]# rpm -qpi roach-1.0.1-57.el6.x86_64.rpm

        Name        : roach                        Relocations: /

        Version    : 1.0.1                            Vendor: roach57@163.com

        Release    : 57.el6                        Build Date: Thu 14 Jan 2016 01:16:33 AM EST

        Install Date: (not installed)              Build Host: localhost

        Group      : Application/File              Source RPM: roach-1.0.1-57.el6.src.rpm

        Size        : 205                              License: BSD

        Signature  : (none)

        Packager    : roach

        URL        : http://www.cnblogs.com/roach57

        Summary    : roach5.7_rpm

        Description :

        roach5.7_rpm

七.RPM包的使用:

1.rpm的安装:

    * rpm默认安装时默认的根目录就是系统的'/':

    * rpm手动指定安装时的根目录[ --prefix=/temp/roach]:

        [root@localhost ~]# rpm -ivh roach-1.0.1-57.el6.x86_64.rpm --prefix=/temp/roach

2.rpm的卸载:

    [指定卸载的软件时,省略最后的扩展名.rpm]

    [root@localhost ~]# rpm -e roach-1.0.1-57.el6.x86_64

八.注意:

CentOS5和CentOS6之间的rpm包不能混用,因为他们之间的glibc版本不同,动态库链接不上。

九.参考文档:

https://github.com/jordansissel/fpm/wiki

http://zhaochj.blog.51cto.com/368705/1658496

http://blog.sina.com.cn/s/blog_704836f40101fscj.html

http://www.xiaomastack.com/2014/11/02/scribe-rpm/

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容