## 1.概述
RPM(Redhat Package Manager)是用于Redhat、CentOS、Fedora等Linux 分发版(distribution)的常见的软件包管理器。
## 2.环境准备
```
// RPM打包使用的是rpmbuild,这个包必装
yum install rpm-build
yum install rpmdevtools
// rpmdev-setuptree 命令可以自动生成编译打包的工作空间rpmbuild,手动创建也可
//根据软件的不同,选择安装其他编译打包等工具
```
## 3.原理
**目录结构说明**
<table>
<thead>
<tr>
<th>默认位置</th>
<th>宏代码</th>
<th>名称</th>
<th>用途</th>
</tr>
</thead>
<tbody>
<tr>
<td>~/rpmbuild/SPECS</td>
<td>%_specdir</td>
<td>Spec 文件目录</td>
<td>保存 RPM 包配置(.spec)文件</td>
</tr>
<tr>
<td>~/rpmbuild/SOURCES</td>
<td>%_sourcedir</td>
<td>源代码目录</td>
<td>保存源码包(如 .tar 包)和所有 patch 补丁</td>
</tr>
<tr>
<td>~/rpmbuild/BUILD</td>
<td>%_builddir</td>
<td>构建目录</td>
<td>源码包被解压至此,并在该目录的子目录完成编译</td>
</tr>
<tr>
<td>~/rpmbuild/BUILDROOT</td>
<td>%_buildrootdir</td>
<td>最终安装目录</td>
<td>保存 %install 阶段安装的文件</td>
</tr>
<tr>
<td>~/rpmbuild/RPMS</td>
<td>%_rpmdir</td>
<td>标准 RPM 包目录</td>
<td>生成/保存二进制 RPM 包</td>
</tr>
<tr>
<td>~/rpmbuild/SRPMS</td>
<td>%_srcrpmdir</td>
<td>源代码 RPM 包目录</td>
<td>生成/保存源码 RPM 包(SRPM)</td>
</tr>
</tbody>
</table>
<br>
SPECS目录下是RPM包的配置文件,该文件会告诉`rpmbuild`命令如何打包。`宏代码`在该文件中代指对应的目录。
<br>
<br>
**打包过程说明**
* 首先,需要把源码放到`%\_sourcedir`中;
* 然后进行编译,编译是在`%\_builddir`中完成的,需要将源码复制到该目录下。
* 把软件包应该包含的内容(比如二进制文件、配置文件、man文档等)复制到`%_buildrootdir`中,并按照实际安装后的目录结构组装,比如二进制命令可能会放在`/usr/bin`下,那么就在`%_buildrootdir`下也按照同样的目录结构放置;
* 需要配置一些必要的工作,比如在实际安装前的准备啦,安装后的清理啦,以及在卸载前后要做的工作啦等等,这样也都是通过配置在SPEC文件中来告诉`rpmbuild`命令;
* 还有一步可选操作,那就是检查软件是否正常运行;
* 最后,生成的RPM包放置到`%_rpmdir`,源码包放置到`%_srpmdir`下。
<table>
<thead>
<tr>
<th>阶段</th>
<th>读取的目录</th>
<th>写入的目录</th>
<th>具体动作</th>
</tr>
</thead>
<tbody>
<tr>
<td>%prep</td>
<td>%_sourcedir</td>
<td>%_builddir</td>
<td>读取位于 %_sourcedir 目录的源代码和 patch 。之后,解压源代码至 %_builddir 的子目录并应用所有 patch。</td>
</tr>
<tr>
<td>%build</td>
<td>%_builddir</td>
<td>%_builddir</td>
<td>编译位于 %_builddir 构建目录下的文件。通过执行类似 ./configure && make 的命令实现。</td>
</tr>
<tr>
<td>%install</td>
<td>%_builddir</td>
<td>%_buildrootdir</td>
<td>读取位于 %_builddir 构建目录下的文件并将其安装至 %_buildrootdir 目录。这些文件就是用户安装 RPM 后,最终得到的文件。注意一个奇怪的地方: 最终安装目录 不是 构建目录。通过执行类似 make install 的命令实现。</td>
</tr>
<tr>
<td>%check</td>
<td>%_builddir</td>
<td>%_builddir</td>
<td>检查软件是否正常运行。通过执行类似 make test 的命令实现。很多软件包都不需要此步。</td>
</tr>
<tr>
<td>bin</td>
<td>%_buildrootdir</td>
<td>%_rpmdir</td>
<td>读取位于 %_buildrootdir 最终安装目录下的文件,以便最终在 %_rpmdir 目录下创建 RPM 包。在该目录下,不同架构的 RPM 包会分别保存至不同子目录, noarch 目录保存适用于所有架构的 RPM 包。这些 RPM 文件就是用户最终安装的 RPM 包。</td>
</tr>
<tr>
<td>src</td>
<td>%_sourcedir</td>
<td>%_srcrpmdir</td>
<td>创建源码 RPM 包(简称 SRPM,以.src.rpm 作为后缀名),并保存至 %_srcrpmdir 目录。SRPM 包通常用于审核和升级软件包。</td>
</tr>
</tbody>
</table>
- Golang
- 基础知识
- 基本数据类型
- 运算符
- 变量&常量
- 流程控制
- 数组
- 切片
- string操作
- Map及实现原理
- Go其他
- CLI命令
- Golang内置类型和函数
- init函数和main函数
- 网络编程
- 互联网协议
- socket编程
- 单元测试
- 并发编程
- channel
- 优雅地关闭channel
- Mutex
- GMP原理与调度
- Go Web
- HTTP Server
- gin框架
- 快速入门
- HTML渲染
- JSONP
- Multipart/Urlencoded绑定
- PureJSON
- gin路由
- beego框架
- Bee工具安装
- 配置模块
- Web模块
- 路由
- 数据操作
- Go操作Mysql数据库
- Go操作redis
- mongo-driver
- sqlx库
- 操作etcd
- msgpack
- 网络爬虫
- 获取页面
- 标准库
- IO操作
- 文件操作
- fmt
- 格式化输出
- flag
- log
- time
- strconv
- template
- os
- sync.Mutex
- Context
- 第三方库
- zap库
- viper
- validator参数校验
- GORM
- 基础
- CRUD接口
- INI
- GoFrame
- 快速开始
- 微服务
- go-kit
- gRPC
- Protocol Buffers 语法指南
- go-zero
- 相关名词解释
- 数据结构和算法
- 基础知识
- 链表
- Golang GUI
- fyne基础
- 显示时间
- RabbitMQ-Go
- centos7 安装rabbitmq-server
- RabbitMQ介绍
- 工作队列
- Go设计模式
- 设计模式的分类
- 简单工厂模式
- golang自举编译
- 了解sync.Once
- 知识碎片
- 常见问题
- 开源项目
- Anaconda
- 介绍、使用教程
- Python
- Python基础知识
- Python之禅
- 变量和类型
- 流程控制
- Python运维
- 基础语法
- Python内置工具
- 包管理工具pip
- 小爬虫笔记
- I/O操作
- requests库
- requests基本使用
- BeautifulSoup库
- BeautifulSoup基本使用
- 数据可视化
- Django
- Django起步
- OpenCV
- OpenCV入门
- 前端
- HTML
- CSS
- CSS权重计算
- Javascript
- 基础
- JS基础知识
- 监听事件
- 字符串操作
- 数组操作
- 输入输出
- 定时器
- 样式操作
- 获取url参数
- Typescript
- Pick 与 Omit TS内置类型
- Vue.js
- Vue.js介绍
- Vue.js基础
- Vue指令
- v-model
- v-for
- 指令修饰符
- Q&A
- 命令
- Vue3
- node.js
- node.js基础
- npm遇到的问题
- 相关工具安装
- nvm使用教程
- 工程化webpack
- Linux
- Linux基础
- 符号链接
- Shell
- 脚本执行中的问题
- tcpdump
- 正则表达式
- Elasticsearch
- Docker
- Docker的基础概念与操作
- Docker 安装
- 容器技术原理
- Docker核心概念
- Docker基本操作
- 镜像相关操作
- 容器相关操作
- 镜像加速器
- Dockerfile
- Docker所遇问题
- ansible
- k8s
- 安装工具
- kubectl
- Git
- gitlab
- gitlab备份与恢复
- gitlab基本使用
- git使用
- git常用命令
- git提交问题
- git提交规范
- 数据库
- MySQL
- MySQL介绍
- mariadb安装
- 主主复制
- 数据库问题集结
- 开启binlog
- MySQL常用命令
- SQL总结
- MySQL性能优化系列
- 第一章 初始化安装和简单安全加固
- MySQL配置模板
- Redis
- Redis简单使用
- Redis常见问题
- Redis集群
- Redis Cluster概述
- 数据分布
- 搭建集群
- MongoDB
- mongodb分片
- TiDB
- 单机模拟部署生产环境集群
- 服务器
- CentOS
- 配置阿里云的yum源和epel源
- centos7 实现NFS文件共享
- rsync
- centos7 源码编译rsync
- rsync实现文件同步
- 添加删除swap分区
- 清除buff/cache
- 配置ntp时间同步
- centos7安装pip
- centos7虚拟机启动报xfs错误
- centos7常用命令
- centos7安装mysql
- centos7安装python3.x
- centos7升级gcc、g++
- centos7安装nginx
- centos7部署Nexus
- centos7离线安装python3
- centos7.6编译mariadb10.5.22
- CentOS8
- 银河麒麟V4
- nginx编译
- 银河麒麟V10_x86
- 安装VNC
- 单用户模式
- UOS
- 配置本地apt源
- apt安装vnc-server
- UOS单用户模式
- UOS创建自启动脚本
- 源码编译
- oniguruma编译
- Proxmox VE
- PVE基本使用
- PVE故障
- KVM
- KVM相关命令
- 银河麒麟V10_x86安装kvm
- UOS_arm64安装kvm
- yum、rpm、apt
- dpkg、apt-get、yum和rpm的区别
- rpm打包
- yum相关问题
- 内建银河麒麟的apt源
- 其他软件
- JuiceFS
- nacos
- 常见命令
- 硬盘分区
- Linux常见问题
- 其他
- Cloc代码统计工具
- onlyoffice 在线文档编辑
- onlyoffice添加中文字体
- 遇到的问题
- 网络通信协议
- 部署相关记录
- Vmware workstation虚拟机迁移到PVE指南
- 小操作