rpm 包

有两种类型的 RPM 包:

  • 源码RPM (SRPM)
  • 二进制 RPM

SRPM 和二进制 RPM 共享文件格式和工具,但具有不同的内容并用于不同的目的。

一个 SRPM 包含源代码、可选的补丁和一个 SPEC 文件,它描述了如何将源代码构建到二进制 RPM 中。
二进制 RPM 包含从源代码和补丁构建的二进制文件。

1. 构建目录结构

安装必要的 rpms,它将在构建我们的 rpm 的过程中使用

# yum install rpmdevtools rpm-build rpmsign

要设置作为 RPM 打包工作区的目录布局,请使用 rpmdev-setuptree 实用程序

# rpmdev-setuptree

接下来验证目录结构

# tree /tmp/rpmbuild/
/tmp/rpmbuild/
├── BUILD
├── RPMS
├── SOURCES
├── SPECS
└── SRPMS
5 directories, 0 files

现在我们的目录结构已经准备好了,让我们开始准备我们的规范文件spec

2. 创建 SPEC 文件

要详细了解规范文件中使用的各种参数,请点击以下链接

https://docs.fedoraproject.org/quick-docs/en-US/creating-rpm-packages.html

# vim /tmp/rpmbuild/SPECS/jack.spec
Name:                   jack
Summary:                Test Rpm
Version:                1.0.0
Release:                1
Group:                  onitroad
License:                Not Applicable
URL:                    http://www.onitroad.com
SOURCE0:                %{name}-%{version}-%{release}.tar.gz
BuildRoot:              %{_tmppath}/%{name}-%{version}-%{release}-root
%description
This is a test rpm built by jack
%prep
%setup -q
%build
#Empty
%install
rm -rf %{buildroot}
mkdir -p %{buildroot}
cp -a * %{buildroot}
%clean
rm -rf %{buildroot}
%files
%defattr(-,root,root,-)
/test1/file1
/test2/file2
%changelog
* Wed Nov 03 2014 jack Prasad - 1.0.0-1
- Created first draft

3. 创建源目录和内容

现在是时候创建我们想要在安装 rpm 后转储的源目录内容了。

由于这是一个测试 rpm,我将其命名为“jack”,并且我将创建一些虚拟目录和文件,这些目录和文件将成为该 rpm 的一部分。

# cd /tmp

下面将是我们的源目录,基本版本号为 1.0.0

# mkdir jack-1.0.0

接下来让我们创建一些虚拟文件和目录

# mkdir -p jack-1.0.0/test1/file1
# mkdir -p jack-1.0.0/test2/file2

4. 使用源内容创建存档文件

使用计划版本和发布的格式创建具有上述内容的存档,例如我的规范文件包含如下

Version:                1.0.0
Release:                1

所以我的档案名称将是 jack-1.0.0-1.tar.gz

# cd /tmp
# tar -czvf /tmp/rpmbuild/SOURCES/jack-1.0.0-1.tar.gz jack-1.0.0/*

5. 建立 RPM

现在该构建我们的 rpm 了

注意:如果我们在用户主文件夹以外的其他路径中创建了源目录,则 rpmbuild 可能会失败并显示以下错误

# rpmbuild -ba jack.spec
error: File /root/rpmbuild/SOURCES/jack-1.0.0-1.tar.gz: No such file or directory
错误:文件/root/rpmbuild/SOURCES/jack-1.0.0-1.tar.gz:没有那个文件或者目录

按照下面的文章更改 rpmbuild 目录
如何在规范文件(rpmbuild 忽略目录)中更改 rpmbuild (_tmppath) Linux

