rpm包制作

方法一:rpmbuild

一、制作步骤
  • 生成rpmbuild目录

      # rpmbuild  lsyncd-2.0.5.tar.gz //在当前用户家目录生成目录树
    
    • BUILD:源代码解压以后放的位置

    • RPMS:制作完成后的rpm包存放目录,为特定平台指定子目录(x86_64)

    • SOURCES:收集的源文件,源材料,补丁文件等存放位置

    • SPECS:存放spec文件,作为制作rpm包的领岗文件,以rpm名.spec
    • SRPMS:src格式的rpm包位置 ,既然是src格式的包,就没有平台的概念了
    • BuiltRoot:假根,使用install临时安装到这个目录,把这个目录当作根来用的,所以在这个目录下的目录文件,才是真正的目录文件。当打包完成后,在清理阶段,这个目录将被删除
  • 将源码包放到 SOURCES目录

  • 在SPEC目录生成.spec文件 //编辑 lsyncd 的 spec 规则文件,文件名字必须与源码一致,如 :lsyncd-2.0.5.tar.gz 源码, 规则文件就应该为 lsyncd-2.0.5.spec

  • 编辑spec文件

二、过程详解
  • spec 文件说明
Name:  //软件名称,如 lsyncd,后面可使用%{name}的方式引用
Version: //软件版本号,仅当软件较以前有较大改变时才增加版本号。如 2.0.51%{?dist} 
Release: //软件发布序列号,标明第几次打包。若软件较以前改变较小,则仅增加发布序列号,而不改变版本号
Summary: //概要,对软件简单的描述
Group: //软件包所属类别,具体类别参看 rpm 的帮助文件/usr/share/doc/rpm-4.8.0/GROUPS,所有软件必须属于其中一种类型。
License://许可类型,如:GPL(自由软件),commercial(商业),Share(共享), GNU 等
URL://软件下载地址(可以省略)
Source0: //源码名称
BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX) //该参数非常重要,因为在生成 rpm 的过程中,执行 make install 时就会把软件安装到上述 的路径中,在打包的时候,同样依赖“虚拟目录”为“根目录”进行操作。 后面可使用$RPM_BUILD_ROOT 方式引用。

BuildRequires://软件依赖关系描述(可以省略)
Requires://该 rpm 包所依赖的软件包名称
%description //对软件的详细描述,可以写多行


%prep  //这个段是预处理段,通常用来执行一些解开源程序包的命令,为下一 步的编译安装作准备。

%setup -q //提取源码到 BUILD 目录; -q 指不显示输出(quietly)


%build //本段是建立段,所执行的命令为生成软件包服务,相当于./configure 和 make
%configure
make %{?_smp_mflags}

%install  //这一节主要用于完成实际安装软件必须执行的命令,这一节一般是由 make install 指令构成,但是有时也会包含 cp、mv、install 等指令


rm -rf $RPM_BUILD_ROOT
make install DESTDIR=$RPM_BUILD_ROOT

%clean   //这一节所描述的内容表示在完成包建立的工作之后,自动执行此节 下的脚本进行附加的清除工作,这一节的内容通常简单地使用 rm -rf $RPM_BUILD_ROOT 命 令,不需要指定此节的其它内容


rm -rf $RPM_BUILD_ROOT

%files  //这一节指定构成包的文件的列表,它是使用节前缀%files 表示的。 此外,它还包含一系列宏控制安装后的文件属性和配置信息。,分为三类--说明文档(doc), 配置文件(config)及执行程序,也根据提示编写。%files 下列出应该捆绑到 RPM 中的文件, 并能够可选地设置许可权和其它信息

%defattr(-,root,root,-) //指定包装文件的属性,分别是(mode,owner,group),-表示默认值, 对文本文件是 0644,可执行文件是 0755

