前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >实用入门分享:如何基于 OpenCloudOS 制作 RPM 软件包?

实用入门分享:如何基于 OpenCloudOS 制作 RPM 软件包?

原创
作者头像
腾源会
发布2023-11-15 15:31:39
1960
发布2023-11-15 15:31:39
举报
文章被收录于专栏:腾源会腾源会

OpenCloudOS 操作系统开源社区是由操作系统、软硬件厂商与个人共同倡议发起的操作系统社区项目,为用户提供自主可控、绿色节能、安全可靠、高性能的下一代云原生操作系统,目前社区理事单位已达 31家,联接生态伙伴达 500+家,OpenCloudOS 操作系统将与众多生态伙伴一起打造面向未来开放中立的操作系统开源生态。

截止目前 OpenCloudOS 操作系统已支持 X86_64、ARM64、RISC-V 架构,完善适配 LoongArch、飞腾、海光、兆芯、鲲鹏等芯片。同时提供支持全栈国密和机密计算,下载量和装机量已达千万节点,另有 600 余家企业产品与 OpenCloudOS 操作系统完成适配。

本节实验将介绍 Linux 系统常用命令,通过学习本节实验能够掌握 Linux 基本操作,为操作 OpenCloudOS 系统奠定基础。Linux 命令可以在不同的 Linux 发行版中运行,本次实验环境的 Linux 发行版是 OpenCloudOS 8.6(下载链接见文末)。

本次实验主要介绍如何在 OpenCloudOS 系统上编译生成并安装 RPM 软件包。

一、RPM 包制作

RPM 包基本介绍

RPM(Red Hat Package Manager)包是一种用于在 Linux 操作系统上进行软件安装、升级和卸载的标准格式,它是基于 RPM 软件包管理系统的。该软件包管理系统是由 Red Hat 开发的,并被广泛应用于多个 Linux 发行版中,如 Fedora、OpenSUSE、OpenCloudOS、TencentOS Server 等。

RPM 包通常包含一个或多个软件包文件、安装脚本、配置文件和其他必要的元数据。这些元数据包括软件包名称、版本、依赖关系和许可证等信息。通过使用 RPM 包管理器,用户可以轻松地安装、更新和删除软件包,这使得在 Linux 系统上进行软件管理变得更加方便和高效。

RPM 包管理器提供了一些基本的命令,如 rpm、yum 和 dnf 等,用于在 Linux 系统上管理软件包。其中,rpm 命令用于安装、升级和卸载 RPM 包,而 yum 和 dnf 命令则是基于 rpm 命令的高级包管理器,它们可以自动解决依赖关系,从软件仓库中下载和安装软件包等。

二、环境配置

在进行具体的 RPM 包制作之前,我们首先需要配置对应的打包环境,比如工具的安装配置,工作用户的配置以及工作目录的配置等等。

打包工具安装

RPM 包主要通过 rpm-build 这个工具进行安装。rpm-build 是一个用于在 Linux 系统上构建 RPM 包的工具,它提供了一些命令和脚本,可以将源代码和其他必要的文件打包成 RPM 包。该工具通常需要在 RPM 打包环境中使用,可以通过安装 rpm-build 软件包来获取。使用 rpm-build 可以有效地管理和维护 RPM 包,提高开发人员的工作效率和技能水平。

我们通过 dnf 这个命令安装 rpm-build,需要以 root 用户执行以下命令:

代码语言:javascript
复制
dnf install -y rpm-build

创建工作用户

制作 RPM 包时,最好不要以 `root`用户权限制作(这可能打乱我们的工作环境,详细解释可以参考文末链接(1)

因此我们通过 `useradd`创建一个普通用户 `builder01`  

代码语言:javascript
复制
adduser builder01

并切换到此用户来完成接下来 RPM 包的制作过程,接下来的命令非特殊说明,我们都以普通用户权限执行各类命令。 

代码语言:javascript
复制
su builder01 

创建工作目录

切换到普通用户 `builder01`,先进入 `builder01`的主目录:  

代码语言:javascript
复制
cd ~

rpmbuild 默认工作目录就在当前用户的主目录下,同时它需要特定结构的工作目录结构,结构如下:

其中,BUILD 目录用于存放编译生成的二进制文件,BUILDROOT 目录用于存放编译生成的中间文件,RPMS 目录用于存放已经构建好的 RPM 包,SOURCES 目录用于存放源代码和其他必要的文件,SPECS 目录用于存放 RPM 打包的规范文件,SRPMS 目录用于存放源代码 RPM 包。

执行如下命令创建目录: 

代码语言:javascript
复制
mkdir -p ~/rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS} 

