uCLinux上UCD-SNMP Agent的实现

发布于 2022-09-28 16:45:53 字数 5521 浏览 14 评论 0

[转载请注明出处,作者:张洪耿,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-190、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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

源来凯始玺欢你 2022-10-05 16:45:53

好贴!谢谢楼主共享!

画骨成沙 2022-10-05 16:45:53

请教斑竹,关于uclinux上不能用fork()的问题。
因为net-snmp多进程中用到 fork(),所以只能#define fork vfork
但是这样做影响了程序的逻辑,我的net-snmp用的5.3.1
请问怎样解决fork的问题?

睫毛溺水了 2022-10-05 16:45:53

谢谢楼主共享!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文