%doc
%changelog //本段是修改日志段。你可以将软件的每次修改记录到这里,保存到发布的软件包中
  • 按要求填写spec文件
  • rpmbuild -ba lsyncd-2.0.5.spec //顺利通过编译,使用-ba 生成 rpm 包和 srpm 包,查看生成的目标 rpm 包

方法二:fpm

  • fpm命令的参数

    参考链接

      % fpm -s <source type> -t <target type> [options]
      -s                          源格式
      -t                          目标格式
      -n                          包名
      -v                          version值,实际版本号
      --iteration                 release值,发布序列号
      --epoch                     epoch值
      --vendor                    厂商
      --maintainer                维护者
      --description               描述
      --url                       软件主页
      --workdir                   fpm工作目录
      -d                          依赖的软件包
      --directories               递归指定的目录标记为属于这个包
      -C                          切换到指定的目录
      -p                          输出到指定的路径
      --force                     强制覆盖文件
    
      --after-install FILE        包安装后执行的脚本
      --before-install FILE       包安装前执行的脚本
      --after-remove FILE         包移除后执行的脚本
      --before-remove FILE        包移除前执行的脚本
      --after-upgrade FILE        包升级后执行的脚本
      --before-upgrade FILE       包升级前执行的脚本
    
      -e                          building前编辑spec文件
    
  • fpm安装与环境配置

    • 安装ruby和fpm

        # yum install ruby rubygems ruby-devel
      
        更换gem的源:   
        # gem sources --remove http://rubygems.org/ 
        # gem sources -a http://mirrors.aliyun.com/rubygems/
        # gem sources -a https://ruby.taobao.org/
        # gem sources -l
        *** CURRENT SOURCES ***
      
        http://mirrors.aliyun.com/rubygems/
        https://ruby.taobao.org/
        # gem -v
        1.3.7
        # ruby -v
        ruby 1.8.7 (2013-06-27 patchlevel 374) [x86_64-linux]
      
        安装fpm
        # gem install fpm -V
        # fpm --version
      
  • fpm打包实例

    fpm功能强大,可以打包rpm、deb等,实现简单,过程容易理解,打包利器。

    将目录打成zabbix-agent包

      # fpm -s dir -t rpm -a 'x86_64' -n 'zabbix-agent-ops' -v '2.0.5' --iteration '6' --epoch '0' --vendor '[email protected]' --maintainer 'ajk-ops' -p /work-space --post-install postinst --after-remove postrm --description 'zabbix-agent-ops' /usr/local/zabbix-agent-ops /etc/init.d/zabbix-agent-ops  /etc/cron.d/zabbix-agent-ops
    
      # cat postinst  //包安装后执行脚本
      #!/bin/bash
      set -e
    
      if [[ `egrep -c "zabbix" /etc/passwd` -ne 1 ]];then
      {
          /usr/sbin/useradd zabbix -d /usr/local/zabbix-agent-ops/var -s /sbin/nologin > /dev/null
       }
      fi
      /bin/chown -R zabbix:zabbix /usr/local/zabbix-agent-ops > /dev/null
    
      /usr/local/zabbix-agent-ops/sbin/zabbix_agentd
    
      sed -i '$i /usr/local/zabbix-agent-ops/sbin/zabbix_agentd' /etc/rc.local
    
      # cat postrm  //包卸载后执行脚本
      #!/bin/sh -e
    
      id zabbix > /dev/null 2>&1
      if [ $? -eq 0 ];then
      {
          userdel zabbix
      }
      fi
      exit 0
    

    将目录打成deb包

      #fpm -s dir -t deb -a 'x86_64' -n 'ajk_gseagent' -v '1.0' --iteration '2' --epoch '0' --vendor '[email protected]' --maintainer 'ajk-ops' -p /work-space --post-install postinst --post-uninstall postrm  --deb-no-default-config-files --description 'ajk gseagent' /usr/local/ajk_gseagent
    

rpm解压

rpm2cpio xxx.rpm | cpio -div