linux-定制化rpm(rpmbuild)

一. 引文:

     为实现我们的快速安装,特定服务需求的服务部署需求, 我们选择了通过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 1Name:		xiao-%{pkg_name}
Version:	%{pkg_version}
Release:	%{pkg_release}%{?dist}
Summary:	nginx 1.12.1
Packager:	xiaoxiangGroup:		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.0Requires:	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.mzph.cn/diannao/66591.shtml

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

相关文章

解决Qt打印中文字符出现乱码

在 Windows 平台上&#xff0c;默认的控制台编码可能不是 UTF-8&#xff0c;这可能会导致中文字符的显示问题。 下面是在 Qt 应用程序中设置中文字体&#xff0c;并确保控制台输出为 UTF-8 编码&#xff1a; 1. Qt 应用程序代码 在 Qt 中&#xff0c;我们可以使用 QApplic…

测试用例颗粒度说明

当我们在编写测试用例时&#xff0c;总是会遇到一个问题&#xff1a;如何确定测试用例的颗粒度&#xff1f;测试用例过于粗糙&#xff0c;可能无法全面覆盖系统的细节&#xff1b;而颗粒度过细&#xff0c;又会导致测试重复、冗余。掌握合适的颗粒度&#xff0c;不仅可以提高测…

【大模型(LLM)面试全解】深度解析 Layer Normalization 的原理、变体及实际应用

系列文章目录 大模型&#xff08;LLMs&#xff09;基础面 01-大模型&#xff08;LLM&#xff09;面试全解&#xff1a;主流架构、训练目标、涌现能力全面解析 02-【大模型&#xff08;LLM&#xff09;面试全解】深度解析 Layer Normalization 的原理、变体及实际应用 大模型&…

VoiceBox:基于文本引导的多语种通用大规模语音生成

VoiceBox:基于文本引导的多语种通用大规模语音生成 Voicebox: Text-Guided Multilingual Universal Speech Generation at Scale Voicebox是由MetaAI发布的一个类似大语言模型的生成式语音模型。它是一种基础模型,可以完成类似大语言模型的功能,可以针对语音数据进行编辑、…

ModuleNotFoundError: No module named ‘setuptools_rust‘ 解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

基于 GEE 制作研究区影像覆盖图

目录 1 研究区影像覆盖图案例 2 基于 GEE 制作研究区影像覆盖图完整代码 3 运行结果 在写论文的时候&#xff0c;会有一小节内容专门介绍自己的研究区和使用的影像数据。为了让论文非常漂亮&#xff0c;有时候就需要做出研究区的地理位置图和所用卫星影像覆盖图&#xff0c;…

Mysql--基础篇--多表查询(JOIN,笛卡尔积)

在MySQL中&#xff0c;多表查询&#xff08;也称为联表查询或JOIN操作&#xff09;是数据库操作中非常常见的需求。通过多表查询&#xff0c;你可以从多个表中获取相关数据&#xff0c;并根据一定的条件将它们组合在一起。MySQL支持多种类型的JOIN操作&#xff0c;每种JOIN都有…

ASA-Cluster集群模式

集群设备数量看授权 整体性能小于单个设备累加 广播选举 优先级1-100 选举完成 不抢占 集群状态 master、standby 接口模式 Spanned EtherChannel、IndividualInterface 心跳线 control link。 数据、控制层面 集群脑裂之后 设备需要手动加入集群 连接的三个角色&#xf…

用于 EV 牵引电机的先进冷却技术

电动汽车牵引电机的冷却挑战 热管理的重要性 有效的热管理在电动汽车 &#xff08;EV&#xff09; 设计中至关重要&#xff0c;尤其是在牵引电机方面。这些电机将电能转化为机械运动&#xff0c;对车辆的整体性能和效率至关重要。 管理它们的热量至关重要&#xff0c;不仅可以…

RK3568平台(USB篇)禁用USB端口

一.linux中怎样查看usb的端口号 在USB口插入U盘: [ 198.141319][ T106] usb 3-1.3: new SuperSpeed Gen 1 USB device number 5 using xhci-hcd [ 198.161695][ T106] usb 3-1.3: New USB device found, idVendor=0781, idProduct=5591, bcdDevice= 1.00 [ 198.161721]…

Redis Exporter 安装与配置指南(v1.67.0)

