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