欢迎访问我的博客,你的支持,是我最大的动力!

RPM打包指南【CentOS】

Linux 马从东 37℃ 评论
目录:
[显示]

RPM Package Manager是RHEL、CentOS、Fedora默认的包管理系统,以下指南基于CentOS系统,理论上只要是使用rpm的发行版都适用

先决条件

其中:
gcc,make 用于编译c语言源代码
rpm-build 打包软件
rpmlint 检查工具
diffutils 比较文件差异diff命令
rpmdevtools 工具包,rpm -ql rpmdevtools | grep bin 提供很多工具
coreutils 提供install命令,简化版的make install 适用于简单的内容

示例

创建工作区

创建构建目录结构,类似于 mkdir -p rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}

创建spec文件
SPECS/hello-world.spec

创建

三个示例

bello

pello.py

python -m compileall pello.py  # 生成字节码 pello.pyc文件
python pello.pyc  # 运行

cello.c

gcc -g -o cello cello.c

Makefile

为软件打补丁

使用diff创建补丁文件;使用patch应用补丁

为cello.c创建补丁:
1、保留原始源代码
cp cello.c cello.c.orig
2、修改cello.c文件
printf("Hello World from my first patch!\n");
3、使用diff生成补丁文件
diff -Naur cello.c.orig cello.c > cello-patch.patch
选项:
N 将缺少的文件视为空;a 将所有文件视为文本;u 输出上下文(默认3行);r 递归比较子目录
4、恢复原来的cello.c
cp cello.c.orig cello.c
5、应用补丁
patch < cello-patch.patch

install 和 make install

install由coreutils包提供
sudo install -m 0755 bello /usr/bin/bello

源代码需要放到压缩包中,需要注意目录的命名
tar -cvzf bello-0.1.tar.gz bello-0.1

RPM包由包含文件的cpio存档和有关包元数据的PRM标头组成,rpm包管理器使用元数据确定依赖关系
SRPM包包含源代码、补丁和spec文件

创建工作区

创建构建目录结构,类似于 mkdir -p rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}

各目录的作用:

目录 作用
BUILD 构建目录,创建各种 %buildroot 目录
RPMS 二进制RPM包存放位置
SOURCES 源代码及补丁存放位置
SPECS spec文件存放目录
SRPMS 源码RPM包存放位置

spec文件序言部分:

SPEC指令 定义
Name 包基本名称,应于spec文件名匹配
Version 版本号
Release 打包次数,递增。初始值为 1%{?dist}
Summary 简介
License 软件许可
URL 通常为软件官网
Source0 源代码压缩归档的路径或URL,多个时使用 SourceX
Patch0 补丁,多个时 PatchX
BuildArch 系统架构,如x86_64 noarch
BuildRequires 以逗号或空格分隔的依赖包列表,用于构建过程,可以有多个条目
Requires 以逗号或空格分隔的运行时依赖列表,用于安装过程,可以有多个条目
ExcludeArch 需要排除的系统架构

RPM包文件名格式:Name-Version-Release[dist].BuildArch

spec文件Body部分:

SPEC指令 定义
%description 软件的完整描述,可跨多行,以空行结束
%prep 准备阶段,常为解压源码归档,可包含shell脚本
%build 构建阶段
%install 安装阶段,将文件从%builddir复制到%buildroot
BUILD -> BUILDROOT 并在其中创建必要目录
%check 测试阶段,通常运行单元测试
%files 指定最终需要安装的文件列表
%changelog 更新记录

spec文件还可包含scriptlet和触发器,用于在安装过程中的不同阶段执行脚本

buildroot是chroot环境,充当安装的根目录

RPM宏

rpm宏是直接文本替换
查看宏对应的实际内容:
rpm --eval %{_MACRO}     如,rpm --eval %{_libexecdir}  # /usr/libexec  rpm --eval %{?dist}  # .el7.centos

创建空spec文件
rpmdev-newspec  new  # 创建new.spec
参数:
-t TYPE,可选值有dummy lib minimal ocaml perl php-pear python R ruby ,默认minimal

$RPM_BUILD_ROOT <-> %{buildroot}  其中$RPM_BUILD_ROOT是CentOS7之前的用法,现在推荐使用 %{buildroot}
rpm --eval %{buildroot}
# /root/rpmbuild/BUILDROOT/%{name}-%{version}-%{release}.x86_64

%changelog 格式
* Day-of-Week Month Day Year Name Surname <email> - Version-Release
- XXX

注意,spec中不能有空项目,可以删除无内容的项目

rpmbuild --rebuild 命令从SRPM重建
# rpmbuild --rebuild ../SRPMS/bello-0.1-1.el7.centos.src.rpm
# 过程,将spec和源文件放到rpmbuild目录;进行构建;删除spec文件和源文件(若要保留 使用 --recompile替换--rebuild)
rpmbuild -bb 从spec文件构建