&#x1f680; 1. 下载 Redis Exporter 首先&#xff0c;登录到目标服务器&#xff0c;下载 Redis Exporter v1.67.0 安装包。 wget https://github.com/oliver006/redis_exporter/releases/download/v1.67.0/redis_exporter-v1.67.0.linux-amd64.tar.gz&#x1f4e6; 2. 解压…

Python 的网页自动化工具 DrissionPage 介绍

DrissionPage 介绍 视频教程 不要再学selenium了&#xff0c;DrissionPage更香_哔哩哔哩_bilibili不要再学selenium了&#xff0c;DrissionPage更香DrissionPage官网 https://www.drissionpage.cn/, 视频播放量 56768、弹幕量 12、点赞数 1012、投硬币枚数 503、收藏人数 316…

【HarmonyOS NEXT】鸿蒙应用使用后台任务之长时任务,解决屏幕录制音乐播放等操作不被挂起

【HarmonyOS NEXT】鸿蒙应用使用后台任务之长时任务&#xff0c;解决屏幕录制音乐播放等操作不被挂起 一、前言 1.后台是什么&#xff1f; 了解后台任务和长时任务前&#xff0c;我们需要先明白鸿蒙的后台特性&#xff1a;所谓的后台&#xff0c;指的是设备返回主界面、锁屏、…

nvm实现nodejs的版本管理

部分老旧项目需要使用低版本的node&#xff0c;网上很多是无效的&#xff0c;高版本无法直接安装低版本node&#xff0c;但是低版本nodejs可以安装部分高版本node&#xff0c;从而达到升级效果。 NVM安装 nvm是什么 nvm全英文也叫node.js version management&#xff0c;是一个…

基于华为ENSP的OSPF接口网络类型深入浅出(4)

本篇技术博文摘要 &#x1f31f; OSPF的接口在不同网络类型下的工作方式&#xff1b;不同网络类型下的报文通告方式深入浅出hub-spoke架构 引言 &#x1f4d8; 在这个快速发展的技术时代&#xff0c;与时俱进是每个IT人的必修课。我是肾透侧视攻城狮&#xff0c;一名什么都会一…

【深度学习】多目标融合算法(二):底部共享多任务模型(Shared-Bottom Multi-task Model)

目录 一、引言 1.1 往期回顾 1.2 本期概要 二、Shared-Bottom Multi-task Model&#xff08;SBMM&#xff09; 2.1 技术原理 2.2 技术优缺点 2.3 业务代码实践 三、总结 一、引言 在朴素的深度学习ctr预估模型中&#xff08;如DNN&#xff09;&#xff0c;通常以一个行…

TVbox 手机、智能电视节目一网打尽

文章目录 一、简要介绍二、优点三、下载地址 一、简要介绍 TVbox是目前最火爆的多端、多源的电视影音工具&#xff0c;是一款开源的自定义添加站源的影音工具。TVBox&#xff0c;支持电视频道直播。一款TV端影视工具&#xff0c;软件本身不具有任何影视资源&#xff0c;但可以…

2025新春烟花代码(二)HTML5实现孔明灯和烟花效果

效果展示 源代码 <!DOCTYPE html> <html lang"en"> <script>var _hmt _hmt || [];(function () {var hm document.createElement("script");hm.src "https://hm.baidu.com/hm.js?45f95f1bfde85c7777c3d1157e8c2d34";var …

ue5 蒙太奇,即上半身动画和下半身组合在一起,并使用。学习b站库得科技

本文核心 正常跑步动画端枪动画跑起来也端枪 正常跑步动画 端枪动画的上半身 跑起来也端枪 三步走&#xff1a; 第一步制作动画蒙太奇和插槽 第二步动画蓝图选择使用上半身动画还是全身动画&#xff0c;将上半身端枪和下半身走路结合 第三步使用动画蒙太奇 1.开始把&a…

YOLOv8实战人员跌倒检测

本文采用YOLOv8作为核心算法框架&#xff0c;结合PyQt5构建用户界面&#xff0c;使用Python3进行开发。YOLOv8以其高效的实时检测能力&#xff0c;在多个目标检测任务中展现出卓越性能。本研究针对人员跌倒目标数据集进行训练和优化&#xff0c;该数据集包含丰富人员跌倒图像样…