交叉编译SNMP
一般系统都会有SNMP的支持,下载了net-snmp-5.1.3.1,先看看INSTALL和FAQ文档(因为以前从来没有碰过这个东东,见笑了……),按照说明,在原生主机上安装了一回,安装完成后,发现在指定安装目录下主要包括了几块文件:
bin:SNMP的一些功能脚本和程序;
sbin:主要的代理程序和trap程序:snmpd和snmptrap
include/lib:自身兼容及第三方开发所需的头文件及库文件;
share:主要是MIB文件;
然后回到安装目录下,运行./configuare --help,仔细查看了其安装编译选项,因为我定位的小型的系统,只需具备基本的SNMP功能即可,所以:
那些bin目录下的功能程序也不需要,对应--disable-applications
bin下的脚本也是不需要的,对应:--disable-scripts
用户手册也不需要:--disable-manuals
关闭ipv6支持:--disable-ipv6
还有一个--enable-mini-agent选项,说明是编译出一个最小化的snmpd,比较有趣,试试先。
对于交叉编译,还需要用--host指明目标平台。
OK,看完了帮助说明,开始编译了:
1、配置,根据以上确定的选项:
[root@skynet root]# CC=i386-linux-gcc ./configure --host=$TARGET --enable-mini-agent --disable-ipv6 --with-endianness=little --disable-applications --disable-manuals --disable-scripts --disable-ucd-snmp-compatibility
CC指明了编译器;--host指明了我的目标平台,这个环境变量在我前面定义的devedaq脚本中。
还算顺利,继续编译它:
[root@skynet net-snmp-5.1.3.1]# make LDFLAGS="-static"
呵呵,因为没有装lib库,所以我用了-static选项,指明是静态编译;
3、安装
安装就需要指明安装路径了,路径可以在.config的时候指定,因为那个时候,那串东东太长了,我在install时指定也不迟:
#make prefix=${TARGET_PREFIX} exec_prefix=${TARGET_PREFIX} install
4、检查一下:
[root@skynet net-snmp-5.1.3.1]# ls -l ${TARGET_PREFIX}/sbin
total 2120
-rwxr-xr-x 1 root root 2164301 Nov 16 09:22 snmpd
snmpd就是我们要的代理主程序了,大约静态编译有2M。
[root@skynet net-snmp-5.1.3.1]# ls -l ${TARGET_PREFIX}/bin
total 4380
-rwxr-xr-x 2 root root 391980 Oct 14 2004 ar
-rwxr-xr-x 2 root root 581228 Oct 14 2004 as
……
呵呵,那堆程序和脚本没有安装,如snmpwalk……
ls ${TARGET_PREFIX}/lib
ls -l ${TARGET_PREFIX}/include
看看我们需要的mib文件:
[root@skynet net-snmp-5.1.3.1]# ls ${TARGET_PREFIX}/share/snmp
mib2c.access_functions.conf mib2c.column_defines.conf mib2c.int_watch.conf mib2c.old-api.conf
mib2c.array-user.conf mib2c.column_enums.conf mib2c.iterate_access.conf mib2c.scalar.conf
mib2c.check_values.conf mib2c.conf mib2c.iterate.conf mibs
mib2c.check_values_local.conf mib2c.create-dataset.conf mib2c.notify.conf snmpconf-data
5、移植
基本完成了,因为snmpd太大了点,对它进行strip处理:
先备个份:
[root@skynet net-snmp-5.1.3.1]# cp ${TARGET_PREFIX}/sbin/snmpd ${TARGET_PREFIX}/sbin/snmpd.bak
[root@skynet net-snmp-5.1.3.1]# i386-linux-strip ${TARGET_PREFIX}/sbin/snmpd
[root@skynet net-snmp-5.1.3.1]# ls -l ${TARGET_PREFIX}/sbin/snmpd
-rwxr-xr-x 1 root root 503300 Nov 16 09:30 /home/skynet/tools/i386-linux/sbin/snmpd
经过处理后,还有近500KB了。
因为只有SNMP agent功能,即snmpd程序,其它的都可以忽略。用了静态编译,lib下边那些libnetsnmp文件都可以不需要了,程序运行
需要MIB库,也就是share下的内容,把这两个东东拷到rootfs相应的目录中去:
[root@skynet net-snmp-5.1.3.1]# cp ${TARGET_PREFIX}/sbin/snmpd ${PRJROOT}/rootfs/usr/sbin
[root@skynet net-snmp-5.1.3.1]# mkdir -p ${PRJROOT}/rootfs/usr/local/share
[root@skynet net-snmp-5.1.3.1]# cp -r ${TARGET_PREFIX}/share/snmp ${PRJROOT}/rootfs/usr/local/share
[root@skynet net-snmp-5.1.3.1]# cp EXAMPLE.conf ${PRJROOT}/rootfs/usr/local/share/snmp/snmpd.conf
最后一步是把安装目录下的配置文件范例拷到snmpd启动时默认的搜索目录中去。
6、测试
打开snmpd.conf看看:
[root@skynet net-snmp-5.1.3.1]# vi ${PRJROOT}/rootfs/usr/local/share/snmp/snmpd.conf
有如下语句:
# sec.name source community
com2sec local localhost COMMUNITY
com2sec mynetwork NETWORK/24 COMMUNITY
定义了两个用户,本地及网络的,以及它们的通读密钥,按自己的需要修改一下,如:
# sec.name source community
com2sec local 127.0.0.1 public
com2sec mynetwork 0.0.0.0 public
后面是定义用户的用户组等一大堆东东,事实上不用修改它们了。运行它:
[root@skynet net-snmp-5.1.3.1]# chroot ${PRJROOT}/rootfs /bin/sh
BusyBox v1.00 (2004.10.13-06:32+0000) Built-in shell (ash)
Enter 'help' for a list of built-in commands.
/ # snmpd
/ # exit
在我们自己的根文件系统环境下运行它,然后退出来。用ps查看:
#ps -aux
……
root 32270 0.0 0.3 1212 936 ? S 09:38 0:00 snmpd
[root@skynet net-snmp-5.1.3.1]# netstat -anu
……
udp 0 0 0.0.0.0:161 0.0.0.0:*
呵呵,已经成功启动了。用一个SNMP管理软件试试,可以成功地获取到信息。OK!
总结一下:
1、主程序+MIB库大了点,共计约2M,不过我确实没有办法再小了,而且一味求小,也不是我的目的。
2、功能稍微简单了些,只有agent,如果需要,可以类似地把其它程序加上去就可以了。
3、第一次玩net-snmp,还是有点生疏,比如我静态编译二进制程序,并不需要include/lib下的文件,但是如何关闭它们呢?我试过--disable-ucd-snmp-compatibility,不过好像不是这个选项……下次改进了……
http://www.linux-cn.com/plus/view.php?aid=48248