当前位置:操作系统 > Unix/Linux >>

RPM打包技术与典型SPEC文件分析

本文分为两部分,第一部分阐述了 rpm 工具的功能以及 rpmbuild 工具,详细的介绍了 spec文件的书写规则以及关键部分,第二部分对一个典型的 spec 文件做了详细的分析。

  为了方便朋友们查看,我找了中文的rpmbuild 的MAN 附在最后

  一 、rpm 介绍

  1. 概述

  RPM全称是 Red Hat Package Manager(Red Hat包管理器)。几乎所有的 Linux 发行版本都使用这种形式的软件包管理安装、更新和卸载软件。

  RPM 是一个开放的软件包管理系统。它工作于Red Hat Linux以及其它Linux和UNIX 系统,可被任何人使用。redhat软件公司鼓励其它厂商来了解RPM并在自己的产品中使用它。RPM的发布基于GPL协议。对于最终用户来说,使用 RPM所提供的功能来维护系统是比较容易和轻松的。安装、卸载和升级RPM软件包只需一条命令就可以搞定。RPM维护了一个所有已安装的软件包和文件的数据库,可以让用户进行查询和验证工作。在软件包升级过程中,RPM会对配置文件进行特别处理,绝对不会丢失以往的定制信息。对于程序员RPM可以让我们连同软件的源代码打包成源代码和二进制软件包供最终用户使用。

  RPM拥有功能强大的查询选项。我们可以搜索数据库来查询软件包或文件。也可以查出某个文件属于哪个软件包或出自哪儿。RPM软件包中的文件是以压缩格式存放的,拥有一个定制的二进制头文件,其中包含有关包和内容的信息,可以让我们对单个软件包的查询简便又快速。

  RPM另一个强大的功能是进行软件包的验证。如果我们担心误删了某个软件包中的某个文件,我们就可以对它进行验证。任何非正常现象将会被通知。如果需要的话还可以重新安装该软件包。在重新安装过程中,所有被修改过的配置文件将被保留。

  RPM设计目标之一就是要保持软件包的原始特征, 就象该软件的原始发布者发布软件时那样。通过使用RPM我们可以拥有最初的软件和最新的补丁程序,还有详细的软件构建信息。

  概括的说:RPM有五种基本的操作功能(不包括创建软件包):安装、卸载、升级、查询、和验证。关于rpm命令的使用我们可以用以下命令:

  [root@hostname root]rpm -help

  来获的。

  2.RPM工具功能

  1) 安装

  rpm -i ( or --install) options file1.rpm ... fileN.rpm 通过rpm -ivh可以把rpm软件包安装到系统中,当然也可以使用不同的参数选项,笔者建议使用-ivh ,使用该选项可以解决大部分rpm软件包的安装,至于详细的参数说明可用查看rpm的man 文档。

  2 )删除

  rpm -e ( or --erase) options pkg1 ... pkgN 如果某个软件包你再也不想使用了,那就用以上这个命令彻底的把你指定的rpm软件包清除掉把。

  3 )升级

  rpm -U ( or --upgrade) options file1.rpm ... fileN.rpm 由于开源软件更新速度快,用户当然要使用最新版本的软件包,此时最合适的就是rpm升级功能,当然最理想的参数选项就是-Uvh。

  4 )查询

  rpm -q ( or --query) options 实际上我们通常使用rpm工具最多的功能还是它的查询功能,比如查看软件包的版本、依赖关系等软件包的详细说明都要用到。最有用的参数选项是-qpi。

  5 )校验已安装的软件包

  rpm -V ( or --verify, or -y) options 一般我们可用通过该命令来验证已安装软件包,根据笔者的经验该命令一般没什么用途,只做一个了解就ok了。

  3.spec文件规范

  能熟练掌握以上命令以及部分参数含义,管理日常的rpm软件包就不成问题了。然而随着Linux风靡全球,越来越多的开发者喜欢采用RPM格式来发布自己的软件包。那么RPM软件包是怎样制作的呢?对大多数Linux开发工程师来说是比较陌生的。

  其实,制作RPM软件包并不是一件复杂的工作,其中的关键在于编写SPEC软件包描述文件。要想制作一个rpm软件包就必须写一个软件包描述文件(SPEC)。这个文件中包含了软件包的诸多信息,如软件包的名字、版本、类别、说明摘要、创建时要执行什么指令、安装时要执行什么操作、以及软件包所要包含的文件列表等等。

  描述文件说明如下:

  (1) 文件头

  一般的spec文件头包含以下几个域:

  Summary:

  用一句话概括该软件包尽量多的信息。

  Name:

  软件包的名字,最终RPM软件包是用该名字与版本号,释出号及体系号来命名软件包的。

  Version:

  软件版本号。仅当软件包比以前有较大改变时才增加版本号。

  Release:

  软件包释出号。一般我们对该软件包做了一些小的补丁的时候就应该把释出号加1。

  Vendor:

  软件开发者的名字。

  Copyright:

  软件包所采用的版权规则。具体有:GPL(自由软件),BSD,MIT,Public Domain(公共域),Distributable(贡献),commercial(商业),Share(共享)等,一般的开发都写GPL。

  Group:

  软件包所属类别,具体类别有:

  Amusements/Games (娱乐/游戏)

  Amusements/Graphics(娱乐/图形)

  Applications/Archiving (应用/文档)

  Applications/Communications(应用/通讯)

  Applications/Databases (应用/数据库)

  Applications/Editors (应用/编辑器)

  Applications/Emulators (应用/仿真器)

  Applications/Engineering (应用/工程)

  Applications/File (应用/文件)

  Applications/Internet (应用/因特网)

  Applications/Multimedia(应用/多媒体)

  Applications/Productivity (应用/产品)

  Applications/Publishing(应用/印刷)

  Applications/System(应用/系统)

  Applications/Text (应用/文本)

  Development/Debuggers (开发/调试器)

  Development/Languages (开发/语言)

  Development/Libraries (开发/函数库)

  Development/System (开发/系统)

  Development/Tools (开发/工具)

  Documentation (文档)

  System Environment/Base(系统环境/基础)

  System Environment/Daemons (系统环境/守护)

  System Environment/Kernel (系统环境/内核)

  System Environment/Libraries (系统环境/函数库)

  System Environment/Shells (系统环境/接口)

  User Inte易做图ce/Desktops(用户界面/桌面)

  User Inte易做图ce/X (用户界面/X窗口)

  User Inte易做图ce/X Hardware Support (用户界面/X硬件支持)

  Source:

  源程序软件包的名字。如 stardict-2.0.tar.gz。

  %description:

  软件包详细说明,可写在多个行上。

  (2)%prep段

  这个段是预处理段,通常用来执行一些解开源程序包的命令,为下一步的编译安装作准备。%prep和下面的%build,%install段一样,除了可以执行RPM所定义的宏命令(以%开头)以外,还可以执行SHELL命令,命令可以有很多行,如我们常写的tar解包命令。

  (3)build段

  本段是建立段,所要执行的命令为生成软件包服务,如make 命令。

  (4)%install段

  本段是安装段,其中的命令在安装软件包时将执行,如make install命令。

  (5)%files段

  本段是文件段,用于定义软件包所包含的文件,分为三类--说明文档(doc),配置文件(config)及执行程序,还可定义文件存取权限,拥有者及组别。

  (6)%changelog段

  本段是修改日志段。你可以将软件的每次修改记录到这里,保存到发布的软件包中,以便查询之用。每一个修改日志都有这样一种格式:第一行是:* 星期 月日 年 修改人电子信箱。其中:星期、月份均用英文形式的前3个字母,用中文会报错。接下来的行写的是修改了什么地方,可写多行。一般以减号开始,便于后续的查阅。

  4.打包

  如果想发布rpm格式的源码包或者是二进制包,就要使用rpmbuild工具(rpm最新打包工具)。如果我们已经根据本地源码包的成功编译安装而写了 spec文件(该文件要以.spec结束),那我们就可以建立一个打包环境,也就是目录树的建立,一般是在/usr/src/redhat/目录下建立5 个目录。它门分别是BUILD、SOURCE、SPEC、SRPM、RPM。其中BUILD目录用来存放打包过程中的源文件,SOURCE用来存放打包是要用到的源文件和patch,SPEC用来存放spec文件,SRPM、RPM分别存放打包生成的rpm格式的源文件和二进制文件。当然我们可以根据需要来选用不同的参数打包文件,笔者总结如下3条。

  1) 只生成二进制格式的rpm包

  rpmbuild -bb xxx.spec

  用此命令生成软件包,执行后屏幕将显示如下信息:(每行开头为行号)

  1 Executing: %prep

  2 + umask 022

  3 + cd /usr/src/dist/BUILD

  4 + exit 0

  5 Executing: %build

  6 + umask 022

  7 + cd /usr/src/dist/BUILD

  生成的文
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,