1 基础知识
1.1 什么是RPM包?
rpm包是 Red Hat Package Manager的缩写,它是一种软件包管理工具,主要用于Linux操作系统中管理和分发软件包。 RPM包包含了一个软件的所有相关组件,如可执行的二进制文件(binaries)、库文件(libraries)、配置文件以及其他必要的支持文件。这些组件通常被打包到一个预编译的二进制文件中,使得软件的安装过程变得简单化和自动化。
RPM包有如下特点:
预编译的二进制文件:包含软件的可执行程序、库文件和其他必要文件。
标准化:尽管最初由Red Hat Linux开发,但RPM的设计理念是开放的,已经被多个Linux发行版所采纳,成为公认的标准。
软件包分类:RPM包分为二进制包(Binary)、源代码包(Source)和Delta包三种类型。
安装方式:可以通过离线和在线两种方式安装RPM包,具体取决于是否有网络连接以及如何获取所需的软件包。
总结:RPM包是一种重要的软件分发和管理工具,尤其在Linux生态系统中扮演者重要角色。
1.2 为什么要使用RPM?
使用rpm,有如下优点:
安装、重新安装、删除、升级和验证软件包
用户可以使用标准包管理工具(例如yum或PackageKit)来安装、重新安装、删除、升级和验证RPM软件包。
使用已安装包的数据库查询和验证包
因为RPM维护着一个已安装的软件包及其文件的数据库,所以用户可以轻松的查询和验证其系统上的软件包。
使用元数据来描述包、安装说明等
每个RPM都包含描述包组件的元数据,版本、大小、项目URL、安装说明等。
将软件源码打包到源码包和二进制包中
RPM允许你获取软件源码并将它们打包到源码包和二进制包。在源码包中,你拥有源代码以及使用的任何补丁,和完整的构建说明。随着软件的新版本发布,这种设计简化了软件包的维护。
将软件包添加到yum仓库
你可以将软件包添加到yum仓库中,使客户端能够轻松找到并部署你的软件。
对包进行数字签名
使用GPG签名秘钥,你可以对包进行数字签名,以便用户能够验证包的真实性。
1.3 RPM包构建原理
RPM包是一个压缩文件,其中包含了软件程序的二进制文件、配置文件、文档等资源文件以及安装脚本等元数据信息。在RPM中,每个文件都有一个唯一的标识符,称为RPM标识符。RPM标识符由三个部分组成:软件包名、版本号和发行号。例如:
wget-1.21.2-3.oe2203sp3.x86_64.rpm
其中:wget是软件包名,1.21.2是版本号,3.oe2203sp3是发行版号,x86_64表示该软件包适用于x86_64的硬件架构。
rpm包构建的原理并不复杂,可以理解为按照标准的格式整理一下信息,包括软件基础信息、安装、卸载前后执行的脚本,对源码包解压、打补丁、编译,安装路径和文件等,这些都是写在.spec文件中的。
1.4 RPM包构建步骤
RPM包构建步骤如下:
1)创建RPM构建的工作目录(以下都简称工作目录)
2)安装构建包需要用到的相关工具
3)下载或拉取软件源码到工作目录的对应路径下
4)编写或获取spec文件,并放置到工作目录的对应路径下
5)使用rpmbuild命令构建rpm包
6)对构建好的rpm进行安装、测试
1.5 RPM构建4要素
进行rpm构建,必须要有以下4个要素:
1)工作目录(有特定的构建工作目录)
2)rpmbuild等相关工具
3)软件源码
4)SPEC文件
注意:
- 如果能获取到软件的源码包(XXX.src.rpm这种包),则解压该包后即可获取到软件的源码和spec文件。
- 需要构建的RPM需要在openEuler哪个版本上面安装,则需要在哪个版本上面构建RPM包。
1.6 创建工作目录
1.6.1 创建工作目录的方法
工作目录可以手工创建,也可以使用命令进行创建,创建方法如下:
(1)手动创建工作目录
# 手动创建以下目录
$ mkdir -p /root/rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}
# 查看创建得目录
$ tree /root/rpmbuild/
/root/rpmbuild/
├── BUILD
├── BUILDROOT
├── RPMS
├── SOURCES
├── SPECS
└── SRPMS
(2)使用命令生成工作目录
# 安装 rpmdevtools 工具包
$ yum install -y rpmdevtools
# 在 /root 目录下执行以下命令,生成工作目录
$ rpmdev-setuptree
# 运行此命令后在当前用户$HOME目录下会自动创建一个rpmbuild的文件夹。
# 查看命令生成的工作目录
$ tree /root/rpmbuild/
/root/rpmbuild/
├── BUILD
├── RPMS
├── SOURCES
├── SPECS
└── SRPMS
1.6.2 工作目录简介
目录
宏代码
名称
用途
~/rpmbuild/BUILD
%_builddir
构建目录
源码包解压至此,在其子目录完成编译
~/rpmbuild/RPMS
%_rpmdir
标准RPM包目录
生成/保存二进制 RPM 包
~/rpmbuild/SOURCES
%_sourcedir
源代码目录
用于存放所有源代码和补丁文件
~/rpmbuild/SPECS
%_specdir
Spec 文件目录
保存 RPM 包配置(.spec)文件
~/rpmbuild/SRPMS
%_srcrpmdir
源码RPM包目录
保存源码 RPM 包(SRPM)
~/rpmbuild/BUILDROOT
%_buildrootdir
最终安装目录
保存 %install 阶段安装的文件
1.7 构建RPM需要用到的工具
工具
需要安装的包
用途
rpmbuild(必须安装)
rpm-build
RPM构建工具
git(选择性安装)
git
源代码克隆工具
rpmdev-setuptree(选择性安装)
rpmdevtools
用于创建工作目录
rpmdev-newspec(选择性安装)
rpmdevtools
用于生成SPEC模板文件
rpmlint(选择性安装)
rpmlint
用于检查spec文件语法
yum-builddep(选择性安装)
dnf-plugins-core
安装生成rpm包所需依赖包的工具
1.8 软件源码
软件源码可以从以下途径进行获取:
- 从软件官网获取
- 从openEuler社区gitee仓库获取
比如src-oepkgs - ISRC - Gitee.com 或 src-openEuler - openEuler - Gitee.com
- 从源码包(XXX.src.rpm)获取
常用的获取源码包网址有:
openEuler社区repo仓库中的source仓库,比如https://repo.openeuler.org/openEuler-20.03-LTS/source/Packages/
1.9 SPEC 文件
1.9.1 SPEC文件介绍
spec 文件用于制作 rpm 包,包含了软件包的诸多信息,如软件包的名字、版本、类别、说明摘要、创建时要执行什么指令、安装时要执行什么操作、以及软件包所要包含的文件列表等等。
SPEC文件获取的途径有以下几种:
1)自己按照规范编写SPEC文件
2)生成SPEC模板文件
3)从openEuler社区gitee仓库获取
4)从源码包(XXX.src.rpm)获取
1.9.2 SPEC文件范例
例如 pam 命令的 sepc 文件:
原始spec文件参见:pam.spec · src-oepkgs/pam - Gitee.com
%define _pamlibdir %{_libdir}
%define _moduledir %{_libdir}/security
%define _secconfdir %{_sysconfdir}/security
%define _pamconfdir %{_sysconfdir}/pam.d
Name: pam
Version: 1.5.2
Release: 3
Summary: Pluggable Authentication Modules for Linux
License: BSD and GPLv2+
URL: http://www.linux-pam.org/
Source0: http://github.com/linux-pam/linux-pam/releases/download/v%{version}/Linux-PAM-%{version}.tar.xz
Source1: http://github.com/linux-pam/linux-pam/releases/download/v%{version}/Linux-PAM-%{version}.tar.xz.asc
Source5: other.pamd
Source6: system-auth.pamd
Source7: password-auth.pamd
Source10: config-util.pamd
Source15: pamtmp.conf
Source16: postlogin.pamd
Source18: http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
Provides: %{name}-sm3 = %{version}-%{release}
Patch1: bugfix-pam-1.1.8-faillock-systemtime.patch
Patch9000:openEuler-change-ndbm-to-gdbm.patch
Patch9001:0001-bugfix-cannot-open-database-file.patch
Patch9002:add-sm3-crypt-support.patch
Patch9003:1003-Change-chinese-translation.patch
BuildRequires: autoconf automake libtool bison flex sed cracklib-devel gdbm-devel
BuildRequires: perl-interpreter pkgconfig gettext-devel libtirpc-devel libnsl2-devel
BuildRequires: audit-libs-devel libselinux-devel
Requires: cracklib libpwquality coreutils glibc audit-libs libselinux libxcrypt-sm3
%desc