通用信息模型 CIM 开发介绍
简介: 通用信息模型 CIM 相关的开发技术,正在被越来越多的开发者所应用来搭建基于标准的信息世界模型。本文中,作者首先介绍相关的概念和技术背景,之后通过一个完整的案例,讲解从模型设计到最后的实现和测试过程,希望能让读者快速地掌握最基本的 CIM 开发流程。
通用信息模型 (CIM) 提供了一种对被管理信息的通用定义,包括系统、网络、应用和服务,并且能供被扩展。 CIM 使得信息管理者可以在网络中以一种通用的标准交互,而 CIM Profile 定义了某一个特定领域的 CIM 模型和联系。当前,CIM 已经被世界上很多公司所采纳,作为他们构建上层信息管理软件的基础模型,比如 IBM, HP 和 EMC 等。随着趋势的发展,对这种技术进行一次全面和基础的介绍,将对刚进入这个领域的开发者具有非常重要的意义。本文的目标读者包括希望进入 CIM 开发领域的工程人员和对 CIM 技术有着浓厚兴趣的开发者。
CIM ( 通用信息模型 ) 是由 DMTF 制定的用于管理计算机系统和网络的工业规范,它提供了一个共同的概念框架,将所有系统进行分类,并确定了部分网络环境,而且描绘了这些部分的互动。 CIM 的概念适用于所有领域的管理,而且所有的领域可以独立的进行技术实施,由公共信息模型开发出的管理软件可以统一异构环境下的产品管理。 CIM 由以下几部分组成 :
- CIM 规范- 定义了整合管理模型的语言和方法论。
- CIM 标准模型- 定义了对计算机系统,应用程序,网络和设备描述信息模型。 CIM 标准模型由以下及部分组成:
- 核心模型 - 提供了基本的受管对象的假设信息,内容包括一系列描述和分析受管系统的类和他们之间的关联信息。
- 公共模型 - 实现了管理领域的公共概念。这些概念独立于各个特殊的技术和实现。可以说这个模型提供了一个管理软件发展的基础。
- 拓展模型 - 他们是在公共基础上拓展一些与平台相关的模型,比如操作系统的模型等。一些大公司如 IBM 公司都有根据自己的产品所拓展出一系列的为自己产品服务的模型。
DMTF ( 分布式管理任务组织 ) 是工业界计算机和电信行业的企业间合作组织。它领导着个人电脑,企业级服务器和网络管理标准的制定和发展,并致力于建立整合跨平台和协议的计算机和网络管理方法,以求能使得不同产品的整合管理成本消耗达到最小,CIM 就是由 DMTF 制定发布的。
WBEM ( 基于 Web 的企业管理 ) 是一系列网络管理规范 . 它标准化了企业网络中受管资源的描述和使用。遵循 WBEM 所开发的网络管理工具都可以实现低成本的管理。有关 WBEM 的更多信息,请读者参考资料。
CIM 以受管对象格式 (MOF) 来描述对受管资源建立的模型。它与 IDL 语言(对象管理组的接口定义语言)很相似,是用文本的格式描述面向对象的类和实例的定义。 MOF 规范的主要内容有元素类,属性,方法等的描述,还包括注释,编译暗示,和一些 CIM 规范的特别语义。
CIM profile 是 DMTF 组织或其它相关组织织定的,定义了在特定环境下的 CIM 模型的实现。它内容包括 CIM 类,关联信息,方法和属性。它为 CIM 模型在具体化条件下的应用提供了统一和便利。每一个 profile 都清晰的指出每一个类,属性,方法在具体条件的应用下都应该被实例化。
CIM Server 是 CIM 技术中一个核心组件,用来管理和操作信息模型对象,现在已经有很多不同版本的 CIM Server:
- SMALL-FOOTPRINT CIM BROKER (SFCB) - SFCB 是一个轻量级 CIM 后台程序 (CIMOM) 用来处理 CIM 客户端的请求,随后根据请求内容进行系统管理的操作。 SFCB 支持标准的 http/https 和 CIM-XML http 编码之上的操作。它实现高度模块化,可以很容易补充,删除或自定义不同的管理应用软件。 SFCB 由于它的轻量级大小,十分适用于嵌入式环境。
- Open Pegasus - Pegasus 是一个 DMTF CIM 和 WBEM 标准的开源项目。它由 C++ 编写,所以可以很方便的将面向对象的 CIM 管理对象转变成程序模块。因此他被各个操作系统平台所支持,包括 UNIX, Linux, OpenVMS, and Microsoft Windows 。
- OpenWBEM - OpenWBEM 是一个企业级 wbem 实现的开源项目。它由 C++ 编写,可用于任何商业和非商业的用途。它提供了一个基础管理的开发框架,克服跨平台的障碍,并赋予真正的互操作性。开发人员可以使用 openwbem,以提供配置和变更管理,系统健康监测,和企业范围的管理功能。
- WBEM Services - WBEM Services 项目是用 Java 编写的,适用于任何商业和非商业用途的,基于 wbem 的实现。它的内容包括应用编程接口,服务器端和客户端的应用程序和工具。
图 1. 通用信息模型技术框架图
如上图所示,DMTF组织的底层技术基础是通用信息模型 (CIM)。 CIM 模型定义了一套规范并提供了如何与其他管理模型进行整合的细节。上一层是 CIM 规范,它为受管元素提供了更多丰富的语义和面向对象的描述。该 CIM 的规范有利于管理元素精简,整合和成本的降低,使得管理信息的交换处于一个独立平台和技术中立的方式。再上层便是基于 Web 的企业管理 (WBEM),它提供了一系列网络管理标准来实现分布式系统的统一管理 , 不仅如此 , 它还提供一套基于标准的管理工具,促进不同平台下数据的交流。这两层技术总揽提供了特定管理环境下,一种统一的标准的方式来描述和管理受管资源,以达到分布式管理的简化。最上层是 DMTF 或基于 DMTF 技术的其他组织的一些具体项目。它们提供了提供了垂直方向的具体应用和功能 , 包括比如公共诊断模型 (CDM), 桌面与移动系统硬件架构 (DASH) ,服务器硬件系统管理结构 (SMASH), 和存储网络工业协会 (SNIA's) 发布的存储管理规范 (SMI-S). 这些标准和技术提供了一个潜在的方案 , 它可以解决当今复杂的异构的管理环境,更多信息请读者参阅资料中的相关链接。
基于前面章节的 CIM 技术介绍和基本概念,我们将通过一个完整的 CIM Profile 开发案例,把最基本的 CIM 开发过程介绍给大家。简要说来,开发 CIM 主要是指运用 CIM 技术,开发出符合通用管理接口的,同时满足自己需求的信息模型,主要包括下面四个步骤:理解 CIM profile,扩展 CIM profile,实现 CIM provider 和最后的测试与验证过程。
清单 1. 需求案例
IBM 计算机系统中安装了一个新的软件 -IBM Lotus Notes,我们如何对它进行对象模型化,并开发符合 CIM 标准的管理程序, 使得 CIM 客户端程序可以访问到这个 Lotus Notes 对象? |
思考上面的需求,第一步就是如何建模。首先,我们还要回顾一下前面介绍的一个概念:CIM Profile,CIM Profile 里面定义了某一个特定领域对象的 CIM 模型,到目前为止,已经发布的 CIM Profile 基本上已经涵盖了在工业生产生活中所常见的对象模型。我们列举出一小部分已经发布的 CIM Profile,如下所示:
表 1. 已经发布的一些 CIM Profile 举例
Power State Management Profile | 计算机电源状态管理模型 |
Alarm Device Profile | 警报设备模型 |
OS Status Profile | 操作系统状态模型 |
Battery Profile | 电源模型 |
由于 CIM Profile 太多,我们在此就不一一列举,有兴趣的读者可以到从本文后面的参考资料中查找相关资源。
那么 CIM Profile 和我们的建模有什么关系呢?简言之,就是我们的 CIM 开发,就是要扩展这些标准的 CIM Profile,创建符合 CIM 标准的具体模型,这样的好处有几点:
- 已经存在的 CIM Profile 已经为我们搭建起了一个标准的现实世界模型框架,我们可以通过类继承实现模型重用。
- 标准的 CIM Profile 具有通用性,接口标准和统一化,这样便于将来的跨系统跨平台操作。
针对案例需求,我们选择了 "DSP1023 Software Inventory Profile" 。 DSP1023 描述了可以安装在系统中的软件对象模型,比如 BIOS,固件,应用程序以及软件和管理设备的关系等。对于这份文档中的更多信息,在此就不详细说明了,我们需要重点关注的是如何模型化 Lotus Notes 这样一个应用软件。在 DSP1023 中,有这样一个用例图可以作为参考,如下图所示:
图 2. Software Inventory Profile 用例类图
注:上图中类名都省略了前缀 "CIM_"
在上图中,CIM_ComputerSystem 代表了计算机系统,CIM_SoftwareIdentity 代表了安装在系统中的软件,这两者是通过 CIM_InstalledSoftwareIdentity 关联起来的。 IBM Lotus Notes 就是一种 CIM_SoftwareIdentity,因此我们可以利用这个框架来扩展。
在 CIM 中,对于类和对象,是由MOF来描述定义的,MOF 通过文本形式,规范了类,对象,属性,方法等。我们以 CIM_SoftwareIdentity 为例来看一下它如何定义的:
清单 2. CIM_SoftwareIdentity 的 MOF 文件
// Copyright (c) 2005 DMTF. All rights reserved. //================================================================ // CIM_SoftwareIdentity //================================================================ [Version ( "2.14.0" ), UMLPackagePath ( "CIM::Core::Software" ), Description ( "SoftwareIdentity provides descriptive information about a " "software component for asset tracking and/or installation " "dependency management. ")] class CIM_SoftwareIdentity : CIM_LogicalElement { [Key] string InstanceID; uint16 MajorVersion; uint16 MinorVersion; uint16 RevisionNumber; uint16 BuildNumber; string VersionString; string TargetOperatingSystems[]; string Manufacturer; string Languages[]; uint16 Classifications[]; string ClassificationDescriptions[]; string SerialNumber; datetime ReleaseDate; }; |
注:在上面的 MOF 文件中,我们省略了很多属性描述和注释内容
对于上面的 MOF 中各个属性的具体含义,有兴趣的读者可以从DMTF 网站上下载详细的 MOF 文件进行学习。
所谓扩展 CIM Profile,就是继承 CIM Profile 中的类,创建符合具体需求的子类,如下图所示:
图 3. 扩展用例类图
如图所示,IBM_ComputerSystem 继承了 CIM_ComputerSystem,代表了特殊的计算机系统,并相应地可以添加一些 IBM 计算机的特殊属性和行为; IBM_SoftwareIdentity 代表了 IBM 公司开发的软件,当然,我们将要模型化的 Lotus Notes 就属于这一类。简化起见,我们把重点放在 IBM_SoftwareIdentity 模型化上,创建它的 MOF 如下:
清单 3. IBM_SoftwareIdentity 的 MOF 文件
[Version ( "1.0" ), Description ( "To describe IBM software ")] class IBM_SoftwareIdentity : CIM_SoftwareIdentity { string IBMProductName; }; |
如上所示,我们只需要在 CIM_SoftwareIdentity 的基础上,再增加一个特殊的 IBMProductName 属性,用来描述该产品的 IBM 名称。当然,开发者在实际项目中,可以根据需要添加他们自己的属性和行为。
对 CIM 模型的访问操作,是通过叫做 "CIM Provider" 的程序来实现的,接下来我们要做的事情就是把对于特定类的操作,转化为具体的 CIM Provider 程序,这样,任何满足 CIM 规范的客户端程序,都可以通过标准 CIM Client 接口调用到我们的 IBM_SoftwareIdentity 对象,并进行一些标准操作,比如访问特定对象,枚举所有该类对象等。 CIM 程序的整体框架如下图所示:
图 4. CIM 程序框架
图中,绿色的部分叫做 CIM Provider,就是我们所要实现的程序,它的工作就是对具体的 CIM 模型对象提供访问调用功能,这些程序是以动态连接库的形式被 CIM Server 调用,并提供给远端的 CIM client 使用。
图中的黄色部分叫做 CIM client,它是具有 CIM 交互能力的客户端程序,可以连接到 CIM server,并通过 CIM provider 程序访问和操作 CIM 模型对象。
灰色部分是 CIM server,这是 CIM 体系的核心,对上接口有 WBEM 标准,对下接口有 CMPI,现在已经有很多的实现版本如:OpenPegasus, OpenWBEM, WBEM service 和 SFCB 等。
在本例中,我们选择使用 SFCB 作为 CIM server,CIM provider 的实现接口选择 CMPI,创建 CIM provider 选择使用 CIMPLE,关于更加详细的 CIMPLE 使用方法,我们在此就不详述,有兴趣的读者可以参考“基于 CIMPLE 接口的 CIM Provider 的实现及其性能测试”一文。
继续我们的具体案例,针对 IBM_SoftwareIdentity 的 CIM provider 程序,使用 CIMPLE 开发,关键部分代码如下所示:
清单 4. IBM_SoftwareIdentity 的 CIM Provider 程序
// Generated by genprov 1.2.0 #include "IBM_SoftwareIdentity_Provider.h" CIMPLE_NAMESPACE_BEGIN …… Enum_Instances_Status IBM_SoftwareIdentity_Provider::enum_instances( const IBM_SoftwareIdentity* model, Enum_Instances_Handler<IBM_SoftwareIdentity>* handler) { IBM_SoftwareIdentity* inst = IBM_SoftwareIdentity::create(true); // 创建一个新的对象 inst->InstanceID.set("My Lotus Notes Instance"); // 设置对象关键字 inst->IBMProductName.set("IBM Lotus Notes"); // 设置子类属性 inst->MajorVersion.set(1); // 设置主版本号 inst->MinorVersion.set(0); // 设置副版本号 inst->RevisionNumber.set(10); inst->BuildNumber.set(500); inst->VersionString.set("version 1.0"); Array<String> TOS; TOS.append("Windows"); TOS.append("Linux"); inst->TargetOperatingSystems.set(TOS); inst->Manufacturer.set("IBM"); inst->SerialNumber.set("ADDFI2356R"); handler->handle(inst); return ENUM_INSTANCES_OK; } …… /*@END@*/ CIMPLE_NAMESPACE_END |
在这个 CIM provider 程序中,我们主要实现了一个方法:enum_instances 。当 CIM client 需要枚举出所有 IBM_SoftwareIdentity 对象的时候,这个方法就会被调用,返回的结果是一个部分属性设置好的对象。代码编写完成后编译成动态连接库的格式,放置到 SFCB 指定的 CIM Provider 库文件目录下面就完成了编码这一步。
此时,SFCB 还不能正确地调用我们的 CIM provider 程序,因为 SFCB 还不知道这个新添加的 provider 的任何信息,所以我们要增加一个 CIM Provider 注册文件,并注册到 CIM server 中。注册文件如下所示:
清单 5. IBM_SoftwareIdentity 的注册文件
[IBM_SoftwareIdentity] // CIM provider 操作的目标类 provider: IBM_SoftwareIdentity_Provider // CIM provider 的名字 location: dwSoftwareInventoryDemoModule // CIM provider 生成的动态连接库的名字 type: instance // CIM provider 的类型 namespace: root/cimv2 // IBM_SoftwareIdentity 类所在的名字空间 # |
注:上面的注册文件格式,只适用于 SFCB,其它 CIM Server 的注册文件格式,请读者参考具体规范。
在上面文件中,要强调一下 "type" 的意义,这个属性描述了 CIM provider 所能提供的对象访问能力,当类型是 "instance" 的时候,CIM provider 可以提供一些枚举对象的能力;当类型是 "method" 的时候,它可以提供执行特定方法的能力;当类型是 "association" 的时候,它可以提供前后关联的能力。本例中,我们的 CIM provider 程序唯一的功能就是提供对象的访问能力,所以类型设置为 "instance" 。
通过前面几节的工作,我们现在有三个的成果:
- MOF 文件:描述了 IBM_SoftwareIdentity 类信息。
- CIM provider 库文件:程序部分。
- SFCB 注册文件:把 CIM provider 信息告知 SFCB 的文件。
最后要做的,就是如何把这些安装到 SFCB 中去。下面的步骤简要介绍了安装的过程,在本例中,我们的开发环境是 OpenSuse10.3,SFCB 版本是 1.2.5 。
- 复制 MOF 文件和注册文件到目录 /var/lib/sfcb/stage 下面
- 运行 SFCB 的工具 sfcbrepos 把这两个文件编译成 SFCB 可以识别的二进制形式
- 重新启动 SFCB
更多关于 SFCB 这个 CIM server 的信息,有兴趣的读者可以下载 SFCB 软件进行深入学习。
到现在为止,我们就完成了所有的开发步骤。也就是,完成了一个扩展自 "DSP1023 CIM profile" 的 IBM_SoftwareIdentity 类,其所有操作符合标准的 CIM/WBEM 接口,可以提供 CIM 调用者标准的访问这个对象的能力。
最后,每一个 CIM 开发人员都必须要做的事情就是测试和验证。有多种测试方法,比如说编写 CIM 客户端程序,或者使用已有的一些 CIM 客户端工具软件。在本例中,我们使用开源软件Ecute CIM Explorer这样一款工具软件来进行测试。
图 5. CIM Explorer 登陆界面
登陆到 SFCB 之后,进行枚举 IBM_SoftwareIdentity 所有对象的操作,结果显示如下:
图 6. IBM_SoftwareIdentity 对象
从上图可以看到,我们可以得到这样一个 IBM_SoftwareIdentity 的对象,其属性正是之前在代码中定义好的。由此可以知道,我们的 CIM provider 程序被正确调用到了。
在信息管理技术领域,如何把要管理的对象模型化,是一个首要和基本的问题,通用信息模型 CIM 给我们在这方面的工作,带来了更加统一的规范。本文立足基本概念,力求完整地呈现给读者一个简单的开发流程,希望能为将要进入相关领域的开发人员做一些技术方面的铺垫。
<!-- CMA ID: 365858 --><!-- Site ID: 10 --><!-- XSLT stylesheet used to transform this file: dw-article-6.0-beta.xsl -->codeDemo | 64k | HTTP |
注意:
- 本文用到的代码!
学习
- 如果您要了解信息管理软件 的更多内容请访问 Information Management 专区,上面包含了更多相关的技术文档。
- 通过 DMTF 官方网站,上面包含了该组织的详细介绍和 CIM 相关的技术文档。
- 通过 管理应用程序编程 : WBEM 和 CIM 简介,这篇 developerWorks 文章对于 CIM 的相关概念有更加详细的介绍。
- 通过 基于 CIMPLE 接口的 CIM Provider 的实现及其性能测试,这篇文章更加详细地介绍了如何使用 CIMPLE 开发 CIM Provider 程序。
- 通过访问 CIM Profile 文档库,了解包括了所有已经发布的 CIM Profile 文档。
获得产品和技术
- 您可以下载 SFCB,体验 CIM 技术的魅力。
- 您可以下载 CIM Explorer,这是一款开源软件,作为 CIM 客户端程序可以访问 CIM Server 。
- 现在可以免费使用 DB2。您可以下载 DB2 Express-C,这是为社区提供的免费版本的 DB2 Express Edition,它具有与 DB2 Express Edtion 相同的核心数据特性,并为构建和部署应用程序提供了坚实的基础。
- 下载 DB2 Enterprise V9.5 试用版,试用本文中描述的特性。
- 下载 IBM 产品评估版 并开始使用来自 DB2®、Lotus®、Rational®、Tivoli® 和 WebSphere® 的应用程序开发工具和中间件产品。
讨论
平均分 (11个评分)
快来添加第一条评论 |
添加评论:
请 登录 或 注册 后发表评论。
注意:评论中不支持 HTML 语法
有新评论时提醒我 剩余 1000 字符