## 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
- 知識碎片
- 常見問題
- 開源項目
- Python
- Anaconda
- 介紹、使用教程
- Python基礎知識
- Python之禪
- 變量和類型
- 流程控制
- Python運維
- Python內置工具
- 命令行工具
- 包管理工具pip
- 小爬蟲筆記
- I/O操作
- requests庫
- requests基本使用
- BeautifulSoup庫
- BeautifulSoup基本使用
- Scrapy框架
- 數據可視化
- 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
- COPY復制文件
- Docker所遇問題
- ansible
- ansible入門
- k8s
- 安裝工具
- kubectl
- Git
- gitlab
- gitlab備份與恢復
- gitlab基本使用
- git使用
- git常用命令
- git提交問題
- git提交規范
- 數據庫
- MySQL
- MySQL介紹
- mariadb安裝
- 主主復制
- 數據庫問題集結
- 開啟binlog
- MySQL常用命令
- SQL總結
- MySQL性能優化系列
- 第一章 初始化安裝和簡單安全加固
- 第二章 認識performance_schema
- 第三章 MySQL體系結構
- MySQL配置模板
- Redis
- Redis簡單使用
- Redis常見問題
- Redis集群
- Redis Cluster概述
- 數據分布
- 搭建集群
- MongoDB
- 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常見問題
- 測試
- sysbench
- 其他
- Cloc代碼統計工具
- onlyoffice 在線文檔編輯
- onlyoffice添加中文字體
- 遇到的問題
- 網絡通信協議
- 部署相關記錄
- Vmware workstation虛擬機遷移到PVE指南
- 小操作