当前位置: > Linux教程 > Linux学习 >

rpm的包制作

时间:2017-02-02 00:47来源:linux.it.net.cn 作者:IT
方法一: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 'zhifanzhao@anjuke.com' --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 'zhifanzhao@anjuke.com' --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



(责任编辑:IT)
------分隔线----------------------------