rpm构建流程

学习链接:

b站马哥: https://www.bilibili.com/video/BV1ai4y1N7gp

RedHat:

https://access.redhat.com/documentation/zh-cn/red_hat_enterprise_linux/8/html/packaging_and_distributing_software/index

小记

#自定义宏命令
rpmbuild -bp xx.spec --define="_topdir /root/rpmbuild"
#查找
yum provides /usr/lib/rpm/redhat/redhat-hardened-ld

#安装
yum install rpmdevtools
#创建rpmbuild文件夹
rpmdev-setuptree
#自定义宏配置
vi .rpmmacros
#查宏配置
rpmbuild --showrc

制作过程

  1. introduction section
  2. prep section |解压,宏,

    %prep

    %setup
  3. build section

    %build
  4. install section

    %install
  5. clean section

    %clean

    rm -rf %{buildroot}
  6. 脚本段 在install之后

    %pre 安装前

    %post 安装后

    %preun 卸载前

    %postun 卸载后

1 install

2 upgrade

0 remove

7. file section

%file

定义文件如何包含进rpm包,包含哪些文件,文件的权限,这些文件被当作什么 %doc %dir %config(noreplace) .rpmnew .orig

主要目录【标准化的工作空间】

  • SOURCES |源码包,Unzip to BUILD
  • SPEC | .spec文件
  • BUILD |解压到该目录
  • BUILDROOT |安装软件后,以该目录为根生成的路径 files[] 把buildroot里有用的部分拿出来,放到rpm里 最后clean会清除 buildroot、build
  • RPMS
  • SRPMS

BuildRequires

制作软件包需要的依赖 gcc binutils

Requires

安装软件包需要的依赖

Tips:

  1. release 指第几次制作,跟version无关

  2. 制作过程:

    rpm build:首先解压SOURCE里的文件到BUILD,在BUILD里生成一个子目录,编译过程会跳到子目录里去执行./config/make,编译之后安装,不是安装到系统上,而是安装到一个临时目录中去,install安装到buildroot目录下,把buildroot目录当作操作系统目录。下一步:file section ,rpm 命令根据file section中列出的文件,把BUILD目录中的那些file文件压缩成rpm包。打包完成后执行clean过程,清除BUILDROOT和BUILD目录。

    BUILDROOT里除了debug的文件,其他的都必须做进rpm包

  3. %prep

    解压到BUILD,cd进去,设置一些环境变量,设置一些宏,为编译做准备

    %setup -q 像是prep的扩展

    -q 静默模式 不显示过程 以最少输出显示

    %patch打补丁

    %setup -q -a 1

    -a 1 ==> unpack source1 after change directory 先cd到build目录下 ?

    -b 2 ==> befor

    -c creat %{BUILD}/%Name-%Version

    -T 不展开 Disable the automatic unpacking of the archives

  4. %build

    ./configure

    --etcdir="%{_sysconfdir}"

    --mandir="%{_mandir}"

    --il8n="0"

    --scrip="0"

    %{_make} %{?_smp_mflags} ==>对称多处理器上,可以加快编译过程

  5. %install

    %{__rm} -rf %{buildroot} 删除之前安装的,没有也不影响

    %{__make} install DESTDIR="%{buildroot}"

    %find_lang %{name}

    在buildroot目录下会生成一堆

    6。 %clean

    %{__rm} -rf %{buildroot}

    清理此前制作过程中的buildroot

    rpmbuild --clean xxx.spec可以执行spec的clean过程

  6. %file

    %defattr(-,root,root,-) 权限

    %doc 文档

    %config %{_sysconfigdir}/axelrc 配置文件

    /usr/local/bin/axel

    %dir 目录

    %conf(noraplace) 指的是新的配置文件是否替换,如果原来的旧的配置没有修改,会替换,修改了,不会替换,会把原来的改成比如xxx.conf.orig,再去生成新的。

    • usr/src下的debug是不用包含进来的
    • %attr(0755, root, root) /etc/rc.d/init.d/nginx %attr表示单个属性,如果不这样写,会继承默认属性 %defattr (-,root,root,-)

      %attr(-,root,-) - ==> 保持原有的
  7. rpmbuild --showrc|grep _tmppath

