欢迎光临
我们一直在努力

手把手教你制作RPM包:基于Kylin V11的Nginx打包实战

一、RPM基本概念

1. RPM包概述

在Linux系统中,软件安装与管理是运维和开发的基础操作,而RPM包作为主流的软件包格式之一,贯穿了绝大多数Linux发行版(如CentOS、RHEL、Fedora)的软件管理全流程。

RPM 包(全称为RedHat Package Manager)是一种用于 Linux 系统的低阶、预编译、二进制软件包管理格式,最初由 Red Hat 开发,现已成为 Linux Standard Base (LSB) 标准的一部分。它通过将编译后的可执行文件、库、配置文件及元数据(如版本信息、依赖关系、脚本等)打包为单一归档文件,实现了软件在系统中的标准化分发。

RPM 包管理器利用本地数据库对已安装包进行跟踪,支持对软件进行高效的安装、查询、验证、升级和卸载操作,是 Red Hat 系及 SUSE 系等主流 Linux 发行版进行系统组件和应用程序管理的核心底层技术。

2. RPM包结构

一个RPM包本质是分层的归档文件,核心包含三个部分:

  • 包头(Header):存储元数据(版本、依赖、架构、作者、脚本等),是 RPM 管理器解析包的核心依据

  • 有效载荷(Payload):以 cpio 格式压缩的实际文件(可执行程序、配置文件、库、文档等),是安装到系统的核心内容

  • 签名/校验信息:用于验证包的完整性和合法性

[Step1] 首先在Fedora官方仓库中下载一个精简的RPM包——hello包。该软件包的作用是提供一个“hello”命令,执行该命令后会输出“Hello, world!”。hello包的下载地址如下所示。

https://src.fedoraproject.org/rpms/hello

图片

[Step2] 将上述步骤下载的“hello-2.12.2-1.el9.x86_64.rpm”上传到系统中。

图片

3. 包头(Header)

3.1 包头字段解释

图片

[Step1] 能够通过“rpm -qi”命令能够查看该软件包的包头数据。

[root@kylinv11 ~]# rpm -qi hello-2.12.2-1.el9.x86_64.rpm

图片

4. 有效载荷(Payload)

有效载荷是RPM包的“功能核心”,采用 cpio 格式 + xz 压缩存储,包含安装到系统的所有文件。

[Step1] 创建临时目录,将RPM包复制到临时目录。

[root@kylinv11 ~]# mkdir /tmp/hello-payload

[root@kylinv11 ~]# cp hello-2.12.2-1.el9.x86_64.rpm /tmp/hello-payload/

[Step2] rpm2cpio能将RPM软件包转换成cpio格式的归档文件,解压hello包中的有效载荷。

[root@kylinv11 hello-payload]# rpm2cpio hello-2.12.2-1.el9.x86_64.rpm | cpio -idmv

图片

二、RPM软件包打包

1. RPM 软件包的分类与核心特性

RPM 软件包主要分为两类核心形态:二进制 RPM 包(文件命名格式为 x.rpm)和源码 RPM 包(SRPM)(文件命名格式为 x.src.rpm),二者在内容形态、使用场景和核心价值上差异显著:

  • 二进制RPM包:包内封装的是已编译完成的二进制可执行文件、库文件及配套依赖文件,无需用户手动编译即可直接安装。其核心设计目标是解决源码包安装流程繁琐、软件依赖关系复杂的问题 ——RPM 包管理器可自动识别并解决软件间的依赖项,同时记录安装、升级、卸载等操作的关键信息,大幅简化部署流程。

  • 源码RPM包:SRPM文件内含有原始码(Source Code)包内不包含编译后的二进制文件,核心内容为软件原始源代码、定义构建规则的 SPEC 文件(描述源代码编译、打包为 RPM 包的完整流程),还可能包含用于修复源码的补丁文件(patch)。用户需基于 SRPM 中的源码和 SPEC 文件,通过编译(build)、安装(install)等阶段生成可安装的二进制文件,适合需自定义编译参数、二次开发或适配特定系统环境的场景。

2. 前期准备

[Step1] 安装 rpmbuild 工具,用于制作rpm包。

