工欲善其事必先利其器

RPM 打包

Reference

https://www.ibm.com/developerworks/cn/linux/l-rpm/

RPM

RPM全称是 Red Hat Package Manager(Red Hat包管理器)。

AliOS7 为 CentOS7修改版本,CentOS属于Red Hat的发行版本,因此可以使用RPM进行软件包管理安装、更新和卸载软件。

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

Linux 发行版大图

https://zhuanlan.zhihu.com/p/30306352

RPM 功能

  • 安装
  rpm -i ( or --install) options file1.rpm
  rpm  -ivh  file1.rpm
  # 常用选项解释,主要是为了显示详细安装或者解压信息
  -h, --hash
      Print 50 hash marks as the package archive is unpacked.  Use with -v|--verbose for a nicer display.
  -v|--verbose
       Print verbose information - normally routine progress messages will be displayed
  • 卸载
  rpm -e ( or --erase) options pkg1 ... pkgN 
  # 如果某个软件包你再也不想使用了,那就用以上这个命令彻底的把你指定的rpm软件包清除掉把。
  • 升级
  rpm -U ( or --upgrade) options file1.rpm ... fileN.rpm 
  # 由于开源软件更新速度快,用户当然要使用最新版本的软件包,此时最合适的就是rpm升级功能,当然最理想的参数选项就是-Uvh。
  • 查询
  rpm -q ( or --query) options 
  # 实际上我们通常使用rpm工具最多的功能还是它的查询功能,比如查看软件包的版本、依赖关系等软件包的详细说明都要用到。最有用的参数选项是
  -qpi
  --provides
   List capabilities this package provides.
  -i, --info
   Display package information, including name, version, and description.  This uses the --queryformat if one was specified.
  • 验证 RPM另一个强大的功能是进行软件包的验证。如果我们担心误删了某个软件包中的某个文件,我们就可以对它进行验证。任何非正常现象将会被通知。如果需要的话还可以重新安装该软件包。在重新安装过程中,所有被修改过的配置文件将被保留。
  rpm -V ( or --verify, or -y) options 

spec文件规范

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

  • 文件头 一般的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 Interface/Desktops(用户界面/桌面)
   User Interface/X (用户界面/X窗口)
   User Interface/X Hardware Support (用户界面/X硬件支持)

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

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

  1. %prep段 这个段是预处理段,通常用来执行一些解开源程序包的命令,为下一步的编译安装作准备。%prep和下面的%build,%install段一样,除了可以执行RPM所定义的宏命令(以%开头)以外,还可以执行SHELL命令,命令可以有很多行,如我们常写的tar解包命令。
  2. %build段 本段是建立段,所要执行的命令为生成软件包服务,如make 命令。
  3. %install段 本段是安装段,其中的命令在安装软件包时将执行,如make install命令。
  4. %files段 本段是文件段,用于定义软件包所包含的文件,分为三类–说明文档(doc),配置文件(config)及执行程序,还可定义文件存取权限,拥有者及组别。
  5. %changelog段 本段是修改日志段。你可以将软件的每次修改记录到这里,保存到发布的软件包中,以便查询之用。每一个修改日志都有这样一种格式:第一行是:* 星期 月 日 年 修改人 电子信箱。 eg
   * Fri Mar 02 2018 yuemin.wym
   - support Resnet

其中:星期、月份均用英文形式的前3个字母,用中文会报错。接下来的行写的是修改了什么地方,可写多行。一般以减号开始,便于后续的查阅。

值得注意的问题

https://blog.51cto.com/chouketsu/1569603

https://www.redhat.com/archives/rpm-list/2007-November/msg00020.html

  • 制作rpm包时,有时包含python程序,一般默认的行为:打包时对python脚本会编译成pyc,pyo字节码文件并一起放在rpm包中,这可能导致打包时引用文件缺失的错误
  • 如果不需要这些字节码文件,可以修改
  vim /usr/lib/rpm/brp-python-bytecompile

找到编译pyc,pyo的两条命令,并将其注释,或者直接在脚本开头就用exit 0 退出。

  • 或者
  注释文件/usr/lib/rpm/redhat/macros里的/usr/lib/rpm/brp-python-bytecompile

  vim /usr/lib/rpm/redhat/macros
  # 注释掉即可
  /usr/lib/rpm/brp-python-bytecompile
  • 但是要注意,如果已经打了一次包并在pyc,pyo文件缺失的步骤上失败,则打包的临时目录中可能残留了文件,需要把临时目录(通常在/var/tmp/下)删掉,然后重新执行打包操作。
RPM 改变文件大小

https://zhuanlan.zhihu.com/p/25152974

打包的rpm被解压,发现有些可执行文件变小。

原因:

因为默认打包的话是release版本;打包过程中会将debug信息去掉。

因此可以在spec文件里添加 以保留一些调试信息。

%define __strip /bin/true

# 或者将 下面这行注释掉,
%define debug_package %{nil}