一 前言
本文可能偏运维一些,适合有需求打rpm包的朋友。
不同公司有不同的规范来约束各种linux系统软件安装的路径以及相关配套设施。因此我们可以基于各自的 规范 使用rpm 将各种软件的二进制文件打包来满足各自的定制化需求。本文通过 安装vmtouch软件包,来介绍RPM的相关知识。
首先一图胜千言 ,我们通过下图来了解RPM的文件系统以及核心 spec 文件对其他文件的相关依赖关系。
安装 rpmbuild 并准备相关目录文件
sudo yum install make gcc rpmbuild mkdir -p ~/rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}
各个目录的用途如下:
BUILD 编译rpm包的临时目录
BUILDROOT 编译后生成的软件临时安装目录
RPMS 最终生成的可安装rpm包的所在目录
SOURCES 所有源代码和补丁文件的存放目录
SPECS 存放SPEC文件的目录(重要)
SRPMS 软件最终的rpm源码格式存放路径
在*NIX系统中建议为了防止系统函数库或其他文件损坏,不要使用root身份去制作rpm软件包。可以使用一个通用的用户 比如 app。
打包之前需要将源代码以及相关脚本放到 SOURCES 目录中。spec 文件的 Source0 会使用源码文件 vmtouch-1.3.1.tar.gz (注意解压缩之后的文件一定要是 vmtouch-1.3.1,否则会编译报错 )
git clone https://github.com/hoytech/vmtouch.git
mv vmtouch vmtouch-1.3.1
tar -zcvf vmtouch-1.3.1.tar.gz vmtouch
然后 将 vmtouch-1.3.1.tar.gz 放到 SOURCES。(注意解压缩之后的文件一定要是 vmtouch-1.3.1,否则会编译报错 )
spec file是rpm打包最核心组件,其内容包含软件包的相关信息,如软件包的名字、版本、类别、说明摘要、创建时要执行什么指令、安装时要执行什么操作、以及软件包所要包含的文件列表等等。本文以 vmtouch.spec 文件为例,介绍 spec的基础语法结构
%define oname vmtouch
%define _target_os Linux
%define _prefix /usr/local
Name: vmtouch
Version: 1.3.1
Release: 1%{?dist}
Summary: vmtouch is a tool for learning about and controlling the file system cache of unix and unix-like systems.
Group: Development/Tools
License: BSD
URL: https://github.com/hoytech/vmtouch
Source0: vmtouch-%{version}.tar.gz
BuildRoot: %(mktemp -ud %{_tmppath}/%{oname}-%{version}-%{release}-XXXXXX)
%description
vmtouch is a tool for learning about and controlling the file system cache of unix and unix-like systems. It is BSD licensed so you can basically do whatever you want with it.
%prep
%setup -q -n %{oname}-%{version}
%build
make
%install
rm -rf %{buildroot}
make PREFIX=%{buildroot}%{_prefix} install
#cp %{buildroot}%{_prefix}/bin/vmtouch /usr/bin/
%clean
rm -rf %{buildroot}
%files
%defattr(-,root,root,-)
%{_prefix}
%attr(0755,root,root)
%{_prefix}/bin/*
%doc
%changelog
* Mon Nov 04 2019 <yangyidba> 1.3.1-1
vmtouch 1.3.1
其中 spec file 由 %开头的宏定义的 域段落 组成。我们可以在不同的段落写执行shell命令来完成编译,安装等功能,本文重点讲核心部分。
文件头 定义了软件的相关名字,版本,介绍,软件包所采用的版权规则,源代码路径。
需要注意的是安装软件依赖的其他基础组件 ,比如安装redis 要使用
BuildRequires: zlib-devel #制作rpm包时,所依赖的基本库 Requires: zlib gcc tcl jemalloc #安装rpm包时,所依赖的软件包
%prep
预处理段,顾名思义,该段内容通常用来执行一些解压缩开源程序包的命令,为下一步的编译安装作准备。%prep和下面的%build,%install段一样,除了可以执行RPM所定义的宏命令(以%开头)以外,还可以执行SHELL命令,比如mkdir,cp。
%build
主要执行 make 命令。
%install
执行 make install 安装程序 ,可以指定PREFIX。也可以做其他shell 命令满足安装软件的需求。
%clean
安装完,清理临时文件或者编译的文件
%files
用于定义程序所包含的文件,可执行程序,配置文件,说明文档(doc),还可定义文件访问权限,owner 属组。
%changelog
操作日志,记录rpm变更的记录 谁,什么时间,做了什么内容。
%prerpm安装前执行的脚本
%postrpm安装后执行的脚本
%preun rpm卸载前执行的脚本
%postunrpm卸载后执行的脚本
spec文件编写完成,我们就可以使用 rpmbuild 打包. 包分为两种一种是标准的 RPM包,直接生成二进制文件的。另外一种是SRPM 包,带有源代码的。
rpmbuild -ba program.spec
-ba 参数 会创建两个包:RPM 会保存至 ~/rpmbuild/RPMS,SRPM 会保存至 ~/rpmbuild/SRPMS。
如果只想创建 RPM, 可以执行:
rpmbuild -bb vmtouch.spec
如果只想创建 SRPM(不需要执行 %prep 或 %build 或其他阶段),请执行:
rpmbuild -bs vmtouch.spec