linux RPM 打包流程

 一、RPM 打包准备
1.因为打RPM包需要 rpmbuild 命令,所以需要先安装 rpmbuild 相应工具,安装过程可在网上查找;
2.输入命令  rpmbuild xx.spec 即可在自动当前用户的 $HOME 目录下创建 RPM 相关的文件夹,也可手动创建;
  •  1 [xx@localhost ~]$ rpmbuild xx.spec 
  •  2 错误:stat ~/xx.spec 失败:没有那个文件或目录 
  •  3 [xx@localhost ~]$ tree ~/rpmbuild/ 
  •  4 rpmbuild/ 
  •  5 ├── BUILD 
  •  6 ├── BUILDROOT 
  •  7 ├── RPMS 
  •  8 ├── SOURCES 
  •  9 ├── SPECS
  •  10 └── SRPMS
  BUILD:源码包被解压至此,并在该目录的子目录完成编译,宏为 %_builddir
  BUILDROOT:保存 %install 阶段安装的文件,宏为 %_buildrootdir
  RPMS:生成/保存二进制 RPM 包,宏为 %_rpmdir
  SOURCES:保存源码包(如 .tar 包)和所有 patch 补丁,宏为 %_sourcedir
  SPECS:保存 RPM 包配置(.spec)文件,宏为 %_specdir
  SRPMS:生成/保存源码 RPM 包(SRPM),宏为 %_srcrpmdir
  ~/rpmbuild 的宏为 %_topdir

二、编辑 SPEC 文件

1.创建 SPEC 文件如下所示:
  • [xxx@localhost rpmbuild]$ rpmdev-newspec xxx.spec
  • xxx.spec created; type minimal, rpm version >= 4.12.
2.将 SPEC 文件放在 ~rpmbuild/SPECS/ 下面,然后编辑 SPEC 文件,如下所示:
  • Name:    #软件名称
  • Version:  #版本号
  • Release:  #发布编码
  • Summary:  #简要说明
  • License:  #协议版本
  • URL:
  • Source0:  #源码包
  • %description
  • #描述
  • %prep
  • #预处理

  • %build
  • #编译
  • %pre
  • #安装前
  • %install#安装

  • %post
  • #安装后

  • %files
  • #安装的文件列表
  • %clean
  • #清理临时文件

  • %preun
  • #卸载前

  • %postun
  • #卸载后
  • %changelog* Fri Aug  7 2020 
  • -
3.安装的各个阶段说明:
%prep阶段 - 预处理,主要对源代码包进行解压和打补丁
  一般使用  %setup  -c 或者 %setup -q 命令来解压源码包,直接会将文件解压到%{_builddir}
%build阶段 - 对源代码包进行编译
  编译阶段,非 GNU configure 配置的程序可以不关注这个阶段
%install阶段 - 将软件安装到虚拟根目录, 同时 Install 阶段也有如下阶段
  %pre阶段 - 安装前
    $1 == 1 代表安装
    $1 == 2 代表升级
  %post阶段 - 安装后
    $1 == 1 代表安装
    $1 == 2 代表升级
  %preun阶段 - 卸载前
    $1 == 0 代表卸载
    $1 == 1 代表升级
  %postun阶段 - 卸载后
    $1 == 0 代表卸载
    $1 == 1 代表升级
这个阶段主要从 %{_builddir} 复制相关文件到 %{buildroot} (虚拟根目录)目录,如下所示:
  • rm -rf $RPM_BUILD_ROOT
  • cp -rf xxx $RPM_BUILD_ROOT
%files阶段-列出被打包的文件和目录
  首先要设定默认权限,同时要列出打包的目录和文件,设定默认权限的命令如下:
  • %defattr(<文件权限>, <用户>, <用户组>, <目录权限>)
  第 4 个参数通常会省略。常规用法为 %defattr(-,root,root,-),其中 “-” 表示默认权限。
  在列出文件的目录时,尽量使用内建宏来代替目录名,常用的内建宏如下所示:
  • %{_sysconfdir}        /etc
  • %{_prefix}            /usr
  • %{_exec_prefix}       %{_prefix}
  • %{_bindir}            %{_exec_prefix}/bin
  • %{_lib}               lib (lib64 on 64bit systems)
  • %{_libdir}            %{_exec_prefix}/%{_lib}
  • %{_libexecdir}        %{_exec_prefix}/libexec
  • %{_sbindir}           %{_exec_prefix}/sbin
  • %{_sharedstatedir}    /var/lib
  • %{_datadir}           %{_prefix}/share
  • %{_includedir}        %{_prefix}/include
  • %{_oldincludedir}     /usr/include
  • %{_infodir}           /usr/share/info
  • %{_mandir}            /usr/share/man
  • %{_localstatedir}     /var
  • %{_initddir}          %{_sysconfdir}/rc.d/init.d 
  • %{_topdir}            %{getenv:HOME}/rpmbuild
  • %{_builddir}          %{_topdir}/BUILD
  • %{_rpmdir}            %{_topdir}/RPMS
  • %{_sourcedir}         %{_topdir}/SOURCES
  • %{_specdir}           %{_topdir}/SPECS
  • %{_srcrpmdir}         %{_topdir}/SRPMS
  • %{_buildrootdir}      %{_topdir}/BUILDROOT
  • %{_var}               /var
  • %{_tmppath}           %{_var}/tmp
  • %{_usr}               /usr
  • %{_usrsrc}            %{_usr}/src
  • %{_docdir}            %{_datadir}/doc
  • %{buildroot}          %{_buildrootdir}/%{name}-%{version}-%{release}.%{_arch}
  • $RPM_BUILD_ROOT       %{buildroot}