[root@kylinv11 ~]# yum install -y rpm-build

[Step2] 初始化打包目录。

// 方法1:手动创建所需目录,只能在~目录下创建

[root@kylinv11 ~]# mkdir ~/rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SRPMS}

// 方法2:通过rpmdev-setuptree命令生成,该命令会自动在~目录下创建

[root@kylinv11 ~]# yum install -y rpmdevtools

[root@kylinv11 ~]# rpmdev-setuptree

图片

3. rpmbuild目录结构

RPM 打包的目录结构是分工明确的:SPECS(配置)→SOURCES(源码)→BUILD(编译)→BUILDROOT(临时安装)→RPMS/SRPMS(成品)。

图片

三、spec文件基本概念

1. spec文件概述

要构建一个标准的RPM包,需要手动编写“.spec”文件。而“.spec”文件也是RPM打包的核心,它定义了如何构建和安装该软件包中的软件。同时说明了该软件包的原始地址、版本号、代码存放目录、存在的补丁和依赖以及整个执行过程。

2. spec文件基本格式

spec文件由两部分参数组成,分别为标签(Tag)和宏段落(Macro Section),二者均属于 spec 文件的核心组成部分。标签的核心功能是定义软件元数据(基础属性),宏段落的核心功能是定义打包操作步骤 / 功能模块。

2.1 spec文件中常用的标签

图片

2.2 spec文件中常用的宏段落

图片

3. spec文件构建过程

