rpm包结构介绍和打包解包

rpm包介绍

是 Red Hat 系列 Linux 发行版(如 CentOS、RHEL、Fedora 等)中用于软件管理的一种包格式,两种包结构介绍

1、二进制 RPM 包的结构

二进制 RPM 包是最终安装到系统中的软件包形式,它主要由以下几个部分组成:

包头(Header):

元数据:包含软件包的基本信息,如软件包名称、版本号等,这些信息在安装软件包时用于识别和展示软件包的相关信息。

依赖关系:记录该软件包运行时所依赖的其他软件包。

文件列表:列出软件包安装到系统中的所有文件,包括文件的路径、权限、所有者、所属组等信息。

签名信息:用于验证软件包的来源和完整性

包体(Payload):

实际文件:包含软件的可执行文件、共享库文件、配置文件、文档文件等。这些文件在安装时会被解压并复制到系统的相应目录中。

2、源代码 RPM 包(SRPM)的结构

源代码 RPM 包主要用于重新构建二进制 RPM 包,它包含了软件的源代码和构建软件包所需的元数据及配置文件。SRPM 包的结构如下:

包头(Header):与二进制 RPM 包的包头类似,包含软件包的基本信息、依赖关系等元数据。

包体(Payload):

软件源代码:通常是软件的原始源代码压缩包(如 .tar.gz、.tar.bz2 等格式),以及可能的补丁文件(.patch 格式)。补丁文件用于对源代码进行修改和定制,以适应特定的系统环境或添加特定的功能。

SPEC 文件:这是构建 RPM 包的核心配置文件,它详细描述了如何构建软件包,包括软件包的元数据定义、源代码解压和配置步骤、编译和安装命令、文件列表定义、包的依赖关系等。通过修改 SPEC 文件,可以对软件包的构建过程进行定制。

如图,分别列出lrzsz二进制包和源码包的文件结构,二进制包安装后,直接执行二进制程序,rpm源码包需要编译生成rpm后才能使用

rpm包构建

使用源码包,构建rpm包和src.rpm包

准备工作

yum install rpm-build

创建目录

mkdir -pv ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS} #使用默认路径

补充:安装rpmdevtools套件,使用套件下工具直接生成

 

下载示例源码,拷贝到~/rpmbuild/SOURCES/

$ wget http://ftp.gnu.org/gnu/hello/hello-2.10.tar.gz -O ~/rpmbuild/SOURCES/

cp hello-2.10.tar.gz   ~/rpmbuild/SOURCES/

 

编写规则文件

vim ~/rpmbuild/SPECS/hello.spec

hello.spec模版

cat  ~/rpmbuild/SPECS/hello.spec
Name:     hello
Version:  2.10
Release:  1%{?dist}
Summary:  The "Hello World" program from GNU
Summary(zh_CN):  GNU "Hello World" 程序
License:  GPLv3+
URL:      http://ftp.gnu.org/gnu/hello
Source0:  http://ftp.gnu.org/gnu/hello/%{name}-%{version}.tar.gz
 
BuildRequires:  gettext
Requires(post): info
Requires(preun): info
 
%description
The "Hello World" program, done with all bells and whistles of a proper FOSS
project, including configuration, build, internationalization, help files, etc.
 
%description -l zh_CN
"Hello World" 程序, 包含 FOSS 项目所需的所有部分, 包括配置, 构建, 国际化, 帮助文件等.
 
%prep
%setup -q
 
%build
%configure
make %{?_smp_mflags}
 
%install
make install DESTDIR=%{buildroot}
%find_lang %{name}
rm -f %{buildroot}/%{_infodir}/dir
 
%post
/sbin/install-info %{_infodir}/%{name}.info %{_infodir}/dir || :
 
%preun
if [ $1 = 0 ] ; then
/sbin/install-info --delete %{_infodir}/%{name}.info %{_infodir}/dir || :
fi
 
%files -f %{name}.lang
%doc AUTHORS ChangeLog NEWS README THANKS TODO
%license COPYING
%{_mandir}/man1/hello.1.*
%{_infodir}/hello.info.*
%{_bindir}/hello
 
%changelog
* Sun Dec 4 2016 Your Name <youremail@xxx.xxx> - 2.10-1
- Update to 2.10
* Sat Dec 3 2016 Your Name <youremail@xxx.xxx> - 2.9-1
- Update to 2.9

 

同时构建rpm和src.rpm包

$ rpmbuild -ba hello.spec

 

查看生成的rpm和src.rpm包

$ tree ~/rpmbuild/

如图,rpmbuild目录部分结构,需要关注的是RPMS/x86_64下的rpm包,和SRPMS下的src.rpm包

安装测试

$ rpm -ivh ~/rpmbuild/RPMS/x86_64/hello-2.10-1.x86_64.rpm

$ hello

Hello, world!

$ which hello

/usr/bin/hello

$ rpm -qf `which hello`

hello-2.10-1.el7.centos.x86_64

 

参考:

https://blog.csdn.net/qq_16542775/article/details/80961213

 

补充内容

补充:

如果网站提供了src.rpm包,可以使用src.rpm包构建rpm包

安装rpm -ivh lrzsz-0.12.20-46.oe1.src.rpm

会在在当前用户家用户生成rpmbuild目录

构建二进制rpm包

rpmbuild -bb ~/rpmbuild/SPECS/ lrzsz.spec

没有报错,会生成rpm包

~/rpmbuild/RPMS/x86_64/lrzsz-0.12.20-46.x86_64.rpm

安装测试rpm -ivh lrzsz-0.12.20-46.x86_64.rpm

如一个编写好的src.rpm包,可以用来测试

https://dl-cdn.openeuler.openatom.cn/openEuler-20.03-LTS-SP3//source/Packages/lrzsz-0.12.20-46.oe1.src.rpm

 

补充:

yum install rpmdevtools  #工具套件,除了rpm-build,还有一些拓展工具

#%_topdir %(echo $HOME)/rpmbuild #这个可以自定义打包路径

 

补充:

清理构建环境

使用 -bc 选项可以只执行构建阶段,使用 -bi 选项可以只执行安装阶段,使用 -bp 选项可以只执行准备阶段。

如果要清理构建过程中产生的临时文件,可以使用 -bc --clean 选项:

rpmbuild -bc --clean ~/rpmbuild/SPECS/example.spec

单独构建src.rpm包

rpmbuild -bs ~/rpmbuild/SPECS/example.spec

单独构建rpm二进制包

rpmbuild -bb ~/rpmbuild/SPECS/example.spec

 

补充:

mkdir -p ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}

各目录的作用如下:

BUILD:用于存放源代码解压后进行编译的目录。

RPMS:存放构建好的二进制 RPM 包。

SOURCES:存放软件的源代码文件(如 .tar.gz 格式的压缩包)。

SPECS:存放 RPM 包的 SPEC 文件,该文件描述了如何构建 RPM 包。

SRPMS:存放构建好的源代码 RPM 包(SRPM)。

posted on 2025-04-10 17:22  赛博狗尾草  阅读(326)  评论(0)    收藏  举报

导航