三、RPM 包编译

环境配置完成后,开始正式的 RPM 包编译过程。 

文件准备

前文提到 RPM 包通常包含一个或多个软件包文件,RPM 通过将这些软件包文件拷贝到系统具体位置,来完成对这些软件的安装。

因此,我们首先需要创建被打包到 RPM 包中的可执行文件,这个可执行文件在 RPM 包安装时就会被拷贝到操作系统中,进而可被用户调用。

我们这里创建一个简单的 shell 脚本,放到 ~/rpmbuild/SOURCES 即可。

代码语言:javascript
复制
touch ~/rpmbuild/SOURCES/hello

编辑脚本

代码语言:javascript
复制
vim /home/builder01/rpmbuild/SOURCES/hello

打开后输入一下命令:

代码语言:javascript
复制
#!/bin/bash  echo "hello, RPM"

这个脚本执行一个简单的 echo命令,输出 hello, RPM 到标准输出。

创建 SPEC 文件

接下来创建 RPM 的 SPEC 文件,spec 文件是 RPM 软件包的规范文件,用于控制 RPM 的制作过程。它包含了 RPM 软件包的基本信息、依赖关系、安装、卸载、文件列表等信息。在使用 rpm-build 构建 RPM 包时, 需要编写 spec 文件,以告诉  rpm-build 如何构建RPM包。.spec 文件通常由以下几个部分组成:

  • 头部:包含了RPM包的基本信息,如名称、版本、发布号、许可证等。
  • 依赖关系:指定了RPM包所依赖的其他软件包和库文件。
  • 安装、卸载、文件列表:指定了RPM包的安装、卸载和文件列表等信息。
  • 脚本:包含了在安装、卸载、升级RPM包时需要执行的脚本。

编写 spec 文件需要遵循一定的规范和格式,可以使用 rpmdev-newspec 命令生成一个基本的 spec 文件,然后根据需要进行修改。我们这里手动创建一个 spec 文件。

代码语言:javascript
复制
touch ~/rpmbuild/SPECS/demo.spec

编辑 demo.spec 

代码语言:javascript
复制
vim /home/builder01/rpmbuild/SPECS/demo.spec 
代码语言:javascript
复制
# 头部Summary:        a simple demo for rpmbuildName:           demoVersion:        0.1Release:        1%{?dist}        ​License:        Public Domain          URL:            https://cloud.tencent.com/lab/contribution/29554/Source0:        hello​# 依赖关系Requires:       /bin/bashBuildArch:      noarch​%descriptionThis package provides a simple shell script, whichecho 'hello rpm' into stdout.​# 安装/卸载脚本%prep​%build​%installrm -rf $RPM_BUILD_ROOTinstall -D -m 755 %{SOURCE0} $RPM_BUILD_ROOT/%{_bindir}/hello​# 文件列表%files%{_bindir}/*​%changelog* Thu Nov 10 2022 builder01 - 0.1-1- make a simple hello rpm.

生成 RPM 包

完成上述文件配置后,就可以执行在第一步中安装的命令 rpmbuild,即可完成 RPM 包的构建。命令如下:

代码语言:javascript
复制
rpmbuild -bb ~/rpmbuild/SPECS/demo.spec

rpmbuild -bb 是一个用于在 Linux 系统上构建 RPM 包的命令,它会读取.spec 文件和 SOURCES 目录下的文件,将其打包成 RPM 包。其中,-bb 选项表示只构建二进制 RPM 包,不构建源代码 RPM 包。使用 rpmbuild -bb 可以快速、高效地构建 RPM 包。

