MIB文件就是一个规范的ASN.1的模块,也可以称为MIB模块。
MIB 结构:
模块声明部分:
- 所有的MIB模块都需要使用 DEFINITIONS 关键字定义模块,以END标识结束
导入/导出部分:
- 也就是IMPORT/EXPORT,它一般紧跟在模块声明后,该部分主要声明导入其他模块,尤其是标准模块中定义的数据类型,宏等。只有导入相关数据类型,才可以在本模块中使用。
利用IMPORTS标识,所有的模块引用使用FROM关键字说明其出处,引用使用分号(;)结束
IMPORTS
Unsigned32 FROM SNMPv2-SMI
OBJECT-TYPE FROM RFC-1212
enterprises FROM SNMPv2-SMI;
模块标识部分:
- 一般都使用MODULE-IDENTITY以描述该模块的详细信息。该部分必须紧跟IMPORTS子句后。模块有更新历史时使用关键字REVISION进行描述。
ipMIB MODULE-IDENTITY
LAST-UPDATED "200602020000Z"
ORGANIZATION "IETF IPv6 MIB Revision Team"
CONTACT-INFO
"Editor:
EMail: <sar@iwl.com>"
DESCRIPTION
"The MIB module for managing IP and ICMP implementations, but
excluding their management of IP routes.
REVISION "200602020000Z"
DESCRIPTION
"The IP version neutral revision with added IPv6 objects for
ND, default routers, and router advertisements. As well as
being the successor to RFC 2011, this MIB is also the
successor to RFCs 2465 and 2466. Published as RFC 4293."
REVISION "199411010000Z"
DESCRIPTION
"A separate MIB module (IP-MIB) for IP and ICMP management
objects. Published as RFC 2011."
REVISION "199103310000Z"
DESCRIPTION
"The initial revision of this MIB module was part of MIB-II,
which was published as RFC 1213."
::= { mib-2 48}
分配OID空间:
- 该部分使用宏OBJECT IDENTIFIER为管理对象建立OID分支。在这部分可以规划并建立整个MIB中的分支
gcc_test OBJECT IDENTIFIER ::= { enterprises 100 }
gcc_test_entry OBJECT IDENTIFIER ::= { gcc_test 1 }
gcc_test 是一个子树支,它定义在enterprises树支下,“100” 是子树gcc_test 在父树enterprises下的一个唯一对象标识符。
Trap对象的定义:
- 该部分是使用宏NOTIFICATION-TPYE(或TRAP-TYPE)定义本模块中的Trap对象,它为可选部分。
MIB对象的定义:
- 指的是使用宏 OBJECT-TYPE定义管理对象。一般来说该部分是MIB文件中的主要内容。
objectname OBJECT-TYPE
SYNTAX (syntax)
MAX-ACCESS (access)
STATUS (status)
DESCRIPTION (description)
::= { ( parent ) ( number )
test_entry1 OBJECT-TYPE
SYNTAX OCTET STRING
MAX-ACCESS read-write
STATUS current
DESCRIPTION "entry1"
::= { gcc_test_entry 1 }
标量和表格对象
管理对象可以以两种形式定义在MIB中,一种是标量对象,另一种是表格对象。
表格对象的定义
- 1)使用SEQUENCE序列结构将各对象定义为序列结构,其中每一项都是标量对象,SEQUENCE的作用就是将这些标量对象按序列的方式组合起来;其中每个标量对象在表格中又称为列对象。要求该序列结构中定义的序列结构顺序一定要和表格中列对象的定义顺序一致,这也是SEQUENCE类型的含义。
- 2)将SEQUENCE OF定义的序列结构定义为概念行,也称行对象。
- 3)将概念行作为概念表的语法类型,定义概念表,即表格对象。
- 表格对象和行对象语法类型都为“not-accessible”。表索引的访问权限也定义为“not-accessible”。
现实应用中我们定义表时,会将上面3点的定义顺序反过来,请看代码:
—定义概念表,非叶子节点,不可访问:not-accessible
gccTestTable OBJECT-TYPE
SYNTAX SEQUENCE OF GccTestEntry
MAX-ACCESS not-accessible
STATUS current
DESCRIPTION "概念表,not-accessible"
::= { gcc_test 2 }
—以序列结构定义概念表中的概念行,非叶子节点,不可访问:not-accessible
gccTestEntry OBJECT-TYPE
SYNTAX GccTestEntry
MAX-ACCESS not-accessible
STATUS current
DESCRIPTION "概念行,not-accessible"
INDEX { gcctestIndex } --INDEX 子句定位
::= { gccTestTable 1 }
—定义序列结构
GccTestEntry::=
SEQUENCE {
gcctestIndex Integer32, --整型 index
gcctestValue Integer32,
gcctestString DisplayString
}
—标量;定义表中的索引,通过索引区分分列对象
gcctestIndex OBJECT-TYPE
SYNTAX Integer32
MAX-ACCESS not-accessible
STATUS current
DESCRIPTION "表索引,通过索引区分列对象"
::= { gcctestEntry 1 }
—标量;定义了一个整型的管理对象
gcctestValue OBJECT-TYPE
SYNTAX Integer32
MAX-ACCESS read-only
STATUS current
DESCRIPTION "列对象"
::= { gcctestEntry 2 }
—标量;定义了一个字符型的管理对象
gcctestString OBJECT-TYPE
SYNTAX DisplayString
MAX-ACCESS read-create
STATUS current
DESCRIPTION "列对象"
::= { gcctestEntry 3 }
上面的代码定义的表结构如图所示:
概念行 | 列对象- gcctestIndex | 列对象- gcctestValue | 列对象- gcctestString |
---|---|---|---|
… | … | … | … |
以上表格定义方法可以总结如下:表格名以小写字符开头,一般为了便于辨认以“Table”结束。xxxZzzTable的语法为SEQUENCE OF XxxZzzTable,其含义为定义表格的行对象。行对象的名称中首字母要求大写,以“Entry”结束。
MIB开发人员将MIB编写完成后,还需要使用工具对其进行编译,使之转化为NMS可使用的格式。对于使用Net-SNMP开发的人员来说一般都还需要将MIB转化为代码框架,这也涉及到对MIB文件的解析。