# rpmbuild -ba /tmp/rpmbuild/SPECS/jack.spec
Executing(%prep): /bin/sh -e /tmp/rpmbuild/tmp/rpm-tmp.p63FqV
+ umask 022
+ cd /tmp/rpmbuild/BUILD
+ cd /tmp/rpmbuild/BUILD
+ rm -rf jack-1.0.0
+ /usr/bin/gzip -dc /tmp/rpmbuild/SOURCES/jack-1.0.0-1.tar.gz
+ /usr/bin/tar -xf 
+ STATUS=0
+ '[' 0 -ne 0 ']'
+ cd jack-1.0.0
+ /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w .
+ exit 0
Executing(%build): /bin/sh -e /tmp/rpmbuild/tmp/rpm-tmp.Oekwnu
+ umask 022
+ cd /tmp/rpmbuild/BUILD
+ cd jack-1.0.0
+ exit 0
Executing(%install): /bin/sh -e /tmp/rpmbuild/tmp/rpm-tmp.My9Zk3
+ umask 022
+ cd /tmp/rpmbuild/BUILD
+ '[' /tmp/rpmbuild/BUILDROOT/jack-1.0.0-1.x86_64 '!='/']'
+ rm -rf /tmp/rpmbuild/BUILDROOT/jack-1.0.0-1.x86_64
++ dirname /tmp/rpmbuild/BUILDROOT/jack-1.0.0-1.x86_64
+ mkdir -p /tmp/rpmbuild/BUILDROOT
+ mkdir /tmp/rpmbuild/BUILDROOT/jack-1.0.0-1.x86_64
+ cd jack-1.0.0
+ rm -rf /tmp/rpmbuild/BUILDROOT/jack-1.0.0-1.x86_64
+ mkdir -p /tmp/rpmbuild/BUILDROOT/jack-1.0.0-1.x86_64
+ cp -a test1 test2 /tmp/rpmbuild/BUILDROOT/jack-1.0.0-1.x86_64
+ /usr/lib/rpm/find-debuginfo.sh --strict-build-id -m --run-dwz --dwz-low-mem-die-limit 10000000 --dwz-max-die-limit 110000000 /tmp/rpmbuild/BUILD/jack-1.0.0
/usr/lib/rpm/sepdebugcrcfix: Updated 0 CRC32s, 0 CRC32s did match.
+ /usr/lib/rpm/check-buildroot
+ /usr/lib/rpm/redhat/brp-compress
+ /usr/lib/rpm/redhat/brp-strip-static-archive /usr/bin/strip
+ /usr/lib/rpm/brp-python-bytecompile /usr/bin/python 1
+ /usr/lib/rpm/redhat/brp-python-hardlink
+ /usr/lib/rpm/redhat/brp-java-repack-jars
Processing files: jack-1.0.0-1.x86_64
Provides: jack = 1.0.0-1 jack(x86-64) = 1.0.0-1
Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1
Processing files: jack-debuginfo-1.0.0-1.x86_64
Provides: jack-debuginfo = 1.0.0-1 jack-debuginfo(x86-64) = 1.0.0-1
Requires(rpmlib): rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1 rpmlib(CompressedFileNames) <= 3.0.4-1
Checking for unpackaged file(s): /usr/lib/rpm/check-files /tmp/rpmbuild/BUILDROOT/jack-1.0.0-1.x86_64
Wrote: /tmp/rpmbuild/SRPMS/jack-1.0.0-1.src.rpm
Wrote: /tmp/rpmbuild/RPMS/x86_64/jack-1.0.0-1.x86_64.rpm
Wrote: /tmp/rpmbuild/RPMS/x86_64/jack-debuginfo-1.0.0-1.x86_64.rpm
Executing(%clean): /bin/sh -e /tmp/rpmbuild/tmp/rpm-tmp.OipO2Y
+ umask 022
+ cd /tmp/rpmbuild/BUILD
+ cd jack-1.0.0
+ rm -rf /tmp/rpmbuild/BUILDROOT/jack-1.0.0-1.x86_64
+ exit 0

如果一切顺利,我们的 rpm 将位于

/tmp/rpmbuild/RPMS/x86_64/jack-1.0.0-1.x86_64.rpm

让我们检查一下我们的 rpm 的内容

# rpm -qlp /tmp/rpmbuild/RPMS/x86_64/jack-1.0.0-1.x86_64.rpm
/test1/file1
/test2/file2

6. 将密钥签名到 rpm

查看我们的教程:如何在 Linux 中使用 gpg 密钥(密码或者无密码)将密钥签名到 rpm

7.安装并验证rpm

安装rpm的时间

# rpm -ivh /tmp/rpmbuild/RPMS/x86_64/jack-1.0.0-1.x86_64.rpm
Preparing...                          ################################# [100%]
Updating/installing...
   1:jack-1.0.0-1                   ################################# [100%]

下面的命令将再次告诉我们 rpm 的内容

# rpm -ql jack
/test1/file1
/test2/file2

下面的命令将查询并提供有关我们的 rpm 的更多信息

# rpm -qpi /tmp/rpmbuild/RPMS/x86_64/jack-1.0.0-1.x86_64.rpm
Name        : jack
Version     : 1.0.0
Release     : 1
Architecture: x86_64
Install Date: (not installed)
Group       : onitroad
Size        : 0
License     : Not Applicable
Signature   : (none)
Source RPM  : jack-1.0.0-1.src.rpm
Build Date  : Sat 12 Jan 2015 11:50:43 PM IST
Build Host  : onitroad-server.example
Relocations : (not relocatable)
URL         : http://www.onitroad.com
Summary     : Test Rpm
Description :
This is a test rpm built by jack
Red Hat Linux如何通过源码构建rpm安装包

在这篇教程中,我们将详细解释了rpm的每个字段。

日期:2020-06-02 22:16:47 来源:oir作者:oir