spec文件编写完成后,rpmbuild工具将按以下顺序自动执行打包流程,全程无需手动干预:

  • %prep阶段:解压Source0中指定的源码包至BUILD目录,若存在补丁文件,自动应用补丁进行源码修改。

  • %build阶段:进入BUILD目录,执行spec文件中定义的编译命令(如./configure、make),完成软件编译。

  • %install阶段:将编译完成的软件安装至BUILDROOT临时目录,生成与实际系统一致的目录及文件结构。

  • 文件校验:根据%files段落的配置,校验BUILDROOT目录中的文件是否完整、路径是否正确,排查遗漏或多余文件。

  • 包头生成:根据spec文件中的元数据信息,生成RPM包的包头,记录软件核心标识与依赖关系。

  • 成品打包:将包头与BUILDROOT目录中的文件(有效载荷)进行打包压缩,生成二进制RPM包(存放于RPMS目录)与源码RPM包(存放于SRPMS目录)。

  • 若打包过程中出现依赖缺失、编译失败等异常,打包流程将立即终止,需修复对应问题后重新执行打包操作。

    三、nginx源码包制作RPM案例

    1. 前置准备

    节点设置

    图片

    [Step1] 系统环境:Kylin Linux Advanced Server V11,最小化安装,已配置官方网络源。

    [root@kylin ~]# yum makecache

    图片

    [Step2] 工具安装:安装打包所需全部工具。

    [root@kylin ~]# yum install -y rpm-build rpmdevtools gcc make pcre-devel openssl-devel zlib-devel wget tree

    图片

    [Step3] 资源准备:从Nginx下载“nginx-1.24.0”源码包。

    [root@kylin ~]# wget http://nginx.org/download/nginx-1.24.0.tar.gz

    图片

    [Step4] 目录初始化:执行命令,自动生成rpmbuild标准目录结构。

    [root@kylin ~]# rpmdev-setuptree

    图片

    [Step5] 将下载好的源码包,放置到“rpmbuild/SOURCES”目录。

    [root@kylin ~]# cp nginx-1.24.0.tar.gz rpmbuild/SOURCES/

    2. spec文件分段释义

    [Step1] 进入“rpmbuild/SPECS”目录,创建nginx.spec文件。

    [root@kylin ~]# cd rpmbuild/SPECS/

    [root@kylin SPECS]# touch nginx.spec

    [Step2] spec文件基础部分释义。

    # 软件摘要(简洁描述软件功能)

    Summary: A HTTP server, reverse proxy and mail proxy server

    # 软件名称(唯一标识,小写)

    Name: nginx

    # 软件版本(与源码包版本完全一致)

    Version: 1.24.0

    # 发布版本(1表示首次发布,ky11适配Kylinv11)

    Release: 1.ky11

    # 开源许可证(与nginx官方一致)

    License: GPLv2

    # 软件官方地址

    URL: http://nginx.org/

    # 源码包路径(宏定义简化,对应SOURCES目录下的源码包)

    Source0: %{name}-%{version}.tar.gz

    # 运行依赖(nginx运行所需的库文件)

    Requires: pcre-devel, openssl-devel, zlib-devel, libselinux

    # 编译依赖(编译过程所需工具,安装后可卸载)

    BuildRequires: gcc, make, pcre-devel, openssl-devel, zlib-devel

    # 软件详细描述

    %description

    Nginx is a high-performance HTTP and reverse proxy server, also a IMAP/POP3/SMTP proxy server.

    [Step3] spec文件编译安装部分释义。

    # 准备阶段(解压源码包,静默模式)

    %prep

    %setup -q

    # 编译阶段(配置编译参数,启用多线程编译)

    %build

    ./configure –prefix=/usr/local/nginx \\

    # 启用HTTPS模块

    –with-http_ssl_module \\

    # 启用状态监控模块

    –with-http_stub_status_module \\

    # 启用pcre正则支持

    –with-pcre

    make %{?_smp_mflags} # 多线程编译,提升效率

    [Step4] spec文件install部分释义。

    # 执行nginx的安装命令,将文件安装到临时构建目录

    %install

    # 在临时目录下的创建日志目录,并设置权限

    make install DESTDIR=%{buildroot}

    mkdir -p %{buildroot}/usr/local/nginx/logs

    chmod 755 %{buildroot}/usr/local/nginx/logs

    # 设置nginx整个安装目录的所有者为root

    chown -R root:root %{buildroot}/usr/local/nginx

    # 创建临时目录下的/etc/nginx目录

    mkdir -p %{buildroot}/etc/nginx

    # 复制nginx默认配置文件到/etc/nginx目录

    cp %{buildroot}/usr/local/nginx/conf/nginx.conf %{buildroot}/etc/nginx/

    cp %{buildroot}/usr/local/nginx/conf/mime.types %{buildroot}/etc/nginx/

    # 创建临时目录下的systemd服务文件目录,写入nginx的systemd服务配置文件

    mkdir -p %{buildroot}/usr/lib/systemd/system/

    cat > %{buildroot}/usr/lib/systemd/system/nginx.service << EOF

    [Unit]

    Description=nginx – high performance web server

    After=network.target remote-fs.target nss-lookup.target

    [Service]

    Type=forking

    PIDFile=/usr/local/nginx/logs/nginx.pid

    ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /etc/nginx/nginx.conf

    ExecStart=/usr/local/nginx/sbin/nginx -c /etc/nginx/nginx.conf

    ExecReload=/bin/kill -s HUP \\$MAINPID

    ExecStop=/bin/kill -s QUIT \\$MAINPID

    PrivateTmp=true

    [Install]

    WantedBy=multi-user.target

    EOF

    # 在临时目录中创建bin目录,为后续的nginx软链接做准备

    # 否则会出现“No such file or directory”

    mkdir -p %{buildroot}/usr/bin/

    ln -s /usr/local/nginx/sbin/nginx %{buildroot}/usr/bin/nginx

    [Step5] spec文件有效载荷内容部分释义。

    # 定义需要打包的文件/目录(有效载荷内容)

    %files

    # nginx核心安装目录

    /usr/local/nginx/

    # nginx配置文件目录

    /etc/nginx/

    # nginx系统服务脚本

    /usr/lib/systemd/system/nginx.service

    # 软链接(便于全局调用nginx命令)

    /usr/bin/nginx

    # 版本更新日志(规范格式,记录打包信息)

    %changelog

    * Thu Mar 05 2026 <Meaauf production>

    – 首次打包nginx-1.24.0版本,适配kylin 11系统

    – 启用SSL和状态监控模块,添加systemd服务配置

    – 创建专用nginx用户,规范权限管理

    3. 构建RPM包

    [Step1] 在SPECS目录下,执行以下命令,启动RPM包构建。构建过程将依次执行%prep(解压源码)、%build(编译源码)、%install(临时安装)、文件校验、包头生成、成品打包等步骤。

    [root@kylin SPECS]# rpmbuild -ba nginx.spec

    图片

    4. 验证RPM包完整性

    [Step1] 查看生成的RPM包:能看到“nginx-1.24.0-1.el7.x86_64.rpm”文件。

    [root@kylin ~]# tree rpmbuild/

    图片

    [Step2] 查看RPM包的元数据、依赖关系等信息,能够看到与spec文件配置一致。

    [root@kylin ~]# cd rpmbuild/RPMS/x86_64/

    [root@kylin x86_64]# rpm -qi nginx-1.24.0-1.ky11.x86_64.rpm

    图片

    5. 测试RPM包安装与使用

    [Step1] 安装生成的nginx RPM包。

    [root@kylin ~]# cd rpmbuild/RPMS/x86_64/

    [root@kylin x86_64]# rpm -ivh nginx-1.24.0-1.ky11.x86_64.rpm

    图片

    [Step2] 启动nginx服务并查看服务状态,状态无异常。

    [root@kylin x86_64]# systemctl start nginx.service

    [root@kylin x86_64]# systemctl status nginx.service

    图片

    [Step3] 能够在浏览器中正常访问Nginx的测试页。

    图片

    四、nginx.spec文件内容

    Summary: A HTTP server, reverse proxy and mail proxy server

    Name: nginx

    Version: 1.24.0

    Release: 1.ky11

    License: GPLv2

    URL: http://nginx.org/

    Source0: %{name}-%{version}.tar.gz

    Requires: pcre-devel, openssl-devel, zlib-devel, libselinux

    BuildRequires: gcc, make, pcre-devel, openssl-devel, zlib-devel

    %description

    Nginx is a high-performance HTTP and reverse proxy server, also a IMAP/POP3/SMTP proxy server.

    %prep

    %setup -q

    %build

    ./configure –prefix=/usr/local/nginx \\

    –with-http_ssl_module \\

    –with-http_stub_status_module \\

    –with-pcre

    make %{?_smp_mflags}

    %install

    make install DESTDIR=%{buildroot}

    mkdir -p %{buildroot}/usr/local/nginx/logs

    chmod 755 %{buildroot}/usr/local/nginx/logs

    chown -R root:root %{buildroot}/usr/local/nginx

    mkdir -p %{buildroot}/etc/nginx

    cp %{buildroot}/usr/local/nginx/conf/nginx.conf %{buildroot}/etc/nginx/

    cp %{buildroot}/usr/local/nginx/conf/mime.types %{buildroot}/etc/nginx/

    mkdir -p %{buildroot}/usr/lib/systemd/system/

    cat > %{buildroot}/usr/lib/systemd/system/nginx.service << EOF

    [Unit]

    Description=nginx – high performance web server

    After=network.target remote-fs.target nss-lookup.target

    [Service]

    Type=forking

    PIDFile=/usr/local/nginx/logs/nginx.pid

    ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /etc/nginx/nginx.conf

    ExecStart=/usr/local/nginx/sbin/nginx -c /etc/nginx/nginx.conf

    ExecReload=/bin/kill -s HUP \\$MAINPID

    ExecStop=/bin/kill -s QUIT \\$MAINPID

    PrivateTmp=true

    [Install]

    WantedBy=multi-user.target

    EOF

    mkdir -p %{buildroot}/usr/bin/

    ln -s /usr/local/nginx/sbin/nginx %{buildroot}/usr/bin/nginx

    %files

    /usr/local/nginx/

    /etc/nginx/

    /usr/lib/systemd/system/nginx.service

    /usr/bin/nginx

    %changelog

    * Thu Mar 05 2026 Meaauf <meaauf@example.com> 1.24.0-1.ky11

    – 首次打包nginx-1.24.0版本,适配kylin 11系统

    – 启用SSL和状态监控模块,添加systemd服务配置

    – 移除nginx专用用户,改为root用户运行nginx服务

    赞(0)
    未经允许不得转载:171主机测评 » 手把手教你制作RPM包:基于Kylin V11的Nginx打包实战
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址