linux-定制化rpm(rpmbuild)

news2025/1/10 15:46:32

一. 引文:

     为实现我们的快速安装,特定服务需求的服务部署需求, 我们选择了通过source编译后定制成rpm,存放至自定义yum仓库,通过yum工具规范化管理及部署服务。目前比较常用的rpm打包方式分别为rpmbuild和fpm(在rpmbuild基础上使用ruby做了封装)。 

二. rpmbuild 工具:

1. 工具简述

    关于rpmbuild默认工作路径的确定,通常由在/usr/lib/rpm/macros这个文件里的一个叫做%_topdir的宏变量来定义。如果用户想更改这个目录名,rpm官方并不推荐直接更改这个目录,而是在用户家目录下建立一个名为.rpmmacros的隐藏文件(注意前面的点不能少,这是Linux下隐藏文件的常识),然后在里面重新定义%_topdir,指向一个新的目录名。这样就可以满足某些“高级”用户的差异化需求了。通常情况下.rpmmacros文件里一般只有一行内容。另外,可以通过命令临时指定工作路径(--define '_topdir /opt/xiao_nginx')。

 rpmbuild的目录结构如下:

BUILD                  编译前,如解压后存放的路径
BUILDROOT      编译后存放的路径
RPMS                   打包后rpm包存放的路径
SOURCES           用于存放源码、补丁,RPM 会自动从该目录自动寻找
SPECS                  存放spec文件
SRPMS                 源码rpm存放路径

注:一般我们都把源码打包成tar.gz格式然后存放于SOURCES路径下,而在SPECS路径下编写spec文档,通过命令打包后,默认会把打包后的rpm包放在RPMS下,而源码包会被放置在SRPMS下

2  .spec脚本编写

生成rpm除了源码外,最重要的就是懂得编写.spec脚本。rpm建包的原理其实并不复杂,可以理解为按照标准的格式整理一些信息,包括:软件基础信息,以及安装、卸载前后执行的脚本,对源码包解压、打补丁、编译,安装路径和文件等。
实际过程中,最关键的地方,是要清楚虚拟路径的位置,以及宏的定义。

%define         变量定义(如:%define  pkg_release 1 , 定义变量pkg_release,value为1)

Name:           软件包名称(如:xiao-%{pkg_name})
Version:        软件实际版本号(如:   %{pkg_version})
Release:        发布序列号( 如:%{pkg_release}%{?dist} )
Summary:        软件包内容概要 (如:  nginx 1.12.1)
Packager:       打包者信心  ( 如: xiaoxiang)

Group:          软件分组(如:xiao/service)

License:        软件授权方式,(如:GPL(自由软件),BSD,MIT,Pubilc Domain(公共域),Distributable(贡献),commercial(商业),Share(共享),通常都是GPL)

