RPM(Redhat Package Manager)是用于Redhat、CentOS、Fedora等Linux分发版(distribution)常见的软件包管理器。国产操作系统的中标麒麟同样使用RPM包管理工具。
本文以 hello world 程序为例,介绍RPM软件打包流程,最后总结常用的RPM包安装、查询、卸载等命令。
1. 环境准备
1.1 安装RPM打包工具
准备Linux环境,如CentOS。安装RPM打包工具rpmdevtools:
yum install rpmdevtools
1.2 创建RPM打包路径
RPM打包需要一个标准化的“工作空间”,在此空间下可以完成源码编译、打包、虚拟安装、清理等工作。创建标准化“工作空间”的命令为:
rpmdev-setuptree
执行完上述命令就可以在$HOME
家目录下看到其创建的rpmbuild
文件夹,文件夹下的目录结构为:
|-- rpmbuild
|-- BUILD
|-- BUILDROOT
|-- RPMS
|-- SOURCES
|-- SPECS
|-- SRPMS
文件夹说明:
目录 | 用途 | macros中的宏 |
---|---|---|
SOURCES | 存放源码包(如.tar.gz包)和patch补丁 | %_sourcedir |
SPECS | 存放用于生成RPM包的配置文件(.spec) | %_specdir |
BUILD | 源码包的解压路径,并在该目录下进行编译 | %_builddir |
BUILDROOT | 编译后生成的软件临时安装目录 | %_buildrootdir |
RPMS | 存放生成的RPM包(以.rpm作为后缀) | %_rpmdir |
SRPMS | 存放生成的源码RPM包(以.src.rpm作为后缀) | %_srcrpmdir |
注:SPECS下包含RPM包的配置文件,通过.spec文件控制rpmbuild进行打包,其中的macros会按照一系列预定的规则替换一定的文本模式,macros宏文件的路径位于/usr/lib/rpm/macros中。
2. RPM打包流程
环境准备完成后,接下来以 hello world 为例,介绍如何通过源码编译的方式将其生成可执行文件并进行打包、安装、卸载。
2.1 SOURCE文件夹下准备源码/文件
在 SOURCE 文件加下创建文件夹 hello-1.0,这里的命名格式一般为 Name-Version
,在该文件夹下创建 hello.c 文件如下
/* Hello world program*/
#include <stdio.h>
int main() {
printf("Hello, World\n");
return 0;
}
在 SOURCE 文件夹下将 hello-1.0 文件夹打包为 .tar.gz 格式:
tar -zcvf hello-1.0.tar.gz hello-1.0/
2.2 SPEC文件夹下编辑spec文件
spec 的英文全称为 specification (规范,说明书),通过 spec 文件控制打包过程,spec 文件命名格式可以为 Name-Version.spec
,直接通过 vi 创建 .spec 文件会直接出现待填充控制信息的模板,如果没有则需手动创建文件并填写内容。这里创建并填写的 hello.spec
文件如下:
Name: hello
Version: 1.0
Release: 1%{?dist}
Summary: This is Hello world rpm package.
Group: Application/Engineering
License: GPL
Source: %{name}-%{version}.tar.gz
%description
This is the hello world software!
%prep
%setup -q
%build
%define debug_package %{nil}
gcc -o hello hello.c
%install
mkdir -p %{buildroot}/usr/local/bin
install -m 755 hello %{buildroot}/usr/local/bin/hello
%clean
%files
/usr/local/bin/hello
%changelog
* Thu Oct 15 2020 WonderThink <your_email@email.com>
- Create hello rpm.
spec文件参数说明:
参数 | 说明 |
---|---|
Name | 软件包的名称 |
Version | 软件包的版本号 |
Release | 发布序列号,标明第几次打包 |
Summary | 软件包的内容摘要 |
License | 授权方式,如GPL、BSD等 |
Source | 源代码包,可以用Source1、Source2等表示多个源,用%{source1}、%{source2}引用 |
URL | 软件的主页 |
BuildArch | 目标处理器架构,不添加该参数则按本机默认配置,如果设置BuildArch: noarch表明该rpm包与架构无关 |
Group | 软件包所属类别(下表是具体类别) |
Group软件包的标准分组具体类别有:
Group | 说明 |
---|---|
Amusements/Games | 娱乐/游戏 |
Amusements/Graphics | 娱乐/图形 |
Applications/Archiving | 应用/文档 |
Applications/Communications | 应用/通讯 |
Applications/Databases | 应用/数据库 |
Applications/Editors | 应用/编辑器 |
Applications/Emulators | 应用/仿真器 |
Applications/Engineering | 应用/工程 |
Applications/File | 应用/文件 |
Applications/Internet | 应用/因特网 |
Applications/Multimedia | 应用/多媒体 |
Applications/Productivity | 应用/产品 |
Applications/Publishing | 应用/印刷 |
Applications/System | 应用/系统 |
Applications/Text | 应用/文本 |
Development/Debuggers | 开发/调试器 |
Development/Languages | 开发/语言 |
Development/Libraries | 开发/函数库 |
Development/System | 开发/系统 |
Development/Tools | 开发/工具 |
Documentation | 文档 |
System Environment/Base | 系统环境/基础 |
System Environment/Daemons | 系统环境/守护 |
System Environment/Kernel | 系统环境/内核 |
System Environment/Libraries | 系统环境/函数库 |
System Environment/Shells | 系统环境/接口 |
User Interface/Desktops | 用户界面/桌面 |
User Interface/X | 用户界面/X窗口 |
User Interface/X Hardware Support | 用户界面/X硬件支持 |
下面的是打包的具体阶段:
阶段 | 描述 |
---|---|
%prep | 预处理阶段,通常执行解开一些源程序包的命令 |
%setup | 把源码包解压并放好,%setup -q 在安静模式下且最少输出,通常是从/usr/src/asianux/SOURCES里的包解压到/usr/src/asianux/BUILD/%{name}-%{version} |
%build | 编译源码,执行编译代码/脚本 |
%install | 把软件安装到虚拟的根目录中 |
%clean | 清除编译和安装时生成的临时文件 |
%preun | rpm卸载前执行的脚本 |
%files | 用于定义构成软件包的文件列表,定义哪些文件或目录会放入rpm中,还可定义文件存取权限,拥有者及组别。 |
%changelog | 变更日志,格式为 * 星期月日 年 修改人 电子信箱,- 修改了什么地方。其中:星期、月份均用英文形式的前3个字母 |
执行rpmbuild -bb hello-1.0.spec
,在SOURCE目录下生成了 rpm 安装包。
rpmbuild打包命令介绍:
rpmbuild -bb xxx.spec # 只生成二进制包(以.rpm为后缀)
rpmbuild -bs xxx.spec # 生成源码包(以.src.rpm为后缀)
rpmbuild -ba xxx.spec # 生成源码包和二进制包
3. rpm安装、卸载等命令
安装:
rpm -i xxx.rpm # 安装rpm包
rpm -iv xxx.rpm # 安装rpm包,并在安装过程中显示正在安装的文件信息
rpm -ivh xxx.rpm # 安装rpm包,并在安装过程中显示正在安装的文件信息及安装进度
rpm -Uvh xxx.rpm # 升级rpm包
查询已安装的rpm包:
rpm -q xxx # 查询xxx安装包
附加查询命令:
-a, --all 查询所有安装的包
-l, --list 列出该包的文件
-i 展示包的信息,包括名字,版本及描述
卸载:
rpm -q xxx # 查询待卸载的安装包名
rpm -e xxxxx # 卸载xxxxx安装包
解包:
rpm2cpio xxx.rpm | cpio -idv # 提取rpm包的内容