创建 RPM 包:CentOS 7 制作 OpenSSH 8.4 RPM 包

本文详细介绍了如何在 CentOS 7 上创建 OpenSSH 8.4 的 RPM 包。从 RPM 包管理器的简介开始,讲解了构建 RPM 的理论知识,包括规划、收集软件、创建可复制版本、定义依赖关系等步骤。接着,文章深入到实际操作,包括设置目录结构、创建 spec 文件、构建 RPM、验证 RPM 以及测试安装流程。最后,提供了 RPM 下载链接,帮助读者实践整个过程。
摘要由CSDN通过智能技术生成

RPM 简介

RPM包管理器(RPM Package Manager,RPM)是一个功能强大的包管理系统,它能够:

  • 将计算机软件从源代码构建为易于分发的软件包
  • 安装、更新和卸载套装软件
  • 查询有关打包软件的详细信息,无论是否已安装
  • 验证打包软件的完整性以及由此产生的软件安装

理论先行

准备构建 RPM

规划需要构建的内容

在这一步,需要知道要将哪些内容打包成 RPM,是应用程序或补丁、编程库、系统配置文件或者是文档包?大多数情况下,我们需要创建一个源码包( source package)和一个二进制包(binary package)。二进制包包含可以在其它系统安装的 RPM,源码包可以随时重新创建二进制包,前提是已经定义了源 RPM(source RPM)。

收集要打包的软件

收集要捆绑到 RPM 中的软件,这包括应用程序或要打包的库以及程序源代码。一般来说包含以下情况:

  • 打包自己的软件
  • 打包别人的软件
  • 在第一次定制或修补软件后打包其他人的东西

创建软件的可复制版本

RPM 系统将自动执行创建应用程序的步骤,只要您配置 RPM 使用适当的步骤,例如使目标运行。不幸的是,配置适当的步骤并不总是容易的。因此,在尝试创建RPM之前,您需要弄清楚如何构建您计划打包到RPM中的应用程序或库。一旦您弄清楚如何构建应用程序或库,您可以设置可重复生成。然后,RPM系统可以自动执行此操作建立。

要构建软件,您需要使用各种Linux工具。您需要的特定工具很大程度上取决于原始软件的来源。了解这些软件的常用技术如下:

  • 拆包软件,包括 tar、tar.gz、zip 等

  • 阅读 README 文件,包括 README 文件可能的变体,INSTALL 及其变体文件

  • 适用 Linux 构建工具构建程序,通常在 Linux,我们可能使用 make 工具,但前提是需要创建正确的 Makefile 文件,通常有以下几种方法:

    • 手段创建,下载一个程序并找到这样的文件如 Makefile.amiga、Makefile.Solaris 和 Makafile.Linux,然后根据系统架构复制为 Makefile

    • imake,使用 ImakeFile 的配置文件,应用于基于 X Window 应用程序或操作系统,并大多数情况下自带通用构建脚本:

      # 找到 ImakeFile 文件后,运行下面的命令来构建程序
      xmkmf
      make 
      make install
      # xmkmf 是用于创建 Makefile 文件的脚本
      # 如果 xmkmf 不可用或者不起作用,可能需要执行下面的命令
      make Makefile
      # 存在多个源代码目录时,可以执行
      make Makefiles
      # 了解更多:http://www.dubois.ws/software/imake-stuff/
      
    • 配置脚本,configure 脚本输出一个特定于平台的 Makefile

      # 如果在源文件中看到一个名为 configure 的文件,运行下面的命令来构建程序
      ./configure
      make
      make install
      # configure 脚本由一组工具(包括 automake 和 autoconf)创建
      # 这些工具使用通常名为 configure.in 和 makefile.am 的通用文件以及其他文件来创建通用配置脚本
      # 通常情况下 configure 需要接收参数,比如 --prefix,用来指定构建应用程序的根目录
      # 更多: https://www.airs.com/ian/configure/
      
    • 构建 Perl 模块

      # 如果在源码中看到一个 Makefile.PL 的文件,需要运行这些命令来构建应用程序或模块
      perl Makefile.PL
      make
      make test
      make install
      

规划升级

