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包,可以用来测试
补充:
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)。
本文来自博客园,作者:赛博狗尾草,转载请注明原文链接:https://www.cnblogs.com/gpysir/p/18818998