整理日期:2009年8月20日
- 移植所使用的环境
OS:linux
Arm-linux-gcc:3.4.1
Net-snmp:v5.4.2
硬件:
Target CPU:arm 9
- 交叉编译net-snmp(Simple Network Management Protocol 简单网络管理协议)
确保arm-linux-gcc安装成功并已设置好环境变量。
将net-snmp解压到工程目录下,进入net-snmp源码目录下(此处是net-snmp-5.4.2,以下使用该目录代表源码目录),配置编译选项:
执行下列命令:(红色代表命令直接在命令行执行)
CC=arm-linux-gcc ./configure --build=i386-linux --host=arm-linux --enable-mini-agent --disable-ipv6 --with-endianness=little --disable-manuals --disable-ucd-snmp-compatibility --enable-as-needed --disable-embedded-perl --without-perl-modules --disable-snmptrapd-subagent --disable-applications --disable-scripts
(各配置选项含义可以使用./configure –help来查看,可以添加自己需要的选项或者去掉不需要的选项)。
配置完成后进行编译:0
然后是使用make install进行安装
编译得到的snmpd比较大,需要进行strip处理,使用arm-linux-strip snmpd处理后得到需要的snmpd文件。 - 配置snmpd.conf文件
使用net-snmp-5.4.2/EXAMPLE.conf ,并拷贝到默认配置文件目录下,
cp EXAMPLE.conf /usr/local/share/snmp/snmpd.conf
修改snmpd.conf文件中community设置如下
店铺地址:https://shop66907778.taobao.com/
#sec.name source community
com2sec local localhost public
com2sec mynetwork 10.10.200.0/24 public #我的网段在200
将组设置改为可读写如:group MyRWGroup v2c mynetwork (原配置为:group MyROGroup v2c mynetwork),方便测试使用。 - 移植到目标开发板
将snmpd和snmpd.conf文件移到windows下(此处使用的是windows XP, 传输使用ftp,软件使用ServerUAdmin, ServerU的下载安装和使用自行查找,当然也可以使用其它方式传出文件完成此步骤)。
启动目标板(确保目标板可用,已经移植有bootloader和Linux系统)。Windows和目标板之间的传输通过串口进行(依然使用ServerU,通过ftp命令实现,确保目标板移植有ftp服务,ftp命令使用自行查找),此处确保串口通讯正常,并进入目标系统。
将snmpd文件上传到目标板/usr/sbin目录下(需要更改访问权限为可执行),将snmpd.conf文件上传到/usr/local/share/snmp/下(不存在的目录先要创建)。
现在可以启动snmpd了:snmpd –f –Le –d.
启动正常则此步骤完成。 - 简单测试
确保目标板上snmpd正常启动,另一台管理机器装有linux或者windows(确保其中正确安装了net-snmp),并且和目标板网络连接正确,通讯畅通(管理机ip设置要和snmpd.conf中设置对应)。(当然此步可以通过其它方法完成,如使用图形界面的软件)。
在管理端使用命令:snmpget –v 2c –c public 10.10.200.101 sysContact.0(注意.0),(此处使用目标板ip为10.10.200.101),如果前面操作正确,则此处可以得到正确输出。
接下来使用snmpset –v 2c –c public 10.10.200.101 sysContact.0 s “livingpark@live.cn”,一般会出现notWriteable的提示,无法设置值。出现这种情况时的解决方案:注释或者删除 snmpd.conf(这里指管理端)中syscontact Me 一行,其它如sysLocation等相似。
如果要使用snmpv2c为默认版本,可以在snmp.conf(注意没有’d’)文件中添加defversion 2c一行,snmp.conf文件所在目录和snmpd.conf相同。添加完成后可以使用命令snmpget –c public 10.10.200.101 sysContact.0,不用写版本号了,snmpset用法相似。 - 自定义mib(包括trap)测试
此处仅测试移植成功,使用mib为net-snmp的一个例子,具体是net-snmp.5.4.2/mibs/NET-SNMP-EXAMPLES-MIB.txt。相关的C文件在net-snmp.5.4.2/agent/mibgroup/examples/目录下。
当已经写好或者拥有一个mib文件时,可以通过mib2c来生成相应的C文件模板,在此基础上面添加需要的功能。首先要确保mib2c可用,使用man mib2c可以查看到它的用法。使用前需要将mib文件放在usr/local/share/snmp/mibs/目录下面,并将该mib添加到环境变量MIBS中如:export MIBS=”+NET-SNMP-EXSMPLES-MIB”,这里的NET-SNMP-EXSMPLES-MIB是mib的定义而不是mib文件的文件名,如果不确定,可以打开mib文件,一般第一行可以看到定义如:NET-SNMP-EXAMPLES-MIB DEFINITIONS ::= BEGIN其中NET-SNMP-EXAMPLES-MIB为定义的mib名,一般和mib文件名相同。
接下来就可以使用mib2c工具生成C文件了,仅以简单的方式为例,mib2c的其它用法见man mib2c或者其它相关网站。具体如:mib2c netSnmpExampleScalars,这里的netSnmpExampleScalars是mib文件中定义的一个对象,具体要生成那个对象的C文件可在mib文件中查找OBJECT IDENTIFIER的定义,接下来会出现两个选项:
- ucd-snmp style code 2)Net-Snmp style code
可按照自己的需要选择,选择1)则直接生成代码,选择2)会出现三个选项,前两项其实就是mib2c.scalar.conf和mib2c.int_watch.conf,选择1)或2)(此处可选择1)后会生成代码(默认命名是上面mib2c的参数)。
接下来要将mib编译到Agent(snmpd)中(一般自定义mib生成C文件放在net-snmp.5.4.2/agent/mibgroup/目录下),下面使用example中的netSnmpExampleScalar,具体文件在net-snmp.5.4.2/agent/mibgroup/examples/下的scalar_int.h和scalar_int.c。
接下来进行编译,在./configure最后面添加–with-mib-modules=”scarlar_int”,如果有多个对象则在引号中添加,用空格间隔。配置完成后,编译、安装、移植等和前面2、3、4的过程相似,完成后启动snmpd。管理端使用snmpget –c public 10.10.200.101 netSnmpExampleScalar.0获取该节点值,设置snmpset用法相似。
测试trap使用net-snmp.5.4.2/agent/mibgroup/examples/下的notification,用法和简单mib相似,./configure 的modules改为notification或者添加notification进去,重新编译、移植(注意需要修改配置文件snmpd,在文件后面添加trap2sink 10.10.200.202 public一行,指明能够接收该agent发出trap的管理端ip),该mib功能实现为每30秒发送一次trap,管理端使用snmptrapd接收,启动可以使用:
snmptrapd –f –Lo –d
如果一切运行正常,snmptrapd能够接收到相应信息。
- 使用snmpv3
以上定义访问组和ip段,适合snmpv1和v2使用,如前面使用snmpget或者snmpset中的-c public指明了这一点,而v3中使用用户名和密码来访问,使配置更灵活,访问也更安全。
使用net-snmp-config --create-snmpv3-user命令创建一个v3的用户。首先:Enter a SNMPv3 user name to create:
如输入 Living
接下来Enter authentication pass-phrase:
如输入 whoareyou //(注意长度应该>=8)
接下来Enter encryption pass-phrase:
可以输入加密密码,此处直接回车使用和上面相同输入即whoareyou
这时在/usr/local/share/snmp/snmpd.conf文件后面添加了rwuser Living一行,成功添加用户(snmpd.conf应重新放到目标板上并重启snmpd)。
此时使用snmpget -v 3 -l authPriv -u Living -A “whoareyou” -X “whoareyou” 10.10.200.101 sysUpTime.0测试可成功获取值,注意这里没有使用-c public 的community而是使用用户名密码进行访问。
接下来使用snmpget -v 3 -l authNoPriv -u Living -A “whoareyou” 10.10.200.101 sysUpTime.0命令也没有问题(注意之间的区别)。
最后使用snmpget -v 3 -l noAuthNoPriv -u Living 10.10.200.101 sysUpTime.0命令会出现authorizationError,拒绝访问该对象,解决方法是给予权限,在snmpd.conf中rwuser Living后面添加noauth(注意Living和noauth之间有空格)后重启snmpd,重新使用该命令正确获取值。
以上只是对net-snmp的简单编译和使用,更多功能和操作方法请参考网站:www.net-snmp.org或者net-snmp源码。