目录
创建Demo软件包,等一下我们会通过rpm发布这个demo包
了解RPM
RPM有两种含义:
- RPM是Red Hat Package Manager的缩写,是一种软件包管理器,用于在基于Red Hat Linux的操作系统中安装、卸载、更新软件包。它包含一个软件包文件格式、一组用于管理软件包的工具和一些包含在软件包中的元数据。RPM软件包通常以.rpm文件扩展名结束,这些文件包含用于安装或升级软件包的二进制文件、库文件、配置文件、文档等内容。
- RPM也是Revolutions Per Minute的缩写,即转每分,表示设备每分钟的旋转次数。
RPM简介
RPM(Redhat Package Manager)是用于麒麟、红帽等Linux分发版(distribution) 的常见的软件包管理器。因为它允许分发已编译的软件,所以用户只用一个命令就 可以安装软件。
简单说:RPM之类的软件包本质上也就是把一些文件放到一个压缩包里,再加上一 些这个软件名字叫啥之类的元数据而已。 包管理系统真正的重点在于管理上。这个管理可不仅仅是解压文件和删除文件。 而包管理提供了一个标准化的解决这些问题的方案。只要我们事先约定好应该把 什么类型的文件放在什么位置,然后把这个软件需要的依赖等等全部记录好再分 发就行了。包管理能自动检查所有需求是不是都被满足了,然后再把软件包里的 文件放到它该去的地方,卸载的时候也能帮你把文件给全删了。
RPM好处
- 只要有人持续维护,把新版本的软件也打成软件包,用户就能(相对)很轻松得升级软件。
- 维护者(打包的)可以对增加一些额外的配置,实现一些上游(真的写软件的)没有的功能,或者修复一些官方没来得及修的问题。
- 可以把一个软件根据功能等等拆成好几个包,用户可以通过只装需要的东西来减少硬盘空间占用。
- 当你把很多软件包按照一定规律放到网上,你就有了一个软件源。此时配合yum/dnf之类的软件就能在依赖没被满足的时候自动去尝试下载缺少了的东西。这能给用户提供近似一键安装的体验。
- 包管理极大地简化了维护和分发的难度。
RPM打包
RPM有五种基本的操作功能:安装、卸载、升级、查询和验证。
有时候为了方便源码包的安装,我们有自己订制软件包的需求,我们会把一些源码包按照我们的需求来做成rpm包,当有了源码包就可以直接编译得到二进制安装包和其他任意包。spec file是制作rpm包最核心的部分,rpm包的制作就是根据spec file来实现的。
基于X86架构的麒麟操作系统V10
RPMbuild环境准备
#yum install rpm-build rpmdevtools rpmlint -y
认识RPMbuild
#rpmdev-setuptree
#cd
#tree rpmbuild
RPMbuild是用于创建RPM的二进制软件包和源码软件包的命令 行工具,它的文件夹目录结构如下所示,一共包含了6个子目录
RPMbuild目录架构
该目录中包含下面的6个目录(文件夹)
- BUILD:源代码解压以后放的位置,只需提供BUILD目录,具体里面放什么,不用我们管,所以真正的制作车间是BUILD目录。
- BUILDROOT:假根,使用install临时安装到这个目录,把这个目录当作根来用的,所以在这个目录下的目录文件,才是真正的目录文件。当打包完成后,在清理阶段,这个目录将被删除。(临时根)
- RPMS:制作完成后的rpm包存放目录,为特定平台指定子目录(i386,i686,ppc)。
- SOURCES:收集的源文件,源材料,补丁文件等存放位置。
- SPECS:存放spec文件,作为制作rpm包的领岗文件,文件以.spec结尾。
- SRPMS:src格式的rpm包位置 ,既然是src格式的包,就没有平台的概念了。
认识SPECFILE
SPECFILE 文件是rpm打包的灵魂,大家可以把rpm打包的过程想成盖一个大楼。SPECFILE就是那个图纸,一切都要围绕它来
cd rpmbuild/SPECS/
rpmdev-newspec
Skeleton specfile (minimal) has been created to "newpackage.spec".
mv newpackage.spec simple-script.spec
大家可以通过以上命令生成一个样本文件
cat simple-script.spec
Name(用来设定名称):
Version(用来设定版本):
Release( 用来设定发行版): 1%{?dist}
Summary(用一句话概括改软件包的信息):
License(软件授权方式,通常是GPL或者GPLv2,BSD):
URL(软件的主页):
Source(远程软件包的名字如name-0.0.1.tar.gz):
BuildRequires(制作过程中用到的软件包,构建依赖):
Requires(安装时锁需要软件包):
%description(软件包详细说明,可写在多行上)
%prep
%autosetup
%build
%configure
%make_build
%install
rm -rf $RPM_BUILD_ROOT
%make_install
%files
%license add-license-file-here
%doc add-docs-here
%changelog
* Thu Feb 10 2022 root
-
认识SPECFILE文件中的Macros
在Specfile中有大量的%{} 结构的关键字,他们是事先定义好的宏。
什么是宏我将不做详细介绍,如有兴趣可以点击此次进行了解。
宏(Macro)在计算机科学中是一种抽象(Abstraction)概念,它可以根据一系列预定义的规则替换一定的文本模式,常用于批量处理任务。当解释器或编译器遇到宏时,会自动进行模式替换。在编译语言中,宏的展开(替换)通常发生在编译时,负责这一过程的工具被称为宏展开器。此外,“宏”这一概念也被广泛应用于其他领域,如键盘宏和宏语言,它们都是基于宏展开的概念。在大多数情况下,“宏”这个词的使用意味着将小命令或动作转化为一系列指令,即多个命令组织在一起,作为一个单独的命令来完成一个特定的任务。
这些宏可以通过rpm —eval进行查看,也可以在Specfile中通过define关键字进行自定义。
%define major_version 1
%define minor_version 4
%define micro_version 4
%define prog_name pname
%define prog_dir /var/lib/pname
定义好的宏,可以在文件中直接引用。
Version: %{major_version}.%{minor_version}.%{micro_version}
x86平台上制作rpm demo
创建rpmbuild目录
rpmdev-setuptree
创建Demo软件包,等一下我们会通过rpm发布这个demo包
mkdir rpmbuild-1.0
vim rpmbuild-1.0/rpmbuild_hello.sh
cat rpmbuild-1.0/rpmbuild_hello.sh
#!/usr/bin/env bash
echo "Hello rpmbuild"
chmod +x rpmbuild-1.0/rpmbuild_hello.sh
打包
tar czvf rpmbuild/SOURCES/rpmbuild-1.0.tar.gz rpmbuild-1.0/
rpmbuild-1.0/
rpmbuild-1.0/rpmbuild_hello.sh
创建与编辑SPECFILE
rpmdev-newspec rpmbuild/SPECS/rpmbuild.spec
rpmbuild/SPECS/rpmbuid.spec created; type minimal, rpm version >= 4.15.
#编辑生成的样本文件
vim rpmbuild/SPECS/rpmbuild.spec
生成rpm包
rpmbuild -bb rpmbuild/SPECS/rpmbuild.spec
ls rpmbuild/RPMS/x86_64/rpmbuild-1.0-1.ky10.x86_64.rpm
rpmbuild/RPMS/x86_64/rpmbuild-1.0-1.ky10.x86_64.rpm
注意这里的x86_64目录是根据平台自动生成的。
安装rpm包并测试
rpm -ivh rpmbuild/RPMS/x86_64/rpmbuild-1.0-1.ky10.x86_64.rpm
Verifying... ################################# [100%]
准备中... ################################# [100%]
正在升级/安装...
1:rpmbuild-1.0-1.ky10 ################################# [100%]
rpm -ql rpmbuild
/opt/rpmbuild/rpmbuild_hello.sh
/opt/rpmbuild/rpmbuild_hello.sh
Hello rpmbuild
看到以上内容,则测试通过,代表我们制作的rpm包可以正常使用。
总结
- RPM 档案本身为已经编译过的 binary 档案,可以让 client 端的使用者免除重新编译的困扰;
- RPM 档案在被安装之前,RPM 会先检查系统的磁盘容量、作业系统版本等,可避免档案被安装错误;
- RPM 档案本身提供软件版本信息、相依赖性软件名称、软件用途说明、软件所含档案等信息,便于了解软件;
- RPM 管理的方式使用资料库记录 RPM 档案的相关参数,便于升级、移除、查询与验证。
本次实验从最开始的打包环境构建开始,带大家一步一步完成一个最简单的打包demo。在此基础之上,实际动手打包可用于生产环境的redis与mysql。