URL:            联系地址/主页( 如:http://wiki.xiao.com.cn)
Source0:      源代码包(可以有多个 Source0、Source1。。)

Requires:     所依赖软件包 ( libxml2-devel,可用>=,<=标识特定版本,如:libpng-devel >= 1.0.20 zlib)
BuildRoot:    安装或编译时的虚拟目录 ( %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)  重要,在生成rpm的过程中,执行make install时就会把软件安装到上述的路径中,在打包的时候,同样依赖“虚拟目录”为“根目录”进行操作。

%description    #描述(如:xiao official nginx release(1.12.1) )

%prep        预处理脚本(如: %setup -q)
%pre        安装前执行的操作

%build       构建包(在BUILD/%{name}-%{version}目录中进行的make工作,如:make %{?_smp_mflags} OPTIMIZE="%{optflags}")

%install     软件安装(在BUILD/%{name}-%{version}目录中进行make install的操作。这个很重要,因为如果这里的路径不对的话,则下面%file中寻找文件的时候就会失败。如:%makeinstall )

%clean   清理临时文件(如:rm -rf "$RPM_BUILD_ROOT")
%post    rpm安装后执行的脚本
%preun   rpm卸载前执行的脚本
%postun  rpm卸载后执行的脚本

%files      定义软件包所包含的文件,分为三类--说明文档(doc),配置文件(config)及执行程序,还可定义文件存取权限,拥有者及组别。
%defattr    (-,root,root) 指定包装文件的属性,分别是(mode,owner,group),-表示默认值,对文本文件是0644,可执行文件是0755

%changelog   修改日志段。你可以将软件的每次修改记录到这里,保存到发布的软件包中,以便查询之用。每一个修改日志都有这样一种格式:第一行是:* 星期 月 日 年 修改人 电子信箱。其中:星期、月份均用英文形式的前3个字母,用中文会报错。接下来的行写的是修改了什么地方,可写多行。一般以减号开始,便于后续的查阅

%prep:  

关于源码结构, 标准的应该为:sourcename-version.tar.gz , 也可以是一个源码目录。%prep时通过-n指定目录即可

%prep

%setup -n %{name}
%setup -q 成功执行的前提是你位于SOURCES目录下的源码包必须是name-version.tar.gz的格式

%build:

在/usr/src/asianux/BUILD/%{name}-%{version}目录中进行make的工作 ,常见写法:

引用make %{?_smp_mflags} OPTIMIZE="%{optflags}",都是一些优化参数,定义在/usr/lib/rpm/marcros中

如:

%build
 ./configure --prefix=%{_prefix} --enable-final
make

%install: 

在/usr/src/asianux/BUILD/%{name}-%{version}目录中进行make install的操作。这个很重要,因为如果这里的路径不对的话,则下面%file中寻找文件的时候就会失败。 常见内容有:
%makeinstall 这不是关键字,而是rpm定义的标准宏命令。也可以使用非标准写法:

引用make DESTDIR=$RPM_BUILD_ROOT install , 或引用make prefix=$RPM_BUILD_ROOT install 。需要说明的是,这里的%install主要就是为了后面的%file服务的。

%install 
rm -fr $RPM_BUILD_ROOT 
make DESTDIR=$RPM_BUILD_ROOT install 
cp -r $RPM_BUILD_ROOT%{_datadir}/apps/kolourpaint/icons/hicolor/* $RPM_BUILD_ROOT%{_datadir}/icons/crystalsvg/

%files:

由于必须在%file中包括所有套件中的文件,所以,我们需要清楚编译完的套件到底包括那些文件?常见的做法是,人工模拟一次编译的过程:

./configrue --prefix=/usr/local/xxx
make

make DESTDIR=/usr/local/xxx install或 make prefix=/usr/local/xxx install

%changelog :

eg:

%changelog  
* Sat Jun 23 2015 Karanbir Singh <kbsingh@centos.org> - 13.21.176.1.el6.centos  
- Build for CentOS-7.3

三. 案例(自定义nginx rpm包):

 tree -L 2 xiao_nginx/
xiao_nginx/
├── BUILD
├── BUILDROOT
├── package.spec
├── RPMS
│   └── x86_64
├── SOURCES                   #打包目录nginx 及三个依赖模块
│   ├── Luajit
│   ├── lua-nginx-module-0.10.10
│   ├── nginx
│   └── ngx_devel_kit-0.3.0
├── SPECS
└── SRPMS

package.spec,编写:

# cat package.spec
%define pkg_name nginx
%define pkg_version 1.12.1
%define pkg_release 1

Name:		xiao-%{pkg_name}
Version:	%{pkg_version}
Release:	%{pkg_release}%{?dist}
Summary:	nginx 1.12.1
Packager:	xiaoxiang

Group:		xiao/service
License:	GPL
URL:		http://wiki.xiao.com.cn
Source0:	nginx
Source1:	Luajit
Source2:	lua-nginx-module-0.10.10
Source3:	ngx_devel_kit-0.3.0

Requires:	libxml2-devel,libxslt-devel,pcre-devel,openssl-devel,GeoIP-devel,lua-devel
BuildRoot:	%(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)

%description
xiao official nginx release(1.12.1)

%prep

%build

%install
mkdir -p $RPM_BUILD_ROOT/usr/local/
mkdir -p $RPM_BUILD_ROOT/opt/
cp -a %{SOURCE0} $RPM_BUILD_ROOT/opt/nginx
cp -a %{SOURCE1} $RPM_BUILD_ROOT/usr/local/Luajit
cp -a %{SOURCE2} $RPM_BUILD_ROOT/usr/local/lua-nginx-module-0.10.10
cp -a %{SOURCE3} $RPM_BUILD_ROOT/usr/local/ngx_devel_kit-0.3.0

%clean
rm -rf $RPM_BUILD_ROOT

%files
/opt/nginx
/usr/local/Luajit
/usr/local/lua-nginx-module-0.10.10
/usr/local/ngx_devel_kit-0.3.0
/ngx_devel_kit-0.3.0
/lua-nginx-module-0.10.10
%changelog

执行打包命令:


#rpmbuild -bb --define '_topdir /opt/xiao_nginx' xiao_nginx/package.spec
#ls xiao_nginx/RPMS/x86_64/
xiao-nginx-1.12.1-1.amzn1.x86_64.rpm

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2274417.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MR30分布式 IO 在物流分拣线的卓越应用

在当今物流行业高速发展的时代&#xff0c;物流分拣线的高效与精准运作至关重要&#xff0c;而其中对于货物点数较多情况下的有效控制更是一大关键环节。明达技术MR30分布式 IO 系统凭借其独特的优势&#xff0c;在物流分拣线中大放异彩&#xff0c;为实现精准的点数控制提供了…

5 分布式ID

这里讲一个比较常用的分布式防重复的ID生成策略&#xff0c;雪花算法 一个用户体量比较大的分布式系统必然伴随着分表分库&#xff0c;分机房部署&#xff0c;单体的部署方式肯定是承载不了这么大的体量。 雪花算法的结构说明 如下图所示: 雪花算法组成 从上图我们可以看…

Android wifi常见问题及分析

参考 Android Network/WiFi 那些事儿 前言 本文将讨论几个有意思的网络问题&#xff0c;同时介绍 Android 上常见WiFi 问题的分析思路。 网络基础Q & A 一. 网络分层缘由 分层想必大家很熟悉&#xff0c;是否想过为何需要这样分层&#xff1f; 网上大多都是介绍每一层…

音视频入门基础:MPEG2-PS专题(6)——FFmpeg源码中,获取PS流的视频信息的实现

音视频入门基础&#xff1a;MPEG2-PS专题系列文章&#xff1a; 音视频入门基础&#xff1a;MPEG2-PS专题&#xff08;1&#xff09;——MPEG2-PS官方文档下载 音视频入门基础&#xff1a;MPEG2-PS专题&#xff08;2&#xff09;——使用FFmpeg命令生成ps文件 音视频入门基础…

读书笔记:分布式系统原理介绍

写在前面 已经大概三个月左右没有更新博客了&#xff0c;哈哈哈哈&#xff1b; 此博客是笔者在对《分布式系统原理介绍》进行概述&#xff0c;对于整个分布式系统协议的理解基于一些量化的指标考虑了数据的分布副本协议&#xff08;中心化/去中心化&#xff09;进行了总结&…

Dexcap复现代码数据预处理全流程(四)——demo_clipping_3d.py

此脚本的主要功能是可视化点云数据文件&#xff08;.pcd 文件&#xff09;&#xff0c;并通过键盘交互选择演示数据的起始帧和结束帧&#xff0c;生成片段标记文件 (clip_marks.json) 主要流程包括&#xff1a; 用户指定数据目录&#xff1a;检查目录是否存在并处理标记文件 -…

MBM指尖六维力触觉传感器:高灵敏度、低漂移,精准掌控力学世界

MBM指尖六维力触觉传感器是一种专为机器人设计的高性能传感器。它通过集成三轴力和三轴力矩的感知能力&#xff0c;能够精准捕捉复杂的力学信息。传感器采用MEMS与应变体复合测量技术&#xff0c;具备数字输出功能&#xff0c;显著降低漂移并减少安装偏移的影响。其紧凑轻便的设…

C#,图论与图算法,任意一对节点之间最短距离的弗洛伊德·沃肖尔(Floyd Warshall)算法与源程序

一、弗洛伊德沃肖尔算法 Floyd-Warshall算法是图的最短路径算法。与Bellman-Ford算法或Dijkstra算法一样&#xff0c;它计算图中的最短路径。然而&#xff0c;Bellman Ford和Dijkstra都是单源最短路径算法。这意味着他们只计算来自单个源的最短路径。另一方面&#xff0c;Floy…

为答疑机器人扩展问题分类与路由功能

1.意图识别 2. 构建路由模块 简单的意图识别 from chatbot import llmfrom config.load_key import load_key load_key()prompt 【角色背景】 你是一个问题分类路由器&#xff0c;需要识别问题的类型。 --- 【任务要求】 问题的类型目前有&#xff1a;公司内部文档查询、内…

spring boot启动源码分析(三)之Environment准备

上一篇《spring-boot启动源码分析&#xff08;二&#xff09;之SpringApplicationRunListener》 环境介绍&#xff1a; spring boot版本&#xff1a;2.7.18 主要starter:spring-boot-starter-web 本篇开始讲启动过程中Environment环境准备&#xff0c;Environment是管理所有…

Pandas-RFM会员价值度模型

文章目录 一. 会员价值度模型介绍二. RFM计算与显示1. 背景2. 技术点3. 数据4. 代码① 导入模块② 读取数据③ 数据预处理Ⅰ. 数据清洗, 即: 删除缺失值, 去掉异常值.Ⅱ. 查看清洗后的数据Ⅲ. 把前四年的数据, 拼接到一起 ④ 计算RFM的原始值⑤ 确定RFM划分区间⑥ RFM计算过程⑦…

【理论】测试框架体系TDD、BDD、ATDD、DDT介绍

一、测试框架是什么 测试框架是一组用于创建和设计测试用例的指南或规则。框架由旨在帮助 QA 专业人员更有效地测试的实践和工具的组合组成。 这些指南可能包括编码标准、测试数据处理方法、对象存储库、存储测试结果的过程或有关如何访问外部资源的信息。 A testing framewo…

FreeU: Free Lunch in Diffusion U-Net 笔记

FreeU: Free Lunch in Diffusion U-Net 摘要 作者研究了 U-Net 架构对去噪过程的关键贡献&#xff0c;并发现其主干部分主要在去噪方面发挥作用&#xff0c;而其跳跃连接主要是向解码器模块引入高频特征&#xff0c;这使得网络忽略了主干部分的语义信息。基于这一发现&#…

JAVA 使用apache poi实现EXCEL文件的输出;apache poi实现标题行的第一个字符为红色;EXCEL设置某几个字符为别的颜色

设置输出文件的列宽&#xff0c;防止文件过于丑陋 Sheet sheet workbook.createSheet(FileConstants.ERROR_FILE_SHEET_NAME); sheet.setColumnWidth(0, 40 * 256); sheet.setColumnWidth(1, 20 * 256); sheet.setColumnWidth(2, 20 * 256); sheet.setColumnWidth(3, 20 * 25…

【STM32】无源蜂鸣器播放音乐《千与千寻》,HAL库

目录 一、工程链接 二、简单介绍 主要特点&#xff1a; 应用&#xff1a; 驱动电路&#xff1a; 三、原理图 四、cubeMX配置 时钟配置 五、keil配置 六、驱动编写 演奏函数 主函数编写 七、效果展示 八、驱动附录 music.h music.c 一、工程链接 STM32无源蜂鸣…

在 Vue 3 集成 e签宝电子合同签署功能

实现 Vue 3 e签宝电子合同签署功能&#xff0c;需要使用 e签宝提供的实际 SDK 或 API。 e签宝通常提供针对不同平台&#xff08;如 Web、Android、iOS&#xff09;的 SDK&#xff0c;而 Web 端一般通过 WebView 或直接使用嵌入式 iframe 来加载合同签署页面。 下面举个 &…

04、Redis深入数据结构

一、简单动态字符串SDS 无论是Redis中的key还是value&#xff0c;其基础数据类型都是字符串。如&#xff0c;Hash型value的field与value的类型&#xff0c;List型&#xff0c;Set型&#xff0c;ZSet型value的元素的类型等都是字符串。redis没有使用传统C中的字符串而是自定义了…

如何用Python编程实现自动整理XML发票文件

传统手工整理发票耗时费力且易出错&#xff0c;而 XML 格式发票因其结构化、标准化的特点&#xff0c;为实现发票的自动化整理与保存提供了可能。本文将详细探讨用python来编程实现对 XML 格式的发票进行自动整理。 一、XML 格式发票的特点 结构化数据&#xff1a;XML 格式发票…

Linux——修改USB网卡设备节点名称

修改驱动&#xff1a; 测试&#xff1a; 参考资料&#xff1a; https://blog.csdn.net/ablexu2018/article/details/144868950

(STM32笔记)十二、DMA的基础知识与用法 第三部分

我用的是正点的STM32F103来进行学习&#xff0c;板子和教程是野火的指南者。 之后的这个系列笔记开头未标明的话&#xff0c;用的也是这个板子和教程。 DMA的基础知识与用法 三、DMA程序验证1、DMA 存储器到存储器模式实验&#xff08;1&#xff09;DMA结构体解释&#xff08;2…