<转> 希望尽快了解 AIX 的核心组件 ODM,能更好的认识和解决 AIX ODM 相关的疑难问题。
ODM 是 Object Data Manager 的简称。它是一个采用面向对象的方法来管理系统数据的工具集。这个工具集的作用是提供一些基本命令来保存系统配置信息的。系统的配置信息会通过这个工具集保存到指定的二进制的文件中。
构成 ODM 的基本组件是对象类和对象。要管理对象类和对象,必须使用 ODM 命令和 ODM 的 C 语言函数库。我们可以利用这些接口程序为数据存储和管理创建对象类和对象。
接下来,我们来了解一下 ODM 相关二进制文件的具体分布和一些基本的 ODM 命令。
ODM 数据库信息存放于以下三个目录中:
(1)/etc/objrepos
(2)/usr/lib/objrepos
(3)/usr/share/lib/objrepos
对于(1)里面的数据,主要是存储不能网络共享的数据。比如:用户设备定义类等等。
对于(2)里面的数据,主要是存储可共享,但只能被 AIX 系统共享,并且是只读的数据。
对于(3)里面的数据,主要是存储可共享,不依赖于 AIX 的数据。
你可以通过下面的命令判断默认被 AIX 系统使用的 ODM 存储文件。

让我们看看这个目录里面都有些什么。

这里有 2 类文件需要重点介绍一下。
(1)Pd* 文件
这些文件是系统预定义的 objects,不能被修改,在 AIX 系统安装的时候被创建的。
(2)Cu* 文件
这些文件是用户自定义的 objects,可以被修改。
ODM 的基本命令分为两类:
第一类是对对象的操作。
1)odmadd 添加对象到对象类。
2)odmchange 改变指定的 ODM 对象类中指定的 ODM 对象。
3)odmdelete 从 ODM 对象类中删除 ODM 对象。
4)odmget 取得对象类的信息并将对象信息变成 odmadd 命令格式输出。
第二类是对对象类的操作。建议大家慎用下面的命令,因为这些命令是对 ODM 对象类的操作。
1)odmcreate 创建空的对象类。
2)odmdrop 删除整个 ODM 对象类。
3)odmshow 显示 ODM 对象类的描述。odmshow 命令使用对象名称作为输入并将对象信息变成 odmcreate 命令格式。
下面我们通过实际的事例来了解一些 ODM 基本命令的用法。
odmget 命令以搜索规则和对象类列表为输入,从指定的对象类中检索选定的对象,并输入到标准输出。
下面是它的命令格式:
odmget [ -q Criteria ] ObjectClass ... |
其中,-q Criteria 指定用于从对象类中选择对象的搜索标准。Criteria 是一个用双引号括起来的字符串。如果没有指定标准,检索对象类中的所有对象。 Criteria 参数指定的查询条件可以使用关系运算符和布尔运算符,象 =,!=,>,>=,<,<=,like,and 等。
下面是一些使用运算符的例子:
Name like '?B?' ? 表示一个字符
Name like '*ot*' * 表示 0 到多个字符
Name like '[ST]*' [ST]* 表示以"S"或"T"开头的任意多个字符串
Name like '[AD-GST]*' D-G 表示范围,可以是 D、E、F、G(从 D 到 G)中任一字符。
Name like '[!ST]*' [!ST]* 表示不以"S"或"T"打头的任意字符串
下面的举例是:
1)首先显示 erProduct 这个对象类的基本信息
2)然后找出符合 erFTDC=0 这样条件的 erProduct 对象。
图 3

odmdelete 命令在给定了要从中删除的对象类和搜索规则后,会删除所有满足标准的对象。
下面是它的命令格式:
odmdelete -o ObjectClass [ -q Criteria ] |
其中,-o ObjectClass 指定要从中删除的对象类。-q 标准指定用于从对象类中选择对象的标准。 如果没有指定标准,删除所有对象。
下面的举例是:
1)首先显示 rsDDMTable 这个对象类的基本信息
2)然后删除符合 ddmFamily=ASNF300 这样条件的 rsDDMTable 对象。
图 4

odmchange 命令将修改指定对象类中某个符合条件对象的内容。InputFile 文件和用于 odmadd 命令的 InputFile 文件(ASCII 输入文件)有同样的格式。
odmchange -o ObjectClass [ -q Criteria] [ InputFile] |
下面的举例是:
1)首先显示 rsDDMTable 这个对象类的基本信息
2)显示 changefile 文件的内容
3)显示符合 ddmFamily=ASNF300 的 rsDDMTable 对象
4)修改符合 ddmFamily=ASNF300 的 rsDDMTable 对象的 diskRPM 为 99999
5)显示符合 ddmFamily=ASNF300 的 rsDDMTable 对象
图 5

通过实例讲述 ODM Object 和 AIX 系统盘的关系
首先,我们来了解一下 AIX 的系统盘概念。
在 AIX 系统中,有下面 3 个和磁盘相关的概念。
- PV:物理卷(就是指物理硬盘),一个硬盘就是一个 PV,一个系统中可以有多个 PV。
- VG:卷组的概念,在 AIX 系统中一个 VG 可以由一个或多个 PV 组成。
- LV:逻辑卷,通常我们的操作系统,应用软件都安装在 LV 上。
下面就是一个普通的 AIX 系统的 PV,VG,LV 的对应关系。

可以看到,其实所有 LV 的 parent 都是“rootvg”。所有 LV 和 VG 的所有关系都存储在 AIX 系统的 ODM 中。其实这个就像是数据库中数据的关系表一样,环环相扣。

有时候,我们会遇到由于误操作(比如非法拔掉了一个 AIX 上的硬盘或者人为操作错误或者其他的特殊原因)导致的 PV,VG,LV 之间发生混乱和不匹配,有可能使某一个物理卷上的逻辑卷和卷组的描述信息和与其对应的 ODM 库中的信息不一致,从而导致 ODM 库混乱,对物理卷的有关操作无法进行。这个时候,不要慌乱,仔细查找一下 AIX ODM 的信息,然后按照正常的逻辑改成合理的关系就能解决问题。
比如,AIX 中出现了多个卷组,但实际上只有一块磁盘,且这块磁盘是属于 rootvg 的,可以按照下面的步骤去做:
- 先确定正确的那个卷组和磁盘的物理对应关系(可以问这个系统的安装人员)。
- 使用 odmdelete 从 ODM 中删除其它卷组的信息:
odmdelete -o CuAt -q name=vgname odmdelete -o CuDv -q name=vgname
- 使用命令用以将指定物理卷上的逻辑卷管理的信息重新定义给指定卷组的 ODM 库。
redefinevg -d <hdisk_name> <vg_name>
其中,<hdisk_name> 为卷组中物理卷的名称,<vg_name> 为卷组的名称