> 文章列表 > RPM安装包的制作和使用

RPM安装包的制作和使用

RPM安装包的制作和使用

1 RPM简介

RPM是Red-Hat Package Manager的缩写,其中文意思是红帽软件包管理器,应用于Red-Hat、CnetOS、Fedora、OpenLinux、中科方德 等Linux操作系统。可以便捷地执行软件的安装、卸载、升级。我们通过YUM下载和安装的软件,就是通过RPM实现的打包和分发。
本文以一个释放文件到指定目录的RPM安装程包为例,讲解其制作流程和测试使用方法。

2 RPM安装包制作

2.1 环境准备

推荐在CentOS 7 环境下制作安装包。首先需要在root用户下运行yum install rpm-build -y命令以安装打包工具。

2.2 设置打包工作区

在root下运行命令mkdir -pv ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS,BUILDROOT}创建打包工作区的目录布局。下表是各个目录的具体用处。

目录    用途
BUILD    这是构建和编译安装包的临时目录。
RPM    二进制 RPM 在此处创建,在不同的构架的子目录中,例如在子目录 x86_64 和 noarch 中。
SOURCES    此处打包程序设置了压缩的源代码存档和补丁。rpmbuild 命令会在此处查找它们。
SPECS    打包程序在此处放置 SPEC 文件。
SRPMS    当 rpmbuild 用于构建 SRPM 而不是二进制 RPM 时,此处会创建生成的 SRPM。
BUILDROOT    编译后生成的软件临时安装目录

2.3 准备打包源文件

创建 <软件名>-<软件版本>/<软件目标安装路径> 的文件夹。本示例的软件名是SampleFile,版本为1.1.0,期望在用户执行安装时,安装到/opt/wja/files文件夹,那么需要创建的文件夹就是SampleFile-1.1.0/opt/wja/files,这个文件夹是一个相对路径,因此可以在任意目录下运行 mkdir -p SampleFile-1.1.0/opt/wja/files完成创建;
将需要安装释放到用户计算机上的文件复制到上一步创建的文件夹中;
打包 <软件名>-<软件版本> 文件夹(包含文件夹本身这一层)为 <软件名>-<软件版本>.tar.gz 。本示例中应执行的命令为tar -zcf SampleFile-1.1.0.tar.gz SampleFile-1.1.0 ;
将打包好的文件 <软件名>-<软件版本>.tar.gz 复制到 /root/rpmbuild/SOURCES ,本案例应执行的命令为 mv SampleFile-1.1.0.tar.gz /root/rpmbuild/SOURCES/ ;

2.4 SPEC文件撰写

2.4.1 SPEC文件简介

您可以将 SPEC 文件理解为 rpmbuild 实用程序用来构建 RPM 的方法。SPEC 文件通过在在 Preamble 和 Body 部分中定义若干指令向构建系统提供必要的信息。Preamble 部分包含一系列元数据项目。Body 部分的指令实现具体的构建和安装。
下表展示了 Preamble 部分中的常用指令:

指令    含义

Name    软件包的基本名称,应该与 SPEC 文件名匹配。
Version    软件的上游版本号。
Release    本版软件的发布次数。通常,将初始值设置为 1%{?dist},并在软件包的每个新版本中递增它。构建新 Version 软件时,重置为 1。
Summary    软件包的简短单行摘要。
License    打包软件的许可证。
URL    有关程序的更多信息的完整 URL。大多数情况下,这是被打包的软件的上游项目网站。
Source0    上游源代码压缩存档的路径或 URL(未修补,补丁在别处处理)。这应该指向存档的可访问且可靠的存储,例如上游页面,而不是打包程序的本地存储。如果需要,可以添加更多 SourceX 指令,每次增加数量,例如 Source1、Source2 和 Source3 等。
Patch    如有必要,适用于源代码的第一个补丁名称。
BuildArch    如果软件包不依赖于构架,例如,如果完全使用解释的编程语言编写,请将其设置为 BuildArch: noarch。如果没有设置,软件包会自动继承构建它的机器的架构,例如 x86_64。
BuildRequires    构建使用编译语言编写的程序所需的以空格分隔的软件包列表。BuildRequires 可能有多个条目,每个条目在 SPEC 文件中独立存在。
Requires    软件在安装后需要运行的软件包列表,用逗号或空格分隔。Requires 可能有多个条目,每个条目在 SPEC 文件中独立存在。
Requires还可以约定软件的最低版本,例如:Requires: jre-headless >= 1.8
ExcludeArch    如果某一部分软件无法在特定的处理器架构上运行,您可以在此处排除该体系结构。
Conflicts    Conflicts 颠倒 Requires。如果软件包与 Conflicts 匹配,则无法独立安装该软件包,具体取决于 Conflict 标签是安装在已安装的软件包中,还是安装的软件包中。
Obsoletes    这个指令会根据 rpm 命令直接在命令行中使用,还是由更新或依赖性解析器执行更新而改变更新的工作方式。在命令行中使用时,RPM 将删除与正在安装的软件包过时的软件包匹配的所有软件包。当使用更新或依赖项解析程序时,包含匹配 Obsoletes: 的软件包会添加为更新并替换匹配的软件包。
Provides    如果 Provides 添加到软件包中,则软件包可以由其名称以外的依赖项引用。

