AIX系统作为一个“古老”的Unix系统,如今伴随着IBM公司的Power系列小型机依旧存在于众多银行、电信公司以及其他大型企业的数据中心。虽然其江湖地位不如从前,但其他设备厂商仍不舍得放弃对AIX的支持。而ODM驱动程序是对其支持的必要条件。

# 什么是ODM?

ODM(Object Data Manager),顾名思义就是管理系统对象数据的系统工具。我们熟悉的Windows系统中,有个叫注册表(Register)的部件,存有许多系统和软件的相关配置,ODM大体可以理解为AIX系统的“注册表”。 AIX系统中的ODM主要存储两大类:

  • 设备(网卡、HBA卡、磁带、硬盘等)及其配置信息
  • 软件(3rd part、SMIT工具)及其配置信息

详细的介绍可以参照这篇博文AIX ODM 简介 (opens new window).

# AIX为什么有ODM?

先说类似的Windows的注册表,学生时代,有过一行修改注册表的CMD命令修好同学电脑时的自豪感,也有过改错了注册表系统被迫重装的尴尬境地。Windows作为大众玩家的系统,大家对注册表的诟病颇多,因为其不像Linux一样,可以轻松编辑配置文件。软件安装或者卸载过程中出现问题,难以解决。

既然Windows的注册表是问题颇多的,那AIX为什么会一直采用这样的ODM系统呢?其原因大概有:

  • AIX是商用系统,会对底层的信息做一些屏蔽,
  • 运维人员都是专业技术人员,一般不至于因为错误修改ODM而导致系统崩溃,
  • 屏蔽软件的配置过程,更有利于安全地使用,
  • 集中存放配置信息,读取更加高效。

不过在其他商用的Unix/Linux系统中,例如HP-UX、Solaris、RHEL、SLES中都没有像这样的集中式系统及软件配置系统。大多数系统还是分散的配置文件形式。

而到底是集中配置系统好,还是分散的自由配置文件好,恐怕又会上升到“集中式--分布式之争”。

# ODM具体存在形式及相关操作

ODM以二进制文件的方式存在于:

  • /etc/objrepos: 主要包含Cu*类的文件,其Pd*类为/usr/lib/objrepos/Pd*类的软链接
  • /usr/lib/objrepos:主要包含预定义的Pd*类文件
  • /usr/share/lib/objrepos:仅包含软件相关信息(SWVPD)

主要的对象文件:

  • PdDv:设备类别定义
  • PdAt:某一设备类别的相关参数定义
  • CuDv:具体某一设备
  • CuAt:具体某一设备的相关参数值

ODM文件内容为Stanza样式,如:

PdAt:
        uniquetype = "logical_volume/vgsubclass/vgtype"
        attribute = "quorum"
        deflt = "y"
        values = ""
        width = ""
        type = "R"
        generic = ""
        rep = "sl"
        nls_index = 0

相关操作命令:

  • 查询:odmget -q "name=hdisk0" CuDv
  • 删除:odmdelete -q "name=hdisk11" -o CuAt
  • 增加:odmadd /odmadd/file/path

# ODM开发中的主要部分介绍

各个厂商或者IBM自己的AIX程序,下载解压后,一般是*.rte文件(runtime environment file),可以直接installp命令行安装,或者用SMIT界面交互式工具来安装。而安装时,必须选择具体的fileset(一个*.rte安装程序可能包含多个fileset)。

# 打包需要的几个重要文件

  • lpp_name: AIX 软件包应当包含的一个文件,里面纪录软件包以及fileset的依赖、版本、名称、附带文件大小等信息。有固定的格式,如下面的一个简单例子。具体字段意义可以参看IBM Knowledge Center

    4 R S farm.apps {
    farm.apps.hog04.01.0000.0003 1 N U en_US Hog Utilities
    # ...
    [
    *ifreq bos.farming.rte (4.2.0.0) 4.2.0.15
    %
    /usr/sbin 48
    /usr/lpp/farm.apps/farm.apps.hog/4.1.0.3 280
    /usr/lpp/farm.apps/farm.apps.hog/inst_root/4.1.0.3.96
    /usr/lpp/SAVESPACE 48
    /lpp/SAVESPACE 32
    /usr/lpp/bos.hos/farm.apps.hog/inst_root/4.1.0.3/ etc 32
    %
    %
    ranch.hog 4.1.0.0
    %
    IX51366 Hogs producing eggs.
    IX81360 Piglets have too many ears.
    ]
    }
    
  • liblpp.a: 一个压缩归档文件,里面包含软件安装或者更新所需的对象信息文件及执行脚本,可以用ar -x liblpp.a反向解压出所含文件。其中几个重要文件:

    • fileset.inventory: 文件清单表,包含fileset需要的工具或者脚本文件的具体信息,比如大小、所属用户组、可执行情况,
    • fileset.config: shell脚本文件,在安装或者更新的最后执行,
    • fileset.odmdel: 在添加新的之前,用于删除ODM实体的脚本,
    • fileset.odmadd: 核心文件,定义了所有ODM类型和属性的信息,Stanza样式,
    • fileset.pre_i、fileset.pre_d、fileset.pre_rm: 故名思意,安装程序之前(i)、卸载程序之前(d)、移除附带文件之前(rm)运行的脚本。

# ODM对象及属性定义(设备驱动)

之前提到liblpp.a这个库文件里面有一个核心文件fileset.odmadd,里面便是需要注入系统ODM的自定义对象信息。 对于设备驱动程序的开发,定义这样的文件是基础。

  • PdDv: 定义设备对象,具体参数意义可参照Predefined Devices (PdDv) Object Class (opens new window)
  • PdAt: 某一对象的属性定义,可参照Predefined Attribute (PdAt) Object Class (opens new window),而又有哪些参数可以定义呢,IBM官方会有一个叫IHV_ODM_INSTALL的PDF文档来说明。那这个文档哪里获取呢?其实IBM把它放在了你的操作系统里,检查一下这个路径/usr/lpp/devices.common.IBM.mpio/。这些参数里,比较重要的一些:
    • model_map:读取SCSI Standard Inquiry Page或者VPD Page的相关字段,来识别设备的一个参数。设对它才是设备接入的第一步,
    • model_data:设备启动时需要的,
    • model_default
    • vpd_map:读取VPD Page的相关字段信息,解析给操作系统,会成为lsdev -l xxx输出的结果。
    • PCM:设备会选用哪种PCM(Path Control Module),使用AIX系统自带多路径管理软件MPIO的时候,需要定义。当然,可以自己定义一个PCM对象,放在这里引用。
    • 注意:这个IHV_ODM_INSTALL并非包含所有系统的可设参数,有一些涉及I/O的参数,需要与IBM工程师沟通来设定。

# Reference

[1] IBM Knowledge Center, Offical, https://www.ibm.com/support/knowledgecenter/ssw_aix_72/generalprogramming/odm.html (opens new window)
[2] AIX for System Administrators, Blog, http://aix4admins.blogspot.com/2011/08/odm-object-data-manager-it-is-database.html (opens new window)
[3] Understanding the AIX Object Data Manager, Training, www.globalknowledge.com
[4] General Programming Concepts: Writing and Debugging Programs, Book.