通过源码包*.src.rpm定制开发rpm

2023-11-20

1. 基本流程

(1) 下载&安装相应的src.rpm包
wget xxx.src.rpm && rpm -ivh xxx.src.rpm
这里的“安装”是指把xxx.src.rpm中的tar.gz、patches、xxx.spec等文件分别输出到/usr/src/redhat/的SOURCES、SPECS等子目录中;

(2) 根据自己的需要修改

相关需求归纳:生成可编译版、打新补丁、使能/禁用某些功能、取消某些限制(如只能root用户才能使用等)。。。 。。。

   1)打新补丁:rpm -ivh xxx.src.rpm && 修改xxx.spec文件(在其中加入Patchnum: $new_patch_name.patch并在%prep中加入相应命令)
2)根据需求修改xxx.spec文件的相应字段;如在CFLAGS上加入-g参数以生成可调试版

如果没有相应的xxx.spec文件&&在发行商的网站上也没有相应的xxx.spec文件,可以通过rpmdev-newspec命令来生成一个spec文件的模板文件,然后根据实际情况编辑生成的spec文件。

(3) 重新生成rpm文件:rpmbuild -ba /usr/src/redhat/SPECS/xxx.spec
这时在/usr/src/redhat/RPMS/i386/下就生成了新的xxx.rpm文件。

(4)使用 Mock 和 Koji 去测试 RPM 包 from “Fedora新维护人员指南”,如果自己使用可略去此步。

参考:“file.src.rpm使用方法简单介绍” @ http://fedora.linuxsir.org/main/src.spec.html

2. 常用的rpm参数组合

(1)rpm -qx file_name, x={f,i,l,a,p...}, file_name可以是命令名、动态库名称、配置文件名等等。

使用此命令的前提:相应的rpm包已经安装。

rpm -qf file:查询文件file是哪个rpm包中的;rpm -qf `which your_cmd`, rpm -qf `locate file_name`

rpm -qi rpm_name:查看指定rpm包安装的详细信息;

rpm -ql installed_rpm_name:列出已经安装的rpm包中包含了哪些文件及他们的安装路径。如rpm -ql iptraf

用以下选项与 -q 连用来指明要查询哪些软件包的信息。这些选项被称之为“软件包指定选项”:
-a 查询所有已安装的软件包。
-f <file> 将查询包含有文件 <file>的软件包。
-p <packagefile> 查询软件包文件名为 <packagefile>的包。

有几种方式来指定查询软件包时所显示的信息。 以下选项可通过读取rpm包头部的办法显示rpm包的信息,这样的选项被称作“信息选择选项”:
-i 显示软件包信息,如描述、发行号、大小、编译日期、安装日期、硬件平台、以及其它一些各类信息。
-l 列出软件包中包含的文件。(列出已经安装的rpm包中包含了哪些文件及他们的安装路径)
-s 显示软件包中所有文件的状态。
-d 列出被标注为文档的文件 (如,man 手册、 info 信息、README,等等) 。
-c 列出被标注为配置文件的文件。这些文件是需要在安装完毕后加以定制的,如 (sendmail.cf, passwd, inittab, 等) 。

如果要在执行上述选项的同时,显示文件列表, 可以同时使用 -v 命令行选项,就能得出与 ls -l 格式类似的输出。

(2)查看未安装的rpm/src.rpm包中包含的文件列表

- 在本地暂时只能使用(4)中提供的方法;

- 通过rpmfind.net等网站进行查询;

(3)rpm -ivh xxx.rpm:重新安装;(和-Uvh相比,建议用-ivh)

rpm -ivh --relocate /=/tmp/test/ xxx.rpm

(4)rpm2cpio xxx.rpm/xxx.src.rpm:将rpm解压为cpio归档;

rpm2cpio xxx.rpm/xxx.src.rpm | cpio -idmv (rpm2cpio xxx.rpm | cpio --extract --make-directories)
参数-i(或--extract)表示提取文件; v表示指示执行进程;-d(或--make-directory)表示根据包中文件原来的路径建立目录;m表示保持文件的更新时间。

【3. 关于rpmbuild -bSTAGE语法的分析】

关于“打包”的说明