最后生成的 RPM 包将在 ~/rpmbuild/RPMS/noarch 中,这里通过 ls 查看该目录下文件:

代码语言:javascript
复制
ls ~/rpmbuild/RPMS/noarch

可以看到 demo-0.1-1.oc8.noarch.rpm 文件。   

RPM 包内容

这时候 RPM 包已经成功制作出来了,我们可以通过以下命令查看其中的内容:  

代码语言:javascript
复制
rpm -qpl ~/rpmbuild/RPMS/noarch/demo-0.1-1.oc8.noarch.rpm

其中,rpm -q -p -l 是一个用于在 Linux 系统上列出 RPM 包中文件列表的命令,其中 -q 选项表示查询 RPM 包,-p 选项表示查询未安装的 RPM 包,-l 选项表示列出 RPM 包中的文件列表。

此命令输出如下:

代码语言:javascript
复制
/usr/bin/hello

这表示,当这个 rpm 包被安装到系统后,hello 命令会被安装到 /usr/bin 下。  同时,我们还可以通过以下命令查看 rpm 包的包头信息:

代码语言:javascript
复制
rpm -q -p -i ~/rpmbuild/RPMS/noarch/demo-0.1-1.oc8.noarch.rpm

其中 -i 选项表示查询 RPM 包的包头信息。 此命令输出如下:

代码语言:javascript
复制
Name        : demoVersion     : 0.1Release     : 1.oc8Architecture: noarchInstall Date: (not installed)Group       : UnspecifiedSize        : 32License     : Public DomainSignature   : (none)Source RPM  : demo-0.1-1.oc8.src.rpmBuild Date  : Tue 09 May 2023 06:46:55 AM EDTBuild Host  : localhostRelocations : (not relocatable)URL         : https://cloud.tencent.com/lab/contribution/29554/Summary     : a simple demo for rpmbuildDescription :This package provides a simple shell script, whichecho 'hello rpm' into stdout.

这个信息就是在前面 demo.spec 文件中所指定的内容。

四、RPM 包安装验证

打包完 RPM 包后,我们需要对这个 RPM 包进行安装验证。 

安装验证

安装 RPM 包需要切换到 root 用户,执行以下命令退出普通用户: 

代码语言:javascript
复制
exit

返回 root 用户,完成验证。通过 rpm 命令安装 RPM 软件包:

代码语言:javascript
复制
rpm -ivh /home/builder01/rpmbuild/RPMS/noarch/demo-0.1-1.oc8.noarch.rpm

rpm -ivh 是一个用于在 Linux 系统上安装 RPM 包的命令,其中 -i 选项表示安装 RPM 包,-v 选项表示显示详细信息,-h 选项表示显示进度条。使用 rpm -ivh 可以快速、高效地安装 RPM 包,同时可以查看安装过程和进度。

安装完成后,可以看到 /usr/bin 下存在一个 hello 的可执行文件:

代码语言:javascript
复制
ls /usr/bin | grep hello

执行安装在系统中的 hello 命令:

代码语言:javascript
复制
hello

执行完成后显示:

代码语言:javascript
复制
hello, RPM

至此,我们在 OpenCloudOS 上简单的完成了 RPM 的制作。

相关链接

代码语言:javascript
复制
腾讯云实践课程:https://cloud.tencent.com/lab/courseDetail/1832534624698873
OpenCloudOS 8.6 下载链接:https://www.opencloudos.org/iso
[why-is-it-bad-to-build-rpms-as-root](https://serverfault.com/questions/10027/why-is-it-bad-to-build-rpms-as-root))
RPM 相关学习资料:
https://rpm.org/index.html
https://ftp.osuosl.org/pub/rpm/max-rpm/

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、RPM 包制作
  • 二、环境配置
  • 三、RPM 包编译
  • 四、RPM 包安装验证
相关产品与服务
机密计算平台
机密计算平台(Confidential Computing Platform)是一款腾讯云推出的基于可信执行环境(TEE)打造的隐私安全基础平台,可以为用户提供机密计算轻松接入,服务托管,一站式运维等功能,实现端到端全生命周期保护用户数据的机密性和完整性,满足用户多应用多业务多场景的安全需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档