下表展示了Body 部分中的常用指令 :

指令    含义

%description    RPM 中打包的软件包的完整描述。这种描述可跨越多行,可分为几个段落。
%prep    用于准备要构建的软件的命令或一系列命令,例如解压缩 Source0 中的存档。此指令可以包含 shell 脚本。
%build    用于将软件构建到计算机代码的命令或一系列命令(用于编译语言)或字节代码(用于一些解释语言)。
%install    将所需构建工件从 %builddir (构建进行的位置)复制到 %buildroot 目录中的命令或一系列命令(其中包含要打包的文件的目录结构)。
%check    用于测试软件的命令或一系列命令。这通常包括单元测试等内容。
%files    将在终端用户系统中安装的文件列表。
%changelog    记录不同 Version 或 Release 构建之间软件包发生的更改。

2.4.2 SPEC文件示例

在/root/rpmbuild/SPECS/文件夹下创建SampleFile.spec文件(这里的文件名不影响打包流程,可以按需自定义),并将下列文本写入该文件中。

Name: SampleFile
Version: 1.1.0
Release: release
Summary: SampleFile RPM Setup File
Summary(zh_CN): SampleFile RPM 版
AutoReqProv: no
License: EULA
Group: Applications/System
Vendor: wja
Buildarch: x86_64
Source0: %{name}-%{version}.tar.gz
%description
This is just for importing some files.
%description -l zh_CN
这只是用于导入一些文件。%prep
rm -rf $RPM_BUILD_ROOT/*%setup -q%install
echo "%{summary}正在构建"
install -d $RPM_BUILD_ROOT/
cp -a * $RPM_BUILD_ROOT/
exit 0%pre
mkdir -p /opt/wja/files
diskMsg=$(df /opt/wja/files | grep /)
array=(${diskMsg// / })
freeMb=$((array[3]/1024))
needMb=100
if [[ $needMb -gt ${freeMb} ]] ;thenoutput_red "当前计算机磁盘存储空间不足。仅剩余 ${freeMb} Mb。顺利安装运行 SampleFile 需要 $needMb Mb 磁盘空间。"echo "退出中……"exit 1
elseecho "当前磁盘剩余${freeMb} Mb。"   >/dev/null 2>&1
fi%post
output_green() {echo -e "\\033[32m$1 \\033[0m"
}output_green "文件已经释放到/opt/wja/files"%preun%postun%files
/opt/wja/files
%doc%changelog
* Mon Feb 28 2022 wangjingan <wja91@qq.cn>
- first build

上述spec文件中的第26行exit 0是为了忽略install过程中可能出现的报错,保证不因报错而退出。Body部分的其他指令过程也可以在末尾使用 exit 0 用来忽略报错。

上述spec文件中的第33行needMb变量的值表示安装软件所需的磁盘空间。在用户安装过程中,安装程序会检测磁盘空间,如果小于这个值,就会提醒用户,并退出安装。因此needMb的值需要根据您的实际需要进行修改。

2.5 构建安装包

运行 rpmbuild -bb --nodigest --nosignature /root/rpmbuild/SPECS/<SPEC文件名> 执行安装包构建,在本示例中,应执行的命令为rpmbuild -bb --nodigest --nosignature /root/rpmbuild/SPECS/SampleFile.spec
/root/rpmbuild/RPMS/ x86_64 下就是构建好的安装包,可以按要求将其重命名。

3 RPM安装包使用命令

安装:rpm -ivh <rpm文件名> ,例如:rpm -ivh SampleFile-1.1.0-release.x86_64.rpm
卸载:rpm -e SampleFile-1.1.0-release.x86_64,如果您在安装后有将释放的文件移动或者删除,那么在卸载时可能会报错remove failed: No such file or directory,这是正常现象,不必管他。如果卸载过程中出现其他报错并退出,则用如下命令卸载:rpm -e --noscripts SampleFile-1.1.0-release.x86_64
查看信息:rpm -qi SampleFile-1.1.0-release.x86_64
查看释放的文件清单:rpm -ql SampleFile-1.1.0
检查是否安装:rpm -qa | grep -i SampleFile-1.1.0-release.x86_64