使用rpmbuild工具来发布rpm格式的源码包(xxx.src.rpm)或者二进制包(xxx.rpm)。如果已经根据本地源码包建立了spec文件(该文件要以.spec结束,可以用rpmdev-newspec生成spec文件模板)和rpm包构建环境(由 /usr/src/redhat/{BUILD,SOURCE,SPEC,SRPM,RPM}等5个目录组成的rpm构建环境,其中BUILD目录用来存 放打包过程中的源文件,SOURCE用来存放打包是要用到的源文件和patch,SPEC用来存放spec文件,SRPM、RPM分别存放打包生成的 rpm格式的源文件和二进制文件),就可以根据需要来选用不同的参数打包文件。下面总结了几种常见的打包参数组合:

1) 只生成二进制格式的rpm包:rpmbuild -bb xxx.spec。用此命令生成软件包,执行后屏幕将显示如下信息:(每行开头为行号)

1 Executing: %prep
2 + umask 022
3 + cd /usr/src/dist/BUILD
4 + exit 0
5 Executing: %build
6 + umask 022
7 + cd /usr/src/dist/BUILD
生成的文件会输出到RPM目录下。

2)只生成src格式的rpm包:rpmbuild -bs xxx.spec。生成的文件会在刚才建立的SRPM目录下存在。

3) 只需要生成完整的源文件:rpmbuild -bp xxx.spec。源文件存在目录BUILD下,生成相应rpm包后,BUILD下的源文件不会被自动删除。这个命令的作用就是把tar包解开然后把所有的补丁文件合并而生成一个完整的具最新功能的源文件。

4) 完全打包:rpmbuild -ba xxx.spec

5)from rpmbuild's manpage

-ba:"build binary and source packages (after doing the %perp, %build and %install stages)";

-bp:"execute the %prep stage from the spec file. Normally this involves unpacking the sources and applying any patches.";

rpmbuild常用参数: -bb 只编译二进制rpm包 -bs 只编译源码rpm包(src.rpm) -ba 同时编译二进制和源码rpm包(src.rpm) -bp解开tar包然后把所有的补丁文件合并而生成一个完整的具最新功能的源文件

b=build(-b); a=after, p=prep, s=source, b=binary;

参考:

(1)“RPM 打包技术与典型 SPEC 文件分析”一.4打包 @ http://www.ibm.com/developerworks/cn/linux/l-rpm/?S_TACT=105AGX52&S_CMP=tech-51CTO

(2)“Fedora新维护人员指南” fedoraproject.org/wiki/Zh/Fedora新维护人员指南

4. Use alien to convert RPM to Deb or Deb2RPM

========================= 附录:RPM命令手册 ===========================

一、安装

命令格式: rpm -i ( or --install) options file1.rpm ... fileN.rpm

参数: file1.rpm ... fileN.rpm 将要安装的RPM包的文件名

详细选项:

-h (or --hash) 安装时输出hash记号 (``#'')
--test 只对安装进行测试,并不实际安装
--percent 以百分比的形式输出安装的进度
--excludedocs 不安装软件包中的文档文件
--includedocs 安装文档
--replacepkgs 强制重新安装已经安装的软件包
--replacefiles 替换属于其它软件包的文件
--force 忽略软件包及文件的冲突
--noscripts 不运行预安装和后安装脚本(spec文件中的%prep和%clean部分的脚本)
--prefix 将软件包安装到由 指定的路径下 (已验证:仅限于二进制rpm安装包,不支持src.rpm)
--ignorearch 不校验软件包的结构
--ignoreos 不检查软件包运行的操作系统
--nodeps 不检查依赖性关系
--ftpproxy 用 作为 FTP代理(直接安装远程的rpm包,而非先下载到本地再安装)
--ftpport 指定FTP的端口号为

通用选项:

-v 显示附加信息
-vv 显示调试信息
--root 让RPM将指定的路径做为"根目录",这样预安装程序和后安装程序都会安装到这个目录下
--rcfile 设置rpmrc文件为
--dbpath 设置RPM 资料库存所在的路径为

二、删除

命令格式: rpm -e ( or --erase) options pkg1 ... pkgN

参数:pkg1 ... pkgN :要删除的软件包

详细选项:

--test 只执行删除的测试
--noscripts 不运行预安装和后安装脚本程序
--nodeps 不检查依赖性

通用选项:

-vv 显示调试信息
--root 让RPM将指定的路径做为"根目录",这样预安装程序和后安装程序都会安装到这个目录下
--rcfile 设置rpmrc文件为
--dbpath 设置RPM 资料库存所在的路径为

三、升级

命令格式:rpm -U ( or --upgrade) options file1.rpm ... fileN.rpm

参数:file1.rpm ... fileN.rpm 软件包的名字

详细选项:

-h (or --hash) 安装时输出hash记号 (``#'')
--oldpackage 允许"升级"到一个老版本
--test 只进行升级测试
--excludedocs 不安装软件包中的文档文件
--includedocs 安装文档
--replacepkgs 强制重新安装已经安装的软件包
--replacefiles 替换属于其它软件包的文件
--force 忽略软件包及文件的冲突
--percent 以百分比的形式输出安装的进度。
--noscripts 不运行预安装和后安装脚本
--prefix 将软件包安装到由 指定的路径下
--ignorearch 不校验软件包的结构
--ignoreos 不检查软件包运行的操作系统
--nodeps 不检查依赖性关系
--ftpproxy 用 作为 FTP代理
--ftpport 指定FTP的端口号为

通用选项:

-v 显示附加信息
-vv 显示调试信息
--root 让RPM将指定的路径做为"根目录",这样预安装程序和后安装程序都会安装到这个目录下
--rcfile 设置rpmrc文件为
--dbpath 设置RPM 资料库存所在的路径为

四、查询

命令格式:rpm -q ( or --query) options

参数: pkg1 ... pkgN :查询已安装的软件包

详细选项:

-p (or ``-'') 查询软件包的文件
-f 查询属于哪个软件包
-a 查询所有安装的软件包
--whatprovides 查询提供了 功能的软件包
-g 查询属于 组的软件包
--whatrequires 查询所有需要 功能的软件包

信息选项:

显示软件包的全部标识
-i 显示软件包的概要信息
-l 显示软件包中的文件列表
-c 显示配置文件列表
-d 显示文档文件列表
-s 显示软件包中文件列表并显示每个文件的状态
--scripts 显示安装、卸载、校验脚本
--queryformat (or --qf) 以用户指定的方式显示查询信息
--dump 显示每个文件的所有已校验信息
--provides 显示软件包提供的功能
--requires (or -R) 显示软件包所需的功能

通用选项:

-v 显示附加信息
-vv 显示调试信息
--root 让RPM将指定的路径做为"根目录",这样预安装程序和后安装程序都会安装到这个目录下
--rcfile 设置rpmrc文件为
--dbpath 设置RPM 资料库存所在的路径为

五、校验已安装的软件包

命令格式: rpm -V ( or --verify, or -y) options

参数:pkg1 ... pkgN 将要校验的软件包名

软件包选项:

-p Verify against package file
-f 校验所属的软件包
-a Verify 校验所有的软件包
-g 校验所有属于组 的软件包

详细选项:

--noscripts 不运行校验脚本
--nodeps 不校验依赖性
--nofiles 不校验文件属性

通用选项:

-v 显示附加信息
-vv 显示调试信息
--root 让RPM将指定的路径做为"根目录",这样预安装程序和后安装程序都会安装到这个目录下
--rcfile 设置rpmrc文件为
--dbpath 设置RPM 资料库存所在的路径为

六、校验软件包中的文件

语法: rpm -K ( or --checksig) options file1.rpm ... fileN.rpm

参数: file1.rpm ... fileN.rpm 软件包的文件名

Checksig--详细选项

--nopgp 不校验PGP签名

通用选项:

-v 显示附加信息
-vv 显示调试信息
--rcfile 设置rpmrc文件为


七、其它RPM选项

--rebuilddb 重建RPM资料库
--initdb 创建一个新的RPM资料库
--quiet 尽可能的减少输出
--help 显示帮助文件
--version 显示RPM的当前版本

转载于:https://my.oschina.net/qihh/blog/63037

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过源码包*.src.rpm定制开发rpm 的相关文章

  • window系统消失的c盘,实际占用与显示占用相差好多G

    问题 C盘一直显示的红色提醒 我c盘实际占用的空间只有33 1GB 而我的c盘总共大小是59 9GB 显示的剩余大小是1 35GB 也就是说我占用了58 11 和c盘的总文件大小相差了25GB 那么消失的25GB去了哪里 我百度过这个问题
  • 终端连接控制(stty的编写)

    终端连接控制 stty的编写 一 背景 文件与目录在之前已经学习过了 文件中包含着数据 这些数据可以被读出 写入 也可以用以操作 但文件不仅仅是计算机唯一的数据来源 计算机的数据还可以来自于许多的外部设备 比如扫描仪 照相机 鼠标等输入设备
  • 线程和进程的区别(面试必备)

    参考文章 https www jianshu com p 2dc01727be45 线程与进程的区别通俗的解释 https www jianshu com p 8ad441510860 附加可参考文章 https baijiahao bai
  • Linux系统的安装(在VM虚拟机上安装CentOS 7)

    工具准备 物理计算机一台 配置要求 操作系统 win10 64位 大家基本上都是 硬盘可用容量 20G以上 内存容量 4G以上 虚拟机安装包 VMware workstation full 12 5 下载链接 点我下载 提取码 9gha C
  • linux 如何创建卷组

    1 创建一个物理卷 Pvcreate dev sd1 dev sd2 dev sd3 dev sd4 2 用刚才创建的物理卷创建一个卷组 Vgcreate 卷组名 dev sd1 dev sd2 dev sd3 dev sd4 3 创建逻辑
  • 计算机领域中随处可见的抽象

    想要管理多种具体的东西 那么需要遵守每种东西的规范 如果想要提供一种通用模式来对这些具体的东西统一管理 需要使用一种古老的技术 抽象 抽象是将多种具体的东西 管理时需要遵守的规范 的共同点抽取出来 放入到更高一层的抽象层 在抽象层不定义或少
  • CentOS 7 关闭网络限制

    1 安装CentOS 7 3操作系统mini版本即可 2 设置关闭Selinux 编辑 etc selinux config vi etc selinux config SELINUX disabled 重启机器 查看selinux状态 s
  • VMware-Ubuntu安装bochs

    我的运行环境是VMware的Ubuntu 首先大家可以按照CSDN上的教程按照符合自己需求的虚拟机 我在上午还在VMware和virtualBox之间做选择 但是由于已经安装过了VMware 所以我就直接用了VMware 当然了 一千人眼中
  • 操作系统学习(九)进程通信

    一 知识总览 二 定义 进程通信是指进程之间的信息交换 每个进程都拥有自己的内存空间 是相互独立的 这样在每个进程执行时 才不会被其他进程所干扰 三 进程通信的方式 1 共享存储 1 两个进程对共享区的访问必须是互斥的 即在同一时间内 只允
  • pycharm内存不足时如何修改设置?

    Help gt Find Action gt type VM Options gt Click Edit Custom VM Options Pycharm 2016 2 will open the appropriate vmoption
  • gpuz怎么看显存颗粒

    gpuz可以帮助一些用户查看电脑的一切显卡参数 对于想要了解显卡的网友来说使用起来是非常方便的 不过有些网友是刚开始使用 还不知道gpuz怎么看显存颗粒 下面小编就教下大家gpuz查看显存颗粒的方法 首先 显存颗粒是显存的物理存储组成单元
  • 《一个操作系统的实现》读书笔记-- 第一章--最小的“操作系统”

    一 最简单的 操作系统 最最简单的 操作系统 就是一个最最简单的引导扇区 Boot Sector 虽然它不具有任何功能 但是它却能够直接在裸机上运行 不依赖其他软件 一个引导扇区是512个字节 并且以0xAA55为结束标识的扇区 下面就是那
  • 程序员的自我修养——链接、装载与库

    1 温故而知新 操作系统概念 北桥 连接高速芯片 系统调用接口 以软件中断的方式提供 如Linux使用0x80号中断作为系统调用接口 多任务系统 进程隔离 设备驱动 直接使用物理内存的弊端 地址空间不隔离 内存使用效率低 程序运行的地址不确
  • Linux 内核中的 Device Mapper 机制

    Linux 内核中的 Device Mapper 机制 尹 洋 在读博士生 尹洋 中科院计算所国家高性能计算机工程技术研究中心的在读博士生 主要从事服务部署和存储资源管理以及Linux块设备一级的开发和研究工作 简介 本文结合具体代码对 L
  • 图解五种磁盘调度算法, FCFS, SSTF, SCAN, C-SCAN, LOOK

    一 FCFS 调度 先来先服务 磁盘调度的最简单形式当然是先来先服务 FCFS 算法 虽然这种算法比较公平 但是它通常并不提供最快的服务 例如 考虑一个磁盘队列 其 I O 请求块的柱面的顺序如下 98 183 37 122 14 124
  • gdb attach 进程调试

    gdb调试正在运行的进程 GDB可以对正在执行的程序进行调度 它允许开发人员中断程序 并查看其状态 之后还能让这个程序正常地继续执行 gdb attach xxxxx xxxxx为利用ps命令获得的子进程process
  • 地址映射与共享

    跟踪地址映射过程 1 通过命令 dbg asm启动调试器 在linux 0 11运行test c文件 使其进入死循环 我们的任务就是找到i的地址并将其修改为0使test c程序退出循环 2 在命令行输入crit c使Boch暂停 一般会显示
  • Linux(13):例行性工作排程

    例行性工程 听谓的排程是将工作安排执行的流程之意 Linux 排程就是透过 crontab 与 at 这两个东西 两种工作排程的方式 一种是例行性的 就是每隔一定的周期要来办的事项 一种是突发性的 就是这次做完以后就没有的那一种 at at
  • Linux(12):磁盘配额(Quota)与进阶文件系统管理

    磁盘配额 Quota 的应用与实作 Quota 的一般用途 针对 www server 例如 每个人的网页空间的容量限制 针对 mail server 例如 每个人的邮件空间限制 针对 file server 例如 每个人最大的可用网络硬盘
  • 【操作系统xv6】学习记录4-一级页表与二级页表

    占位

随机推荐

  • MySQL服务无法自启动

    出现问题 之前由于电脑C盘空间不足 我重装了MySQL 但重装后发现MySQL的服务无法开机自启动 每次都需要手动开启服务 系统 Win10家庭版 MySQL 8 0 23 检查 首先查看服务 MySQL80服务的启动类型确定是设置为自动
  • SpringBoot中的双数据源配置

    1 引入使用的数据源类型 mysql oracle sqlserver等 依赖 本文配置为oracel和postgresql
  • Linux ubuntu系统修改终端的设备名称

    创建系统设备名称时默认的太长了吧 终端窗口就那么一点点 改掉改掉 第一步 sudo vi etc hostname 跳出窗口 修改红框中名称即可 改完后 用 wq 保存退出 tips 按a可以从光标后开始输入内容 第二步 sudo vi e
  • Python3面向对象编程总结

    自学笔记 逻辑可能比较混乱 想到哪说到哪 可能存在不少的问题欢迎指出 创建一个类 最简单的一个类 在python中类的命名必须以字母或者下画线开头 并且只能包含字母 下画线和数字 另外推荐使用驼峰命名方式 大写字母开头 随后的任意一个单词都
  • BSC(币安智能链)主网链部署

    文章目录 一 BSC主链镜像生成 二 BSC主链容器生成 2 1 下载BSC主网配置文件 2 2 新建初始化创始区块文件脚本 2 3 本地写入创世状态 2 4 新建BSC链启动脚本 2 5 启动BSC主网链 三 查看BSC服务是否部署成功
  • 力扣hot100刷题记录

    二刷hot100 坚持每天打卡3道题 Today 2023 09 08 1 两数之和 先求差 再查哈希表 public int twoSum int nums int target Map
  • 计算机视觉笔记及资料整理(含图像分割、目标检测)

    前言 1 简单聊聊 在我脑海中我能通过这些年听到的技术名词来感受到技术的更新及趋势 这种技术发展有时候我觉得连关注的脚步都赶不上 简单回顾看看 从我能听到的技术名词来感受 最开始耳闻比较多 云计算 这玩意 后来听到比较多的是 数据挖掘 然而
  • osgEarth的Rex引擎原理分析(十四)分页瓦片加载器子节点的作用

    目标 十二 中的问题21 在rex引擎的setMap中创建了分页瓦片加载器子节点 osgEarthDrivers engine rex RexTerrainEngineNode cpp void RexTerrainEngineNode s
  • 完美解决:由于找不到MSVR100.dll ,无法继续执行代码

    当我们在运行某一个软件时 突然提示找不到MSVCR100 dll 我相信有不少用户都遇到过这种情况 并且在重新安装软件后还是无法解决 那么电脑提示找不到MSVCR100 dll该怎办呢 MSVCR100 dll是什么 在解决找不到MSVCR
  • 【Spring Boot】WebSocket 的 6 种集成方式

    介绍 由于前段时间我实现了一个库 Spring Cloud 一个配置注解实现 WebSocket 集群方案 以至于我对WebSocket的各种集成方式做了一些研究 目前我所了解到的就是下面这些了 就一个破ws都有这么多花里胡哨的集成方式了
  • Linux 中的$* $@特殊变量介绍

    1 代表输入的所有参数 但是看做一个整体 代表输入的所有参数 但是每个区分对待 PS 当 不被双引号括起来的时候 都以 1 2 n的形式输出所有参数 也就是说 当你使用这两个特殊变量的时候 如果不适用双引号括起来 这两个特殊变量的功能就没有
  • Linux alien命令

    一 简介 alien是一个用于在各种不同的Linux包格式相互转换的工具 其最常见的用法是将 rpm转换成 deb 或者反过来 二 安装 http toutiao com a6188997768449360129 三 实例 http www
  • sqlmap参数详解

    命令及详解 h 帮助 version 版本号 d 连接数据库 mysql root root 192 168 3 20 3306 db 数据库种类 账号 密码 地址 端口 库 current db 当前数据库 dbs 列出所有数据库 等于s
  • 软件测试是干什么的 1分钟带你快速了解清楚软测的工作性质

    近几年 国内软件测试行业迅猛发展 不少行外人都能经常听到某某软件测试岗位在高薪招聘消息 等 所以很多不了解情况的人就想要问了 软件测试到底是干什么的 什么样的人才能够当软件测试员 关于大家关心这两个问题 小编特做了如下回答 软件测试是干什么
  • Selenium RemoteWebDriver使用—让你的代码与测试分离(远程测试)

    目录 一 写在前面 二 RemoteWebDriver基本使用 2 1 配置环境 2 2 配置环境命令 2 3 代码示例 三 扩展使用 3 1 浏览器版本和平台参数 3 2 浏览器启动相关参数 一 写在前面 在学习Selenium基础的时候
  • 【实践篇】领域驱动设计:DDD工程参考架构

    背景 为什么要制定参考工程架构 不同团队落地DDD所采取的应用架构风格可能不同 并没有统一的 标准的DDD工程架构 有些团队可能遵循经典的DDD四层架构 或改进的DDD四层架构 有些团队可能综合考虑分层架构 整洁架构 六边形架构等多种架构风
  • Python 常用基础模块(四):sys模块

    目录 一 sys模块介绍 1 1 什么是 Python 解释器 说明 1 2 sys 模块的作用 二 常用方法及属性介绍 2 1 modules属性 将模块名称映射到已加载模块的字典 2 2 getdefaultencoding 方法 获取
  • YOGA 14s开机黑屏——试试提高亮度

    联想yoga 14s 开始动画是有的 但开机动画后就黑屏了 折腾了半天 按下亮度增大键后屏幕亮了 好像联想笔记本比较支持亮度最低即为0
  • 一周简报(项目尾声)

    XX海油项目已经进入尾声 大部分的工作都已经完成 目前我们所做的就是完善系统中的Bug 以及面对客户提出的某些部分的需求变更 由于形式所迫 我们的战斗由 城市 转入 农村 由 地上 转入 地下 由 阵地战 转为 游击战 我们当前的任务是以客
  • 通过源码包*.src.rpm定制开发rpm

    为什么80 的码农都做不了架构师 gt gt gt 1 基本流程 1 下载 安装相应的src rpm包 wget xxx src rpm rpm ivh xxx src rpm 这里的 安装 是指把xxx src rpm中的tar gz p