软件包搭建对于操作系统来说是基础的,也是非常重要的事情。在目前的Linux操作系统生态中,不同的发行版有不同的打包方式。本文整理自龙蜥大讲堂第二期技术直播,以龙蜥社区发布的龙蜥操作系统为例,介绍rpm包构建的一些内容。一、Linux操作系统常用的软件包管理方法操作系统实际上是一个庞大的软件集合,数百个软件之间存在着各种相互调用、相互依赖等复杂关系。因此,统一的软件包格式可以更加友好地管理和定义这些复杂的关系。Linux操作系统中常见的软件包格式有:以redhat为代表的rpm系列,以debian为代表的deb系列(图1)。图1两种常见软件包格式示例从图1可以直观看出,扩展名为.rpm的rpm包和扩展名为.deb的deb系列包对同一组源码包使用不同的打包工具,在它们各自的环境,可以将这两种格式的软件包打包。.rpm使用rpmbuild系列命令,与spec文件打包在一起。.deb使用dpkg系列命令与控制文件打包。大多数开发者都习惯在Linux中使用tarball来分发软件,难道他们不能也编译安装吗?当然可以,但是tarball编译安装的方式在管理上没有那么方便,操作起来也比使用打包编译的rpm或者deb要复杂。所以我们希望更多的开发者能够将自己的源代码打包发布到操作系统软件源中,或者将源代码贡献给DragonLizard社区。rpm或deb。在不同的Linux发行版中,它是为了更好地管理和分发软件。2.DragonLizard操作系统的软件包组织形式DragonLizard操作系统使用rpm来管理。图2rpm包信息示例如左图2所示,rpm-ql命令可以直观的看到systemd-libs包的文件目录结构和安装路径。如图2右侧,rpm-qi–provide可以看到包名、发布号、版本号等基本信息,加上–provide参数可以打印出符号、库等自己提供的资料,很详细,一目了然。命令并不复杂,显然比tarball编译安装方便。3、操作系统的软件资源管理图3软件资源管理对于操作系统等基础系统软件,其功能一般分为硬件管理和软件管理。我们说软件包格式定义了软件资源管理方式,那么什么是软件资源管理呢?有哪些软件资源?如图3所示,软件资源包括各种系统程序、各种应用程序、各种用户程序,以及大量的文档资料、库函数等,每个软件资源本身就是具有一定逻辑关系的相关信息的集合意思,它们以文件的形式存储在操作系统中。通俗地说:这些软件对应的静态文件在哪里,安装在哪个目录,库函数调用的路径等等?比如一些man手册,.so文件等等,可执行文件怎么存放,这些都是软件资源管理定义的内容。从某种意义上说,在操作系统中,软件资源管理是通过软件包来实现的。我们从软件包打包的角度来体现操作系统软件资源管理。图4文件系统层次结构图DragonLizard操作系统的文件系统层次结构就是一个很好的例子。图4中的目录分配基于FHS(文件系统层次结构)标准。如果已经定义,则按照规则进行开发。当然,根据FHS标准,每个release版本也有些不同。FHS只定义了应该放在最顶层根目录下的文件或目录数据,以及根目录下目录的内容。因此,在其他子目录层次,可以根据开发者的需求进行配置。比如centos的网络配置放在/etc/sysconfig/network-scripts/目录下,而suse把网络配置放在/etc/sysconfig/network/下,所以目录名不同,但是只要FHS标准是遵循的,差异性其实是有限的。关于FHSFHS(FilesystemHierarchyStandard):是由Linux爱好者自发组成的一个团体,主要是对Linux做出一些基本的要求。FHS的官方文档(http://www.pathname.com/fhs/)指出他们的主要目的是让用户知道安装软件通常放置的目录,所以希望独立软件开发者,操作系统创作者,以及想要维护系统的用户都可以遵循FHS标准。换句话说,FHS的重点是规范每个具体目录应该放什么样的数据。这样做的好处有很多,因为Linux操作系统可以在现有的面貌下(目录结构不变)开发出开发者想要的独特风格。事实上,FHS一直在根据以往的经验不断修订。根据文件系统的使用频率和是否允许用户随意更改,FHS将目录定义为四种交互形式,如表1所示:表1FHS交互定义表图5系统目录功能分配简图目录hierarchy定义好了,接下来就是看目录功能的分配了,包括每个区域的用途,需要的最小组成文件和目录,图5包含了这些目录的功能。随着操作系统的不断发展,我们发现基本的rpm在功能上存在一些不便之处。一般我们发行版提供的软件版本只会有一个大版本,但这个版本有时不能满足开发者的需求。根据自己的实际情况,可能需要更高或更低的版本来支持自己的开发,这就需要开发者自己搭建,或者使用第三方、非官方的软件仓库。这对开发人员来说浪费了很多时间。因此,新功能--module就是为了解决这个问题。Module是一个模块化的包,但它不像非模块化包那样只是一个rpm文件,它代表了一个或多个rpm包和元数据文件的集合,这些包是模块构建过程的产物。模块的元数据可以定义多个rpm文件和模块,它们被捆绑并安装在主机系统上。作为rhel8系列发布的一种新的rpm包管理方式,Anolis也被支持并应用于目前所有正式发布的Anolis8系列操作系统。Module其实就是rpm的再管理。通过细分不同版本主包的依赖,以模块为单位。因此,模块实际上是一个集合。就个人而言,我通常将其理解为一个群体。一个模块组。但正式名称叫做“stream”。Anolis每个版本仅提供一个受支持的主要软件版本。这意味着如果您需要自己使用不受支持的版本,您将不得不自己构建它或依赖于一些非官方的存储库。以下示例更好地说明了这种情况:场景1(图6)一些用户安装来自不同Anolis版本的软件包,以便使用与其应用程序兼容的特定版本的数据库。但由于模块化,他们可能不必再这样做了,因为每个Anolis版本都提供了多个版本的数据库。他们所需要做的就是直接从Anolis存储库中为他们的系统使用该数据库的特定流。图6postgresql模块场景2(图7)在某些情况下,用户无法将他们的系统升级到新的Anolis版本,因为他们的应用程序无法在升级后的新版本语言运行库中运行。模块化可以通过在两个Anoils版本中提供相同的语言版本来解决这个问题。这样,用户可以使用特定的语言流,并在升级系统时保留它。当应用程序准备好使用新语言版本时,以后可以通过切换到不同的流来独立于操作系统进行升级。图7Python多版本模块DragonLizard操作系统一般采用rpm来管理软件包,同时提供模块等特性,更友好的支持对软件版本有不同要求的开发者和用户。4.rpm包构建分析图8rpm构建工具集关系图构建工具集Spec文件spec文件是rpm包构建的核心定义,利用spec文件和其他构建工具对rpm进行打包。Rpmbuildrpmbuild是最基本的构建工具,用于解析和执行spec文件。Mock是一个用于创建干净的构建环境以根据软件依赖关系构建rpm包的工具。KojiRpm包编译构建系统。前面我们提到的软件资源管理,其中涉及到的文件存储位置的定义,以及文件的内容直接体现在spec文件中。前面的规则是用来帮助我们编写spec文件的,也就是编译规则。我们在spec文件中一字不差地定义了软件的编译方式、编译命令、安装路径以及各种文件应该放在什么位置,让源代码按照我们指定的方式构建一个可执行的安装文件。因此,spec文件是rpm包构建的标准约束。我们一般直接使用rpmbuild进行本地构建。通常我们使用mock工具构建一个不受系统环境影响的rpm包。它和rpmbuild唯一的区别在于它可以创建一个专门用于编译的纯环境,它只安装用于编译的部分依赖包和必要的编译器和编译工具,mock可以使用不同的软件仓库来构建软件包,即也就是说,它可以指定模拟不同的编译环境。在龙蜥社区,我们使用koji完成了大量的构建。Koji是一个开源的rpm编译系统,它源自于fedora。它使用mock来模拟构建环境,可以将创建的编译任务自动调度到不同架构的机器上,从而实现同源和异构,koji作为一个能够实现同源和异构的编译构建系统,被广泛应用于操作系统研发领域使用rpm作为软件资源管理,其可靠性和稳定性也非常高。这三个工具是一层一层的关系,如图8所示,最后都是解析并执行spec文件。spec文件分析图9Spec文件示例图9示例的spec文件是rpm包的灵魂。要构建一个标准的RPM包,你需要创建一个.spec文件,其中包含了软件包的所有信息。规范文件中定义了许多重要的步骤和阶段。图10简要列出了6个关键阶段和具体操作。图10spec文件中定义的主要阶段示意图图11rpmbuild工具宏定义目录示意图我们在编写spec文件的时候会有大量的宏定义,这些宏定义在rpm构建中也非常重要process,我们推荐先使用系统或者rpm工具定义的一些宏定义来编写spec文件,尤其是一些build目录。图11是一些常用目录对应的宏定义示例。以上是DragonLizard操作系统中软件包管理方法和构建方法的一些要点。希望能对所有对龙蜥社区感兴趣,有志于加入国产开源操作系统开发的人有所帮助。当然,如果你是设计者、翻译者、运营者,龙蜥社区也可以成为大家大展拳脚的平台。以下是龙蜥社区产品发布SIG组的目标和简介:制定、发布和维护龙蜥社区的封装规范、封装原则和依赖规范;落实技术委员会包引入和退出机制,预审软件包进入社区进行发布版本申请,运营/QA团队共同规划配套社区版本的发布流程;维护和管理AnolisOS版本中软件包的基线列表;维护和管理AnolisOSSIG组软件包;协调各个SIG组的软件包划分,依赖冲突等;AnolisOS问题单处理和子字段所有者协调和分配。加入产品发布SIG群欢迎更多开发者加入产品发布SIG:网址:https://openanolis.cn/sig/SIG...邮件列表:os@lists.openanolis.cn图片为重点本次直播视频回放已上线龙蜥社区官网(首页-支持-视频)。直播PPT获取方式:关注龙蜥社区公众号,后台回复【龙蜥课件】或【龙蜥视频播放】。图12龙百合社区官网截图—完—加入龙百合社区加入微信群:添加社区小助手-龙百合社区小龙(微信:openanolis_assis),注意【龙百合】拉入群组;加入钉钉群:扫描下方钉钉二维码。欢迎开发者/用户加入OpenAnolis社区(OpenAnolis)进行交流,共同推动OpenAnolis社区的发展,共同打造活跃健康的开源操作系统生态!关于龙蜥社区龙蜥社区(OpenAnolis)是由企事业单位、高等院校、科研单位、非营利性组织、个人在自愿、平等、开源和协作。DragonLizard社区成立于2020年9月,旨在打造一个开源、中立、开放的Linux上游发行社区和创新平台。短期目标是开发AnolisOS作为CentOS的替代品,并重建与国际主流Linux厂商兼容的发行版。中长期目标是探索打造面向未来的操作系统,建立统一的开源操作系统生态,孵化创新开源项目,繁荣开源生态。DragonLizardOS8.4已发布,支持x86_64、ARM64、LoongArch架构,完美适配Intel、飞腾、海光、兆芯、鲲鹏、龙芯等芯片,提供全栈国密支持。欢迎下载:https://openanolis.cn/download加入我们,共同打造面向未来的开源操作系统!https://openanolis.cn