rpmlint工具
执行RPM静态分析,提高RPM可维护性并实现健全性和错误检查
可检查RPM、SRPM、spec文件

rpmlint -i cello.spec  # -i 显示详细信息

高级主题

包签名

将签名添加到包中
一个包中可以添加多个签名,可以多次添加相同的签名
yum install rpm-sign  # 提供rpmsign命令
rpm --addsign pello-0.1.1-1.el7.centos.noarch.rpm
# You must set "%_gpg_name" in your macro file
检查签名
rpm --checksig pello-0.1.1-1.el7.centos.noarch.rpm

替换包签名
更改公钥而不必重建包
rpm --resign pello-0.1.1-1.el7.centos.noarch.rpm

构建时签名
rpmbuild -ba --sign blather-7.9.spec

Mock工具

yum install mock # epel源

Mock是构建包的工具,可以构建不同体系结构和不同Fedora或RHEL版本的软件包
mockchain可构建彼此依赖的包链

Mock可创建原始构建环境,此时系统当前状态的任何内容都不会影响RPM包本身
/etc/mock/目录中存放配置信息

mock -r epel-7-x86_64 ~/rpmbuild/SRPMS/cello-1.0-1.el7.centos.src.rpm
为RHEL7构建包
mock -r fedora-30-x86_64 ~/rpmbuild/SRPMS/cello-1.0-1.el7.centos.src.rpm
为Fedora 30构建包

假如你没有安装gcc,使用mock也可以构建包,安会将依赖安装到chroot中 (假如构建过程依赖gcc)
对于其他依赖也是如此,mock会自动下载所需的依赖

mock生成的包位于:/var/lib/mock/epel-6-x86_64/result 目录下
构建目录:/var/lib/mock/epel-6-x86_64/root

自定义宏
%global <name>[(opts)] <body>  #作用于整个spec文件
%define <name> <body>     #仅作用于spec文件的指定部分
要注释宏,使用%%

如:
%global githash 0ec4e58
%global python_sitelib %(%{__python} -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())")

%setup
准备源代码,--debug会显示详细操作内容
进入BUILD目录,清空目录,解压源码包,设置解压文件的权限
%setup -q    静默模式
%setup -n directory_name 指定解压出来的目录的名称,当名称不是 %{name}-%{version} 时使用
%setup -c 解压后没有子目录时使用,将自动创建 %{name}-%{version} 目录,并将文件移入其中
%setup -D 禁用删除源代码目录(清空构建目录的操作)
%setup -T 禁用解包操作
%setup -a n 在进入后扩展源,n指代SourceN
%setup -b n 在进入后扩展源

%files 部分
%license 标识LICENSE文件
%doc  标识文档文件,还包括示例代码、附带项目;若为代码示例,应注意删除可执行权限
%dir  标识目录,用于在删除时准确清理目录
%config(noreplace) 标识配置文件,noreplace表明在更新软件时,不会覆盖配置文件

内置宏
查看方法:rpm --showrc

RPM分发宏
针对于特定的发行版系统

自定义 Macros
~/.rpmmacros 文件
里面定义了 %_topdir 默认值为~/rpmbuild

Epoch、Scriptlets、Triggers

Epoch
基于版本号定义加权依赖关系的方法,默认值为0,用于处理生级排序问题,不推荐使用

Scriptlets和Triggers
安装或卸载过程中要执行的脚本,通常是shell脚本,也可以是宏
rpm --showrc | grep systemd
rpm --eval %{systemd_post}

指令 定义
%pre 在安装软件包之前执行
%post 在安装软件包之后执行
%preun 在卸载软件包之前执行
%postun 在卸载软件包之后执行

触发器,与scriptlet相同,但在安装或升级事务期间,会以非常特定的操作顺序执行,可以对整个过程进行更细粒度的控制

在spec文件中使用非shell脚本
-p /bin/sh  指定解析器
如:
%post -p /usr/bin/python3
print("This is {} code".format("python"))

RPM的条件判断
判断架构、操作系统、宏的存在和定义等

语法:

示例:

%if 0%{?rhel} == 6    #判断版本
%if 0%{?fedora} >= 19

 

 

 

 

 

 

 

参考资料:

RPM Packaging Guide:https://rpm-packaging-guide.github.io/
官方文档-宏:https://rpm.org/user_doc/macros.html
RPM打包原理、示例、详解及备查:https://blog.csdn.net/get_set/article/details/53453320?
RPM签名教程:https://access.redhat.com/documentation/en-us/red_hat_network_satellite/5.4/html/user_guide/chap-user_guide-rpms?
Fedora官方教程:https://docs.fedoraproject.org/en-US/Fedora_Draft_Documentation/0.1/html/RPM_Guide/index.html
# 第8章 制作RPM包;第9章 spec文件(内置宏);第10章 高级主题;第21章 RPM命令手册;第22章 spec语法

转载请注明:轻风博客 » RPM打包指南【CentOS】

喜欢 (0)or分享 (0)