以 RPM 格式打包的任何应用程序或库都可能在某个时候得到升级。当这种情况发生时,您需要创建一个新的 RPM。这个新的 RPM 不仅必须处理软件包的安装,还必须处理任何升级问题。您需要考虑以下问题:

  • 如何安装新版本软件的RPM。是否有任何必要的安装脚本?
  • 如何删除以前的 RPM 软件包。如果您的软件包具有安装脚本,则可能需要卸载脚本,用于彻底删除安装脚本对系统所做的任何更改。RPM系统处理包中文件的删除。您需要处理在安装过程中撤消对系统所做的任何更改的任务。

勾勒出任何依赖关系

执行 make 的时候,必须保证包含了所有的依赖项。在大多数情况下,我们不希望在 RPM 中包含依赖项。相反,每个依赖项每个必要的库都应该有自己的 RPM。在许多情况下,您应该能够找到 RPM 对于这些依赖关系,并跟踪提供依赖项的包。

构建 RPM

构建 RPM 需要由 rpmbuild 命令来完成。构建 RPM,请执行以下步骤:

  • 设置目录结构
  • 将源代码放在正确的目录中
  • 创建一个 spec 文件,告诉 rpmbuild 命令执行什么操作
  • 构建源 RPM 和二进制 RPM

设置目录结构

目录 使用
BUILD rpmbuild 命令在此目录中构建软件
RPMS rpmbuild 命令将其创建的二进制 RPM 存储在此目录中,通常包含许多特定于体系结构的子目录,包括 athlon、i386、i486、i586、i686、noarch
SOURCES 将应用程序的源代码放在此目录中
SPECS 将计划创建的每个 RPM 的 spec 文件放在此目录中
SRPMS rpmbuild 命令将源 RPM 放置在此目录中

默认情况下,Red Hat Linux 系统期望在 /usr/src/redhat 目录中构建 RPM,这个目录显然是特定于 Red Hat Linux 的。在其他 Linux 发行版上,您可能会看到其他目录。

首先,使用系统目录来构建 RPM 似乎很奇怪。但请记住,RPM系统最初是为创建 Linux 发行版而构建的(可以通过修改 rpmrc 设置更改默认目录)。

目前,最简单的方法是切换到 /usr/src/redhat 目录并从该位置开始工作。首先,您需要更改这些文件的所有权或权限,以便您可以在以普通用户身份登录时构建RPM。不要在以 root 身份登录时构建 RPM。如果您以 root 身份登录,则构建包时的错误可能会导致严重的后果。
要构建RPM,实际上只需要两件事:

  • 源码放入 SOURCES 目录中
  • spec 文件放入 SPECS 目录中

将源码放在目录中

最好的策略是从自己创建的目录开始,从源代码创建 tarball(package-version.tar.gz)文件,然后将 tarball 文件复制到 /usr/src/redhat/sources 目录。

创建 spec 文件

spec(Specification File)文件定义了 rpmbuild 命令构建应用程序时应执行的所有操作,以及 rpm 命令安装和删除应用程序所需的所有操作。每个源 RPM 都应具有构建二进制 RPM 所需的规范文件。