rpmdev-setuptree命令相当于 mkdir -p ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
#家目录 vi ~/.rpmmacros
%_topdir %(echo `pwd`)/rpmbuild
%{?_smp_flag} ?:有的话就用,没有的话就不用

rpmbuild

  • -ba all ==> bb + bs

  • -bb 表示制作二进制格式的rpm包

  • -bc %build

  • -bp %prep

  • -bi %install

  • -bl check 有多余的文件或者文件没有被放到rpm包里都会error。==>

    Check the listing of filee for the RPM and generate errors if the buildroot is missing any of the file to be installed.

  • -bs 表示制作源码格式的rpm包 src.rpm


rpm常用命令

  • netstat -tnlp 查看端口

  • rpm -ivh xxx.rpm 安装

  • rpm -qi xxx.rpm 查看rpm包信息

  • rpm -e xxx.rpm 卸载

  • rpm -Uvh xxx.rpm 升级

  • rpm2cpio xxx.src.rpm > xxx.cpio 解包

    rpm2cpio xx | cpio -t

    rpm2cpio xx | cpio -id 展开在当前目录下

  • xxx.src.rpm 对源码包rebuild

    rpmbuild --rebuild xxx.src.rpm

  • tar -xf xx.tar -C /var/tmp

    jcf/zcf 压缩

    tar -jcf xxx.tar.bz2 xxx/*

  • lftp ip 一个下载工具,支持很多访问文件的协议:ftp, ftps, http, https, hftp, fish

  • rpm -K |-- checksig 检查签名 所以构建要有数字签名 非对称加密 openssl gpg

    PGP OpenPGP ===> GUN PG

  • 对rpm签名使用gpg命令

    gpg --gen-key

    gpg --list-keys

    gpg --export -a 'xxx' > RPM-GPG-KEY-MAGE 导出公钥

    rpm --addsign xx.rpm 签名

    rpm --import RPM-GPG-KEY-MAGE

    rpm -K xxx.rpm 检查签名rpm --checksig xx.rpm

    rpm -api xxx.rpm Signature 可以看到签名信息

    制作过程中签名

    ~/.rpmmacros

    %_signature gpg

    %_gpg_name MAGE


最好在普通用户下执行rpmbuild,防止spec文件里写一些rm -rf /

spec文件编写

  1. TagName: value

  2. 用户自定义宏

    %define macro_name value

    %{macro_name} %macro_name

  3. # 注释 注释里不能使用% 非要使用的话 %%

  4. 不可省略

    Name

    Version

    Release

    Group ==> /usr/share/doc/rpm-4.11.3/GROUPS

    关于公司

    • Vender

      -URL

      -Package

      License

    Summary

    %description

    -Requires 安装时

    -Provide 能力,未定义则使用Name

    -BuildRequires 编译时

    buildroot 安装时作为假想的根目录 %{}/%{name}-%{version}-%{release} == $RPM_BUILD_ROOT

    Source1: 必须位于SOURCE 可能是链接 但是不会去跟着下载

    Source2:

    ...

    Patch1:

    Patch2:

rpm构建流程学习总结的更多相关文章

  1. [笔记] 基于nvidia/cuda的深度学习基础镜像构建流程 V0.2

    之前的[笔记] 基于nvidia/cuda的深度学习基础镜像构建流程已经Out了,以这篇为准. 基于NVidia官方的nvidia/cuda image,构建适用于Deep Learning的基础im ...

  2. PyTorch如何构建深度学习模型?

    简介 每过一段时间,就会有一个深度学习库被开发,这些深度学习库往往可以改变深度学习领域的景观.Pytorch就是这样一个库. 在过去的一段时间里,我研究了Pytorch,我惊叹于它的操作简易.Pyto ...

  3. webpack前端构建工具学习总结(一)之webpack安装、创建项目

    npm是随nodeJs安装包一起安装的包管理工具,能解决NodeJS代码部署上的很多问题: 常见的使用场景有以下几种: 允许用户从NPM服务器下载别人编写的第三方包到本地使用. 允许用户从NPM服务器 ...

  4. webpack前端构建工具学习总结(二)之loader的使用

    Webpack 本身只能处理 JavaScript 模块,如果要处理其他类型的文件,就需要使用 loader 进行转换. Loader 可以理解为是模块和资源的转换器,它本身是一个函数,接受源文件作为 ...

  5. webpack前端构建工具学习总结(四)之自动化生成项目中的html页面

    接续上文:webpack前端构建工具学习总结(三)之webpack.config.js配置文件 插件的介绍文档:https://www.npmjs.com/package/html-webpack-p ...

  6. rpm的specs学习

    参考 制作rpm包:    https://wangbin.io/blog/it/yum-rpm-make.html linux rpm安装mysql: https://www.jianshu.com ...

  7. Tcp客户端构建流程

    tcp客户端构建流程 tcp的客户端要比服务器端简单很多,如果说服务器端是需要自己买手机.查手机卡.设置铃声.等待别人打电话流程的话,那么客户端就只需要找一个电话亭,拿起电话拨打即可,流程要少很多 示 ...

  8. 廖雪峰Java12maven基础-1maven入门-3构建流程

    maven是一个Java项目管理和构建工具: 标准化项目结构 标准化构建流程(编译.打包.发布) 依赖管理 Maven的构建流程 clean 删除所有编译生成的文件 compile 编译源码.编译测试 ...

  9. webpack的构建流程

    一.运行流程 webpack 的运行流程是一个串行的过程,它的工作流程就是将各个插件串联起来 在运行过程中会广播事件,插件只需要监听它所关心的事件,就能加入到这条webpack机制中,去改变webpa ...

随机推荐

  1. Python入门-分支循环结构

    编写代码的过程中,除了基本的变量,数据类型,在实际开发中,大量代码是根据判断条件,进而选择不同的的向前运行方式. 这些向前的运行方式基本分为两种:分支结构,循环结构 1.分支结构 if单分支结构 # ...

  2. spring-基于注解的aop开发(快速入门)

    步骤: 1.导入坐标 <dependency> <groupId>junit</groupId> <artifactId>junit</artif ...

  3. SpringBoot其他框架-JPA-Hibernate-Swagger

    SpringBoot其他框架 通过了解其他的SpringBoot框架,我们就可以在我们自己的Web服务器上实现更多更高级的功能. 邮件发送:Mail 我们在注册很多的网站时,都会遇到邮件或是手机号验证 ...

  4. drf过滤和排序及异常处理的包装

    过滤和排序(4星) 查询所有才需要过滤(根据过滤条件),排序(按某个规律排序) 使用前提: 必须继承的顶层类是GenericAPIView 内置过滤类 内置过滤类使用,在视图类中配置,是模糊查询 使用 ...

  5. nodejs的tream(流)解析与模拟文件读写流源码实现

    什么是流? 可读流于可写流 双工流于转换流 背压机制与文件流模拟实现 一.什么是流? 关于流的概念早在1964年就有记录被提出了,简单的说"流"就是控制数据传输过程的程序,比如在那 ...

  6. Xml外部实体注入漏洞

    Xml外部实体注入漏洞(XXE) Xml介绍 XML 不是 HTML 的替代. XML 和 HTML 为不同的目的而设计: XML 被设计为传输和存储数据,其焦点是数据的内容. HTML 被设计用来显 ...

  7. javascript中的Ajax基础(一)

    一.手写一个ajax 1 const xhr = new xmlHttpRequest() 2 3 xhr.open(请求方式:post get, 请求地址, 同步或者异步) 4 5 xhr.onre ...

  8. Spring 源码(5)BeanFactory使用的准备及自定义属性值解析器

    BeanFactory 使用前的准备 上一篇文章 https://www.cnblogs.com/redwinter/p/16165878.html 介绍了自定义标签的使用,完成了AbstractAp ...

  9. Day 007:PAT训练--1108 Finding Average (20 分)

    话不多说: 该题要求将给定的所有数分为两类,其中这两类的个数差距最小,且这两类分别的和差距最大. 可以发现,针对第一个要求,个数差距最小,当给定个数为偶数时,二分即差距为0,最小:若给定个数为奇数时, ...

  10. 在GO中调用C源代码#基础篇1

    开坑说明 最近在编写客户端程序或与其他部门做功能集成时多次碰到了跨语言的sdk集成,虽说方案很多诸如rpc啊,管道啊,文件io啊,unix socket啊之类的不要太多,但最完美的基础方式还是让程序与 ...