2010年5月19日星期三

uCLinux上UCD-SNMP Agent的实现

[转载请注明出处,作者:张洪耿,patrick_zhg@hotmail.com]

讨论采用开放源码的UCD-SNMP 4.2.1软件包开发自己的SNMP Agent,不涉及SNMP协议包的组包、解析等问题。本文从以下部分进行介绍:
一:UCD-SNMP 4.2.1简介及SNMP Agent开发步骤
二:MIB库模块设计及代码转换
三:SNMP Agent功能扩展方式
四:uCLinux系统上SNMP Agent的实现
五:创建SNMP Agent配置文件snmpd.conf

一:UCD-SNMP 4.2.1简介及SNMP Agent开发步骤
UCD-SNMP 4.2.1开源软件包支持SNMPv1 (RFCs 1155-1157)、SNMPv2c(RFCs 1901-1908)、SNMPv3 (RFCs 2271-2275)三种SNMP协议版本,其由以下内容组成:
  可扩展的SNMP Agent程序(snmpd);
  SNMP Agent和管理程序开发库;
  用于检索或设置SNMP Agent端变量的工具程序(snmpget, snmpset, snmptable, snmpwalk等);
  用于生成或处理SNMP陷阱的工具程序(snmptrapd和snmptrap);
  基于Tk/perl的MIB浏览器(tkmib)

SNMP Agent的开发一般采用以下步骤:
  MIB库模块设计。
  MIB库模块转换为C语言代码。
  转换后的C语言代码添加到UCD-SNMP源码包,实现SNMP Agent的功能扩展。

二:MIB库模块设计及代码转换
 在SNMPAgent开发中,首先要定义出MIB库模块,这样,SNMP管理端软件才能通过该MIB库模块实现对相应设备的管理。MIB库模块定义的语法,可以参照SNMP 协议中的SMI描述部分,本文使用MG-SOFT公司的“Visual MIBBuilder”可视化设计软件完成MIB库模块的定义。MIB库模块定义后,需要在代理程序中增加与所定义的MIB库模块相对应的源代码,这里就要使用MIB2C工具程序把MIB库模块文件转换成C源代码。
 MIB2C是UCD-SNMP 4.2.1软件包中的工具程序,该工具程序需要SNMPperl扩展模块支持。按以下步骤进行转换,首先将设计好的MIB库模块定义文件拷贝到UCD-SNMP源代码的mibs目录(如/usr/local/share/snmp/mibs),然后运行MIB2C命令(假定MIB库模块为modulename)。
/usr/local/bin/mib2c modulename
     此时,MIB2C会在当前目录下生成两个C源文件:modulename.h 和modulename.c,这两个文件是根据所设计的MIB库模块转换而成的,也是需要加入到UCD-SNMP软件包实现SNMP Agent功能扩展的源代码。

三:SNMP Agent功能扩展方式
    SNMP Agent功能扩展即snmpd功能扩展,假定UCD-SNMP源代码存放在/usr/local/src/目录下,下面是实现snmpd功能扩展的两种方式:

静态链接方式
 先将生成的两个文件, modulename.h和modulename.c,拷贝到UCD-SNMP源代码的/usr/local/src/ucd-snmp-4.2.1/agent/mibgroup目录,然后,在ucd-snmp 4.2.1目录下(/usr/local/src/ucd-snmp-4.2.1)执行以下命令生成snmpd。

# ./configure -with-mib-modules="modulename" 
# make 
# make install

共享链接库方式
    首先, 在任一目录(如/usr/local/temp)编译生成共享链接库。将两个源文件, modulename.h和modulename.c拷贝到此目录下,执行如下命令生成共享链接库:

gcc -g -I/usr/local/include -c -o modulename.o modulename.c
gcc -g -fPIC -shared -o modulename.so modulename.o 

然后,通过以下任意一种方式动态加载共享链接库。

如果代理程序(snmpd)已运行,执行如下命令:
   #snmpset localhost rwnode UCD-DLMOD-MIB::dlmodStatus.1 i create 
     #snmpset localhost rwnode UCD-DLMOD-MIB::dlmodName.1 s " modulename" 
     #snmpset localhost rwnode UCD-DLMOD-MIB::dlmodPath.1 s "/usr/local/temp/ modulename.so" 
    #snmpset localhost rwnode UCD-DLMOD-MIB::dlmodStatus.1 i load 
    这样即可加载刚才生成的共享连接库,装载后,可以用工具程序检索或设置相应的变量。 

如果代理程序(snmpd)未运行,在snmpd.conf配置文件中增加一行:
   dlmod modulename /usr/local/temp/modulename.so
     然后重新启动snmpd代理程序, 程序会自动装载共享库。

四:uCLinux系统上SNMP Agent的实现
    考虑到嵌入式设备应用程序自动启动的特点,一般采用静态链接方式开发SNMP Agent。由于uCLinux交叉编译环境的特殊性,在uCLinux系统上实现SNMP Agent需要按以下步骤。

增加新文件及修改Makefile文件: 
  复制modulename.c和modulename.h到agent/mibgroup/目录下。
修改agent/Makefile文件:
  增加"mibgroup/modulename.lo"到LMIBOBJS符号下。
  增加"mibgroup/modulename.o"到MIBOBJS符号下。
修改agent/mibgroup/Makefile文件:
  增加"modulename.o"到OBJS符号下。
  增加"modulename.lo"到LOBJS符号下。
  增加"modulename.c"到SRCS符号下。
修改agent/mibgroup/mib_module_includes.h文件:
  增加 #include "mibgroup/modulename.h"一行。
修改agent/mibgroup/mib_module_inits.h文件:
  增加“if (should_init("modulename")) init_ modulename ();”一行。

重新配置内核
   要生成SNMP Agent程序snmpd,需要重新配置应用程序。
   切换到uClinux-dist目录,开始重新配置应用程序:
cd ../uClinux-dist
make menuconfig
     进行如下选择:
Kernel/Library/Defaults Selection:
(Linux-2.4.x) Kernel Version
[X] Customize Vendor/User Settings (NEW)
按Esc后保存。随后自动进入 uClinux v3.1.0 Configurationm,选中“Network Application---->”并进入下一级选项菜单,在这里可以配置arp、ifconfig、ping、route和snmpd等应用程序,选中ucd-snmpsnmpd一项。
[X] ucd-snmp snmpd
保存后退出,然后在终端提示符下执行命令“make user_only”生成SNMP Agent程序snmpd。

五:创建SNMP Agent配置文件snmpd.conf
     snmpd启动时需要读取snmpd.conf配置文件,通过该配置文件,可以控制SNMP管理端对变量的读写属性,下面是该配置文件的一个示例:

syslocation Shanghai 
syscontact localhost
sysservices 72 
com2sec public default public 
com2sec private default private 
group public v1 public 
group private v1 private 
group public v2c public 
group private v2c private 
group public usm public 
group private usm private 
view all included .1 80 
view system included .1.3.6.1.2.1.1 fe 
access public "" any noauth exact all none all 
access private "" any noauth exact none all all 
trapsink 200.162.162.27

没有评论:

发表评论