一.背景技术及术语解释
Net-SNMP是一个免费的、开放源码的SNMP实现,其中包含了一个Agent模块,通过这个模块可以获取到服务器的相关信息;在源码中实现了对服务器部分信息的获取,我们同样可以通过扩展mib库文件来实现获取我们需要的服务器的信息和管理服务器,并可以在其中添加一个通信模块来获取服务器上一些服务的信息。
二.方案详细描述
1.Linux下Agent扩展方法简介
1.1添加自定义mib库的实现文件
1. 在net-snmp的源码目录(net-snmp-5.7.1/agent/mibgroup)下添加一个文件夹hikvision;
2. 将通过新增mib库生成的C代码文件拷贝到hikvision文件夹;
3.在net-snmp-5.7.1/agent/mibgroup目录下新建一个文件hikvision.h, 文件内容如下:
其中hikHardwareThreshold为需要添加的文件。
1.2 net-snmp工程Makefile的生成
在net-snmp源码目录(net-snmp-5.7.1/)下执行如下命令来生成Makefile文件,分以下三种情况。
情况1: 扩展的MIB库的实现文件未用到第三方库和调用其他文件中的函数
[root@CentOS agent]# ./configure--enable-static --enable-shared=no
--disable-applications --disable-manuals--disable-scripts
--enable-mib-config-checking --with-cc=gcc--with-linkcc=g++
情况2: 扩展的MIB库的实现文件使用第三方库
[root@CentOS agent]# ./configure --enable-static --enable-shared=no
--disable-applications --disable-manuals--disable-scripts
--enable-mib-config-checking --with-cc=gcc--with-linkcc=g++
--with-mibs="HIKVISION-MIB"--with-mib-modules="hikvision" CFLAGS="-fPIC -Wall -g"LDFLAGS=-L/root/NMS/lib PERLLDOPTS_FOR_APPS="-pthread -lhpr2-ltinyxml"
--with-cc=gcc 编译的时候用gcc
--with-linkcc=g++ 链接的时候用g++
--with-mibs="HIKVISION-MIB"扩展的mib库的名称
--with-mib-modules="hikvision"扩展mib库生成的代码在net-snmp源码目录
(net-snmp-5.7.1/agent/mibgroup)中文件夹的名称
LDFLAGS=-L/root/NMS/lib用到的第三方库所在路径
PERLLDOPTS_FOR_APPS="-pthread-lhpr2 -ltinyxml" 依赖的第三方库的名称
当实现扩展MIB库是使用C++编写的时候,需要先将*.cpp文件改为*.c后再执行./configure,否则生成Makefile文件时会找不到扩展的cpp的文件,导致扩展的内容无法编译到Agent中;
./configure执行后,将*.c文件改回*.cpp文件,这时候执行make命令hikvision下的各个cpp文件是无法生成正确的目标文件的,需要在hikvision目录下手动生成相应的目标文件,命令如下:
[root@CentOS agent]# /bin/sh ../../libtool --mode=compile g++ -I../../include -I.-I../../agent -I../../agent/mibgroup -I../../snmplib -fno-strict-aliasing -g -O2 -Ulinux -Dlinux=linux -c -o hikvision/hikHardwareThreshold.lo
hikvision/hikHardwareThreshold.cpp
生成各自的目标文件hikHardwareThreshold.o和hikHardwareThreshold.lo,这些文件会在执行make命令时链接到Agent的可自行程序。
情况3:扩展的MIB库的实现文件调用了其他cpp文件中的函数
被调用的cpp文件的目标文件同样需要在hikvision下手动生成,方法如情况2中所述。
执行./configure的参数同情况2,在执行了./configure后需要手动修改源码目录(net-snmp-5.7.1/agent)下的Makefile文件。例如utils.cpp中的函数被调用了,在Makefile中需要作两处修改:
1)在mibgroup_list_lo的值中添加mibgroup/hikvision/utils.lo,如下图:
2)在mibgroup_list_o的值中添加mibgroup/hikvision/utils.o,如下图:
1.3编译和测试扩展后的Agent
执行完./configure后,会生成编译net-snmp所需的Makefile文件,生成Makefile后便可执行make命令来生成Agent的可执行文件snmpd。
在源码目录(net-snmp-5.7.1/agent)下执行如下命令来启动Agent:
[root@CentOS net-snmp-5.7.1]#./snmpd -Lo -f -C -c
/etc/snmp/snmpd.conf -M /usr/local/share/snmp/mibs
Agent启动后,向Agent发送get请求来获取扩展的OID的值,在有安装snmpget工具的机器上发送如下请求:
[root@CentOS agent]# snmpget-v 2c -c public 10.64.49.16 1.3.6.1.4.1.1.8092.1.1.0
若返回信息形如:HIKVISION-MIB::hikCPUNum.0 = INTEGER: 1,则Agent扩展成功。
三.经验总结
通过扩展Net-SNMP中的Agent可以获取和设置自定义的MIB库中的服务器相关信息,方便对服务器进行管理,同样通过新增的通信模块也可以管理服务器上的各个服务。
此次在Linux对Agent进行功能扩展,在编译Agent时还有很多地方还需要手动修改,还不能直接通过./configure和make编译成功,虽然达到了扩展Agent的目的,但过程还稍显复杂,还需进一步研究net-snmp来简化扩展的过程。
此次扩展之所以复杂是由于扩展Agent使用了C++和一些C++的库,而net-snmp是用C语言编写的,所以编译过程中遇到了许多问题。
RedHat和FreeBSD下的net-snmp配置方法:http://www.linuxdiyf.com/linux/5918.html
Ubuntu安装net-snmp-5.5.1方法总结:http://www.linuxdiyf.com/linux/3898.html
openSUSE 11.2下Net-SNMPv3的使用:http://www.linuxdiyf.com/linux/1241.html