%clean阶段 - 完成后的一些清理工作
  主要是清理 %{_builddir}和%{_buildrootdir}两个目录里的中间文件
%changelog阶段 -- 主要记录每次打包时的修改日志
  • %changelog* Fri Aug  7 2020 - Your Name <youremail@xxx.xxx> - Release
  • - Update log1 
  • * Fri Aug  7 2020 - Your Name <youremail@xxx.xxx> - Release
  • - Update log2
实例:
  • %define zabbix_user zabbix                  #自定义宏,名字为zabbix_user值为zabbix,%{zabbix_user}引用
  • Name:   zabbix                              #软件包的名字,后面可用%{name}引用
  • Version:    3.0.3                           #软件的实际版本号,可使用%{version}引用
  • Release:    1%{?dist}                       #发布序列号,标明第几次打包  
  • Summary:    zabbix_agentd                   #软件包内容概

  • Group:      zabbix                          #软件包分组
  • License:    GPL                             #授权许可方
  • URL:        www.yang.com                    #软件的主
  • Source0:    zabbix-3.0.3.tar.gz             #源代码包,可以有Source0,Source1等源

  • BuildRequires:      gcc, gcc-c++            #制作rpm包时,所依赖的基本库
  • Requires:   gcc, gcc-c++, chkconfig         #安装rpm包时,所依赖的软件包

  • %description                                #定义rpm包的描述信息
  • Zabbix agentd 3.0.

  • %pre                                        #rpm包安装前执行的脚本
  • grep zabbix /etc/passwd > /dev/null
  • if [ $? != 0 ] 
  • then useradd zabbix -M -s /sbin/nologin
  • fi
  • [ -d /etc/zabbix   ]||rm -rf /etc/zabbix*

  • %post                                       #rpm包安装后执行的脚本
  • sed -i "/^ServerActive=/c\ServerActive=172.30.17.35" /etc/zabbix/etc/zabbix_agentd.conf
  • sed -i "/^Server=/c\Server=172.30.17.35" /etc/zabbix/etc/zabbix_agentd.conf
  • sed -i "/Timeout=3/c\Timeout=30" /etc/zabbix/etc/zabbix_agentd.conf
  • sed -i "/HostMetadata=/c\HostMetadata=PostgreSQL" /etc/zabbix/etc/zabbix_agentd.conf
  • sed -i "/^Hostname=/c\Hostname=PostgreSQL" /etc/zabbix/etc/zabbix_agentd.conf
  • echo "UnsafeUserParameters=1" >>/etc/zabbix/etc/zabbix_agentd.con
  • echo "EnableRemoteCommands=1" >>/etc/zabbix/etc/zabbix_agentd.conf
  • echo "Include=/etc/zabbix/etc/zabbix_agentd.conf.d/*.conf" >>/etc/zabbix/etc/zabbix_agentd.conf
  • chkconfig zabbix_agentd o

  • %preun                                      #rpm卸载前执行的脚本
  • systemctl stop zabbix_agentd

  • %postun                                     #rpm卸载后执行的脚本
  • userdel  zabbix
  • rm -rf /etc/zabbix*
  • %prep                                       #这个宏开始
  • %setup -q                                   #解压并cd到相关目

  • %build                                      #定义编译软件包时的操作
  • ./configure --prefix=/etc/%{name}-%{version}   --enable-agent
  • make -j16 %{?_smp_mflags}

  • %install                                    #定义安装软件包,使用默认值即可
  • test -L %{buildroot}/etc/%{name} && rm -f %{buildroot}/etc/%{name}
  • install -d %{buildroot}/etc/profile.d
  • install -d %{buildroot}/etc/init.d
  • make install DESTDIR=%{buildroot}
  • echo 'export PATH=/etc/zabbix/bin:/etc/zabbix/sbin:$PATH' > %{buildroot}/etc/profile.d/%{name}.sh
  • ln -sf /etc/%{name}-%{version}          %{buildroot}/etc/%{name}
  • cp %{_buildrootdir}/postgresql.conf         %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/postgresql.conf
  • cp %{_buildrootdir}/tcp_connections.sh      %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/tcp_connections.sh
  • cp %{_buildrootdir}/iostat-collect.sh       %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/iostat-collect.sh 
  • cp %{_buildrootdir}/iostat-parse.sh     %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/iostat-parse.sh
  • cp %{_buildrootdir}/iostat-zabbix.conf      %{buildroot}/etc/%{name}-%{version}/etc/zabbix_agentd.conf.d/iostat-zabbix.conf 
  • cp %{_buildrootdir}/zabbix_agentd       %{buildroot}/etc/init.d/zabbix_agentd

  • %files                                      #定义rpm包安装时创建的相关目录及文件。在该选项中%defattr (-,root,root)一定要注意。它是指定安装文件的属性,分别是(mode,owner,group),-表示默认值,对文本文件是0644,可执行文件是0755。
  • /etc/%{name}
  • /etc/%{name}-%{version}/*
  • /etc/init.d/zabbix_agentd
  • /etc/profile.d/%{name}.sh

  • %changelog                                  #主要用于软件的变更日志。该选项可有可无

  • %clean 
  • rm -rf %{buildroot}                         #清理临时文件

三、运行 RPMBUILD 命令完成打包

在 SPEC 目录下执行 rpmbuild -xx xxx.spec 命令完成打包,rpmbuild 命令选项如下所示:
  • #rpmbuild
  • -bp 预处理
  • -bc 编译
  • -bi 编译并安装
  • -bl 检验文件是否齐全
  • -ba 编译后做成*.rpm和src.rpm
  • -bb 编译后做成*.rpm
  • -bs 只做成*.src.rpm