在 spec 文件中,使用特殊语法设置软件包上信息的格式。此语法定义如何构建包、版本号、依赖关系信息以及您可以查询的有关包的其他所有内容。根据 spec 文件中的部分,此语法略有不同。以下部分介绍了这些规范文件部分以及每个部分中的必要语法。

  • The introduction section

    简介部分包含有关软件包的信息,即rpm-qi命令所显示的信息类型。例如:

    Summary: java source to bytecode compiler
    %define version 1.17
    Copyright: IBM Public License, http://ibm.com/developerworks/oss/license10.html
    Group: Development/Languages
    Name: jikes
    Prefix: /usr
    Provides: jikes
    Release: 1
    Source: jikes-%{version}.tar.gz
    URL: http://ibm.com/developerworks/opensource/jikes
    Version: %{version}
    Buildroot: /tmp/jikesrpm
    %description
    The IBM Jikes compiler translates Java source files to bytecode. It
    also supports incremental compilation and automatic makefile generation,
    and is maintained by the Jikes Project:
    http://ibm.com/developerworks/opensource/jikes/
    

    此示例来自真实的 RPM 规范文件。它并不遵循创建 RPM 的所有规则。此示例

    • 不应显式提供包的名称
    • 不应包含版权标记,因为此标记已被弃用
    • 配置 %define,执行 rpmbuild 命令可以为创建版本宏
  • The prep section

    prep(prepare)部分定义了准备构建所需的命令。如果你从源代码的压缩 tar 存档(tarball)开始,prep部分需要提取文件。

    %prep
    %setup -q
    

    此示例使用 %setup RPM宏来提取文件。

  • The build section

    spec 文件包含构建软件的命令,通常,这将只包括几个命令,因为大多数实际指令都出现在 makefile 中。例如:

    %build
    ./configure CXXFLAGS=-O3 --prefix=$RPM_BUILD_ROOT/usr
    make
    

    Build 部分以 %build 语句开头。

  • The install section

    spec 文件install 部分包含安装新构建的应用程序或库所需的命令。在大多数情况下,您的安装部分应该清除 BuildRoot 目录并运行 make install命令。例如:

    %install
    rm -fr $RPM_BUILD_ROOT
    make install
    

    install 部分以 %install 语句开头。

  • The clean section

    clean 部分清理其他部分中的命令创建的文件:

    %clean
    rm -rf $RPM_BUILD_ROOT
    

    clean 部分以 %clean 语句开头。

  • The files section

    files 部分列出了要进入二进制 RPM 的文件,以及已定义的文件属性。例如:

    %files
    %defattr(-,root,root)
    /usr/bin/jikes
    %doc /usr/doc/jikes-%{version}/license.htm
    %doc /usr/man/man1/jikes.1*
    

    files 部分以 %files 语句开头。

    %doc 宏将某些文件标记为文档。这允许 RPM 将保存文档的文件与 RPM 中的其他文件区分开来。

    编写了spec 文件并将其放在 /usr/src/redhat 下的 sources 和 specs 目录中后,将看到如下文件:

    $ ls –CF /usr/src/redhat/*
    /usr/src/redhat/BUILD:
    /usr/src/redhat/RPMS:
    athlon/ i386/ i486/ i586/ i686/ noarch/
    /usr/src/redhat/SOURCES:
    jikes-1.17.tar.gz
    /usr/src/redhat/SPECS:
    jikes.spec
    /usr/src/redhat/SRPMS:
    

    也就是说,在一个干净的系统中,没有构建其他RPM,将在 /usr/src/redhat/specs 中看到一个 spec 文件,在 /usr/src/redhat/sources 中看到源代码。在此示例中,源文件位于压缩的 tar 存档中(为此,RPM 规范文件 jikes.spec 需要在 prep 部分中有一个命令来提取文件)。

    现在,准备好可以构建 RPM。

构建 RPMs

要使用 rpmbuild 命令构建 RPM,请使用以下基本语法:

rpmbuild -bBuildStage spec_file

-b 选项告诉 rpmbuild 构建 RPM。额外的 BuildStage 选项是一个特殊的代码,它告诉rpmbuild命令在构建时要走多远。选项包括:

选项 使用
-ba 构建所有,包括二进制和源 RPM
-bb 构建二进制 RPM
-bc 构建(编译)程序,但不进行完整的RPM,在%Build部分后立即停止
-bp 准备构建二进制 RPM,并在完成 %prep 部分后立即停止
-bi 创建二进制 RPM 并在 %install 部分后立即停止
-bl 检查 RPM 的文件列表,如果 BuildRoot 缺少任何要安装的文件,则生成错误
-bs 仅构建源RPM

rpmbuild 命令参数说明:

[root@bogon /]# rpmbuild --help
Usage: rpmbuild [OPTION...]

Build options with [ <specfile> | <tarball> | <source package> ]:
  -bp                           build through %prep (unpack sources and apply patches) from <specfile>
  -bc                           build through %build (%prep, then compile) from <specfile>
  -bi                           build through %install (%prep, %build, then install) from <specfile>
  -bl         
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二流人物

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值