net-snmp软件包的应用
发布时间:2024-11-25
发布时间:2024-11-25
NET-SNMP软件包应用
1 SNMP协议简介 ................................................................................................................................... 1
1.1 网络管理协议结构 ....................................................................................................................... 2
1.2 管理信息库 ................................................................................................................................... 5
1.3 SNMP的版本 ................................................................................................................................ 6
2 SNMP开发软件包 ............................................................................................................................... 6
3 NET-SNMP软件包简介 ................................................................................................................... 6
3.1 NET-SNMP简介和安装 ................................................................................................................ 6
3.2 NET-SNMP代理的配置 ................................................................................................................ 7
3.3 NET-SNMP工具的使用 ................................................................................................................ 7
4 用NET-SNMP软件包扩展代理---LINUX服务器 .......................................................................... 9
4.1 NET-SNMP中的SCALAR对象和TABLE对象.............................................................................. 9
4.2 NET-SNMP扩展代理的两种方式(转) ......................................................................................... 9
4.3 自定义MIB扩展流程(LINUX服务器上) ............................................................................. 10
4.4 自定义MIB ................................................................................................................................. 11
4.5 代理扩展实例——简单变量的实现.......................................................................................... 12
4.6 代理扩展实例——表对象的实现.............................................................................................. 13
a) mib.iterator.conf模版的实现(转) ........................................................................................ 13
b) mib.iterator_access.conf模版的实现(转) ........................................................................... 15
4.7 代码的合并 ................................................................................................................................. 15
4.8 配置和运行 ................................................................................................................................. 16
5 用NET-SNMP软件包扩展代理---嵌入式板端 .............................................................................. 16
6 LINUX环境中开发中的问题与解决 ............................................................................................... 18
7 WINDOWS环境中开发中的问题与解决(转) ............................................................................ 19
8 总结 .................................................................................................................................................... 20
9 附录 .................................................................................................................................................... 21
9.1 SNMPD.CONF配置文件 ................................................................................................................. 21
9.2 主函数FOXMAIL_NEW.C(为调试代理而用。我自己未调试) .............................................. 21
9.3 简单变量实现代码--- MIB2C.OLD-API.CONF ............................................................................... 22
9.4 简单变量实现代码--- MIB2C.SCALAR.CONF ............................................................................... 22
9.5 表的实现--- MIB2C.MFD.CONF ..................................................................................................... 22
1 SNMP协议简介
作为一个完备的系统,必须有一套反馈机制来调整系统的运行。简单网络管理协议产生的目的,就是为了使松散的网络更加有效地运行。它广泛的应用于监测网络的状态、网络设备的运行情况、各种电脑设备以及一些辅助的外围设备,使得网络管理员
通过对节点的查询和设置,发现并定位故障,进而采取相应措施维护网络。网络管理的研究已经发展了许多年,对于日益纷繁的需求,简捷性和扩展性仍是研究的主题。本文中协议相关资料可以参考RFC文档:
RFC1155:Structure and Identification of Management Information for TCP/IP-based
Internets
RFC1157: SNMP
RFC1212: Concise MIB Definitions
RFC1215: A Convention for Defining Traps
RFC1905: Protocol Operations for SNMPv2
RFC2011: SNMPv2 Management Information Base for the Internet Protocol using SMIv2 RFC2578: Structure of Management Information
RFC2579: Textual Conventions
RFC2580: Conformance Statements
1.1 网络管理协议结构
SNMP的网络管理模型包括以下关键元素:管理端、代理端、管理信息库、网络管理协议。它基于tcp/ip协议,属于应用层协议,通过udp协议通信。管理端与代理端的通信原语包括:Get,Getnext,Set,Trap。在udp数据包中,发送信息是按ASN.1自解释方式编码的。但对于许多小型被监管设备,可能会运行不同协议,或者运行完整代理花费很大,于是产生了代管设备,主代理和子代理的概念。在小型设备上运行子代理,把数据发给主代理来完成snmp协议的通信。
网管基本模型
交互操作图
图中数字:1-----GetRequest 2-----GetNextRequest 3-----SetRequest 4-----GetResponse 5-----Trap
嵌入式Agent软件结构
1.2 管理信息库
SNMP以MIB(管理信息结构)为基础来描述被监管资源,由此建立的数据集和称之为MIB库。(它实质上就是制定格式的文本文件。)它是一种树型结构的数据库,被监管的对象都处于叶子节点上。每个被监管对象都由一个唯一的对象标识符来识别。对象信息的存储结构由MIB定义的简单变量和表来构造,它一般包含描述名(对象标识符)、数据类型、读写规则、功能描述、状态。MIB的定义可以查询RFC1155,它
定义了四种基本数据类型:INTEGER,OCTET STRING,OBJECT IDENTIFIER和NULL。由这四种基本类型通过SEQUENCE构造列和表,以及新类型如:NetworkAddress、IpAddress、Counter、Gauge、TimeTicks、Opaque等,以及宏定义。当然,根据需要还可以构造自己的数据类型。
1.3 SNMP的版本
目前SNMP有三个版本snmpV1、snmpV2、snmpV3。针对原始的V1版,93版的v2加入了安全机制,但用户对其并不感兴趣,在96版的v2中又删除了安全机制,99年开始酝酿的v3版开始提出一个snmp的统一架构,采用User-based安全模型和View-based访问控制模型提供SNMP网络管理的安全性。安全机制是SNMPv3的最具特色的内容。
2 SNMP开发软件包
目前,开发SNMP的软件包有许多可以选择如SNMP++、AGENT++、NET-SNMP等。SNMP++是基于C++的,一般多用于windows。
这里我们选用的是NET-SNMP。它是一个开源软件,基于C语言开发,便于移植。ucd-snmp源自于卡耐基.梅隆大学的SNMP软件包CMU snmp 2.1.2.1, 由加州大学Davis分校(University of California at Davis)开发与维护, 所以命名为ucd-snmp。2000年11月ucd-snmp项目转到由SourceForge(http://)管理, 并更名为net-snmp。
3 net-snmp软件包简介
3.1 NET-SNMP简介和安装
net-snmp早先是在Unix平台下开发的。现可以移植到:
HP-UX (10.20 to 9.01 and 11.0)
Ultrix (4.5 to 4.2)
Solaris SPARC/ULTRA (2.8 to 2.3), Intel (2.9) and SunOS (4.1.4 to 4.1.2)
OSF (4.0, 3.2)
NetBSD (1.5alpha to 1.0)
FreeBSD (4.1 to 2.2)
BSDi (4.0.1 to 2.1)
Linux (kernels 2.4 to 1.3)
AIX (4.1.5, 3.2.5)
OpenBSD (2.8, 2.6)
Irix (6.5 to 5.1)
OS X (10.1.1 and 10.1.2)
Dynix/PTX 4.4
QNX 6.2.1A
Windows
等多个平台。Net-snmp是一个代理端软件,但也提供管理端的查询工具。
安装有两种方式:一是直接安装的二进制包,二是需要编译的源代码。
我们在windows平台上安装的二进制包,在虚拟Unix平台CygWin上编译安装的源代码。在windows上的二进制包的安装非常简单,只需按提示就可完成。
源代码和二进制包可从http:///网站下载。之所以要先安装一个可运行的net-snmp系统,是因为我们开发程序运行环境的配置文件,是按照默认安装路径内部设定搜索的;另外,还可以利用其提供的配置工具来生成配置文件,利用提供的查询工具来测试程序。
3.2 NET-SNMP代理的配置
运行net-snmp之前先要进行环境设置,否则无法查询到结果。环境配置文件由snmpconf命令交互生成。运行snmpconf后,提示有三个配置文件:snmpd.conf,snmptraps.conf,snmp.conf。其中:
snmpd.conf用来配置代理和管理端通信时的参数,只需设置两个参数就可正
常运行程序了,一是community name,有只读rocommunity和读写
rwcommunity之分,相当于访问账号,这里设rocommunity为public;另一个
是访问端口,设为snmp协议默认的161端口。
Snmp.conf是与mib库设置相关的配置文件。
Snmptraps.conf用来设置代理陷阱。
另外,snmpconf和mib2c工具都是基于perl脚本的,在windows下需要安装perl才能运行。按照帮助文档的提示,下载ActivePerl安装。并按照帮助文档中perl的安装要求,下载在win32环境下所需的其他组件,配置并测试perl模块,使snmpconf和mib2c能正常运行。
3.3 NET-SNMP工具的使用
当环境设置好后,运行snmpd,即snmp代理进程,就可以使用管理工具查询其中的信息了。Net-snmp提供的查询工具有很多,大部分查询命令的格式都大同小异。这里以http://.dod.internet.mgmt.mib-2.system为例,其Oid为:.1.3.6.1.2.1.1。结构如下:
………system .1.3.6.1.2.1.1
|——sysDescr .1.3.6.1.2.1.1.1
|——sysObjectID .1.3.6.1.2.1.1.2
……
snmpget——snmpget [OPTIONS] AGENT OID [OID]...用来查询叶子节点
实例:
snmpget –v2c –c public localhost
snmpget –v2c –c public 192.168.12.77
snmpget –v2c –c public 127.0.0.1
说明:
-v2c: 使用的是2c的snmp版本,可选1|2c|3
-c public:community 名为public .1.3.6.1.2.1.1.5.0 .1.3.6.1.2.1.1.5.0 .1.3.6.1.2.1.1.5.0
localhost: 代理的地址,若代理运行在本机上,所以可用localhost
snmpgetnext.exe——snmpgetnext [OPTIONS] AGENT OID [OID]...通过父节点查询
叶子节点
实例:
snmpgetnext –v2c –c public localhost .1.3.6.1.2.1.1
说明:
这个命令假设不知道叶子节点,但知道父节点,则可遍历到第一个叶子节点。此
例结果等同于上一个例子。Oid也可输入.1.3.6.1.2,因为它是按字典顺序遍历的。
snmptable.exe——snmptable [OPTIONS] AGENT TABLE-OID 用来查询表对象
实例:
snmptable –v2c –c public localhost http://.dod.internet.mgmt.mib-2.ip.ipAddrTable snmpwalk
实例:snmpwalk -v1 192.168.12.77 -c public ucdDemoPublic
snmpset.exe——snmpset [OPTIONS] AGENT OID TYPE VALUE [OID TYPE
VALUE]...修改数据
实例:
snmpset –v2c –c public localhost .1.3.6.1.2.1.4.21.1.3.x i 99
说明:
x:在这里是索引值,表示表项中某一列的第几个数据,根据要求设定
i: 这里是列数据类型,包括i: INTEGER, u: unsigned INTEGER, t: TIMETICKS,
a: IPADDRESS o: OBJID, s: STRING, x: HEX STRING,
d: DECIMAL STRING, b: BITS U: unsigned int64,
I: signed int64, F: float, D: double
mib2c 用来把mib库文件编译成.c和.h模版。
实例:
mib2c t1Table
mib2c -c mib2c.scalar.conf lianyiPublic
mib2c -c mib2c.old-api.conf lianyiPublic
mib2c -c mib2c.mfd.conf lyTable
mib2c -c mib2c.genhtml.conf ifTable //生成mib文件的html格式
说明:
When you run mib2c, you must specify a MIB node for it to process. You can also specify which configuration file you would like it to use to generate the code. The available options are:
mib2c.int_watch.conf
mib2c.old-api.conf //scalar的ucd-snmp选项所用;
mib2c.scalar.conf //scalar的net-snmp选项所用;
mib2c.array-user.conf //
mib2c.create-dataset.conf //Table Data在agent里;
mib2c.iterate.conf //Table Data在外部时;
mib2c.iterate_access.conf //
mib2c.mfd.conf //
mib2c.notify.conf //(内容极简单,无采用价值)
mib2c.genhtml.conf模板:生成mib文件的html格式
4 用net-snmp软件包扩展代理---linux服务器
在利用net-snmp做扩展之前的准备工作是,一下载源代码,二编译出库文件:netsnmpagent.lib、netsnmphelpers.lib、netsnmpmibs.lib、netsnmp.lib。这四个库的工程文件都位于~\net-snmp-5.2.1.2\win32\下对应的文件夹中。编译库文件时注意把
netsnmp.lib放到最后编译,它可能会参考一下前面的编译文件。本文档中实现的代理程序,在源代码包中只需要引用这四个库文件。
开发工具VC6.0的环境设置也需要注意,参考帮助文档readme.win32,设置好include目录,library目录。在project\configure的选项link的相关栏目中添加上四个库文件,还要加上wsock32.lib库。另外,在程序编译过程中会碰到与VC的默认库相冲突的地方,按提示在上述添加库的地方加上/NODEFAULTLIB:XXX.LIB来除去默认库。
代理的开发过程基本上遵循:mib模块 转换成C文件 编译进代理中。
4.1 NET-SNMP中的scalar对象和table对象
mib模块一般都由变量和表组成。因此Net-snmp把SMI中的对象分为两大类:scalar和table。Scalar就包含我们常用的整型,字符串,时间等等数据类型。table就是scalar的一种集合,有一个和多个列组成,类似于数据库中的表。它必须具有索引项,用来按一定顺序检索表项。
Mib2工具通过模版把mib文件解析成.c和.h文件,这些文件仅仅是半成品,还需要手工在相应地方添加相应代码。Mib2c有很多模版,可以根据相应需要来调用不同的模版。但mib2c目前不支持同时解析scalar和table 对象,对于具有这两种对象的mib模块,需要分别生成代码文件,然后再合并成整体。
4.2 NET-SNMP扩展代理的两种方式(转)
用net-snmp扩展代理,实现方式可归结为两种:
一是静态库方式,通过修改配置头文件,在相应地方包含新引入的mib模块的.c和.h文件,然后重新编译库文件和代理程序;
二是编译动态共享库,只需把新引入的mib模块的.c和.h文件编译成动态库,通过设置能够让代理程序载入。
对于第二种方式,一需要编译成.so动态共享库,二需要原代理程序是否包含dlmod或load命令,三还要看系统是否支持。一般情况下仅支持Unix平台。我们在CygWin下试验过Unix平台编译。在VC下的编译环境,基本上都是参考其makefile,configure等文件。
第一种方式允许我们在原有mib库上添加新的mib模块,也可以只针对需要的mib模块编译单独的程序。源代码包中的代理程序工程文件位于~\ net-snmp\win32\snmpd下,因为它可移植到多个平台,主程序代码中有许多平台开关,和各种选项,非常庞大。为了简化开发和调试,我们使用了一个帮助文档中介绍的简化的代理端程序框架。这个框架非常精简,在性能上可能比原版差很多,但用来测试和开发mib库就比较高效了。程序的运行机制:程序启动,载入初始化mib模块,然后进入一个等待呼叫的无限循环,代码片段如下:
… …
init_MyMib();
… …
while(keep_running)
{
/* if you use select(), see snmp_select_info() in snmp_api(3) */
/* --- OR --- */
agent_check_and_process(1); /* 0 == don't block */
}
我们所要做的就是实现init_MyMib()函数,即自定义的mib模块。关于无限循环中的阻塞与否,根据mib模块而定。如果你的应用程序需要以非阻塞方式处理SNMP数据流,就使用一步接口(例如GUI、线程、forking等)。否则,只需要使用同步接口就可以了。在阻塞模式下,程序会占用大量cpu资源。具体实现可参见例子:【附录7.1】 下面以Linux下的为例分析;
4.3 自定义MIB扩展流程(Linux服务器上)
实现步骤如下:
1) 定义MIB文件
按照SMIV2的语法来定义描述被管理对象的MIB文件:***.txt;也使用
MG-SOFT公司的‖Visual MIB Builder‖可视化设计软件完成MIB库模块的定
义;
注意事项
注意表名必须为―***Table‖, 实体名应该为―***Entry‖;(因为在实践过程
中发现若名称不符合,mib2c不能正常执行;)
Mib文件中用到的数据类型注意要在IMPORTS中包含到;(若没包含
到,便认为是不合理的类型)
2) 利用mib2c生成C代码文件
MIB库模块定义后,需要在代理程序中增加与所定义的MIB库模块相对应的
源代码;用mib2c工具程序把MIB库模块文件转换成C源代码。
注意事项:
Mib文件必须要存放到mib库中:/usr/local/share/snmp/mibs;
使用mib2c工具时,要根据需要转换的MIB定义文件来选择配置文件。
传统的MIB定义文件一般根据里面的MIB变量是普通的MIB变量还是
二维表,以及MIB变量值的获取是通过外部资源还是通过agent本身,
来选择不同的mib2c配置文件;
在做mib文件时,若有表存在,注意标明应为*Table,实体:*Entry.因为
在实际应用中发现,若表明不为Table结束的,就不能正常生成代码文
件;
3) 添加自己的实现代码
根据不同的模板修改相应的代码;由模版生成的文件,不论是简单变量还是
表对象,其整体结构都是固定模式。在模版头文件中对节点进行宏定义,函
数声明。在模版实现文件中,分为两大块:一是初始化函数,主要用来对变
量注册;二是响应函数,用来响应管理端的查询命令,响应函数的返回值,
就是我们要手工实现的。我们所要做的工作就是把数据以一种合理的方式导
入到其中。
注意事项:
注意代码中用到的variablen 其中的n值可能有误,需要根据实际修改。有两个
地方需要修改并保持一致。
4) 编译调试所实现的代码
a) 通过修改配置头文件,在相应地方包含新引入的mib模块的.c和.h文件,然后
重新编译库文件和代理程序;
b) (先把原snmpd关闭并卸载)
c) ./configure -with-mib-modules="lyTable lianyiPublic" //
d) make
e) make install
f) cd /usr/local/sbin/
g) ./snmpd -Lf /var/log/snmpd.log –DALL //打印信息到日志文件snmpd.log
4.4 自定义MIB
这里我们定义了一个私人节点的MIB,位于节点http://.dod.internet. private.enterprises下,数字Oid为:.1.3.6.1.4.1。树型结构如下:
+--lianyiMIB(32189) (.1.3.6.1.4.1.32189)
|
+--lianyiMIBObjects(1)
|
+--lianyiPublic(1)
|
+-- -RW- Integer32 s1(1)
| Range: 0..2147483647
+-- -RW- String s2(2)
| Size: 0..1024
+-- -R-- String s3(3)
+-- -R-- String s4(4)
|
+--lyTable(5)
|
+--lyEntry(1)
| Index: lyIndex
|
+-- -R-- Integer32 lyIndex(1)
+-- -R-- String lyDescr(2)
| Textual Convention: DisplayString
| Size: 0..255
+-- -RW- EnumVal lyAdminStatus(3)
Values: up(1), down(2), testing(3)
4.5 代理扩展实例——简单变量的实现
mib2c.old-api.conf
参见【附录】
mib2c.scalar.conf
参见【附录】
流程简单说明
<1>:用mib2c -c mib2c.scalar.conf dvsMIB 生成.c .h文件;
<2>:
4.6 代理扩展实例——表对象的实现
为了更加有效的描述对象,引入表来把一系列相关的信息进行综合。因此表就由具有一个或多个变量的列组成。从实现方式和数据结构来看,表是一个结构体变量数组;从系统管理来看,就是数据库中的表单。从管理数据库的需求出发,就要求实现表单的插入、删除、恢复等基本功能,更高级的功能还应实现多个表的依赖关系、触发机制等。在底层实现上这些都要通过操纵结构体数组来完成。
Mib2c提供了表的生成模版。其目的之一是可以降低对SNMP知识的要求,二是分离请求中对数据的定位和响应中对数据的处理,使得实现上集中在对数据的处理上。因此它产生的模版主要由三个部分组成:一是数据结构,对请求数据的构造;二是数据检索,对请求数据的定位;三是操纵数据,对请求数据进行GET或SET。
不同的需求有不同的实现方式,mib2c根据表中导入数据的来源提供了两大类模版。
其分类按照运行mib2c时的交互信息:一类为数据相对代理处于外部,适合于监视和操纵外部数据的MIB,如从操作系统或其他系统的接口提取信息;并且表中的行的创建销毁,通常都独立于SNMP代理。第二类是数据为代理所有,代理对数据的操纵直接反映到数据源。
本文档只针对第一种类型实现表,且称之为外部方式。在mib2c进入外部方式,仍有三个模版,分别为:mib2c.iterate.conf,mib2c.iterate_access.conf,mib2c.mfd.conf;前两种方式基本一样,使用了helpers中一种叫iterator的API,特点是可以处理无序数据,但是效率较低,适合于小型数据存储,对内存、响应时间要求不是很严格的应用;后一种就很复杂了,它提供了更加细致的代码框架,通过多层交互,可以区分实时、半实时、永久型的数据,可以选择数据的存储方式,可以做列或表之间的依赖关系,数据结构的自动绑定或手工编辑,以及其他复杂的选项。
a) mib.iterator.conf模版的实现(转)
首先,这个模版生成了lyTable.c和lyTable.h文件。在lyTable.c文件中包含下列函数和结构体,形参省略:
struct LyTable_entry;
void init_LyTable;
void initialize_table_LyTable;
Netsnmp_Node_Handler LyTable_handler;
Netsnmp_First_Data_Point LyTable_get_first_data_point;
Netsnmp_Next_Data_Point LyTable_get_next_data_point;
struct LyTable_entry *LyTable_createEntry;
void LyTable_removeEntry;
实现过程我们按数据结构,数据检索,数据操纵来说明函数的调用和处理过程。
结构体:
struct LyTable_entry {
/* Index values */ /*这个结构体把lyTable中的*/
long UserIndex; /*变量都列举,并指明了索引变量 */
/*并有一个生成链表的next指针 */
/* Column values */
/* long UserIndex;*/ /*去掉重复 */
char UserStatus;
u_long CheckTime;
long MonSet;
long old_MonSet;
/* Illustrate using a simple linked list */
/* int valid;*/ /*没有用到的变量 */
struct LyTable_entry *next;
};
通过这个结构体,我们把从外部读入的数据做成一个链表,并把链表头地址传递给
LyTable_get_first_data_point;
LyTable_get_next_data_point;
用这两个函数遍历链表。
数据的检索:
数据的检索由LyTable_handler函数来完成,其原型为:
int LyTable_handler(
netsnmp_mib_handler *handler,
netsnmp_handler_registration *reginfo,
netsnmp_agent_request_info *reqinfo,
netsnmp_request_info *requests)
检索过程通过一个循环包含的两个语句:
for (request=requests; request; request=request->next) {
table_entry = (struct LyTable_entry *) /*检索匹配表中的行*/
netsnmp_extract_iterator_context(request);
table_info = netsnmp_extract_table_info(request); /*检索匹配表中的列
*/
这样相当于通过行号和列号确定了数据。而上面的两个函数需要调用
LyTable_get_first_data_point;
LyTable_get_next_data_point;
来遍历链表。
数据的操纵:
数据的操纵涉及到对请求命令的响应,其代码片断如下:
switch (reqinfo->mode) {
case MODE_GET:
switch (table_info->colnum) {
case COLUMN_USERINDEX:
snmp_set_var_typed_value( request->requestvb, ASN_INTEGER,
table_entry->UserIndex,
sizeof(table_entry->UserIndex));
… … … /*对于get命令,通过snmp_set_var_typed_value返回变量值*/
}
case MODE_SET_RESERVE1: /*对于set命令,就涉及这六个步骤,这里省略了 */ case MODE_SET_RESERVE2: /*具体实现代码,我们所做的程序中,没有涉及表 */ case MODE_SET_FREE: /*中行的创建和删除,模版说明中认为,set 一个 */ case MODE_SET_ACTION: /*不存在的索引,就可以在表中为其创建一行 */ case MODE_SET_UNDO:
case MODE_SET_COMMIT:
} /*代码已合并到mib.iterator_access.conf模版中*/
b) mib.iterator_access.conf模版的实现(转)
首先,这个模版生成了
LyTable.c
LyTable.h
LyTable_columns.h
LyTable_enums.h
LyTable_checkfns_local.h
LyTable_checkfns_local.c
LyTable_checkfns.h
LyTable_checkfns.c
LyTable_access.h
LyTable_access.c
这些文件实际上是对mib.iterator.conf模版功能的细化,提供更加完善方式的控制。只有部分需要修改,根据自定义的mib,只编辑了LyTable.c,LyTable_access.c等文件。
它提供了get_XXX()和set_XXX()函数来完成数据的获取和设置,需要手工实现。数据的组织不再自动生成,可以自己以其他方式实现,但仍要能关联到遍历函数上。LyTable_checkfns_local.c,LyTable_checkfns.c文件都是对set的检查操作。在主体结构和运行过程上仍和mib.iterator.conf模版一样。
c) mib2c.mfd.conf模版的实现
参见【附录】
注意:
4.7 代码的合并
在实现整个mib时,可以对各个对象分别编译,如:
./configure -with-mib-modules="lyTable lianyiPublic"(有几个对象就加入几个对象名,
之间以空格隔开);也可以将代码合并。合并的方法只需把简单变量的初始化函数和表实现的初始化函数合并。
如在上面的示例中,
简单变量的初始化函数为:init_lianyiPublic(void);
表的初始化函数为:initialize_table_lyTable();
若要把表和简单变量放到一起编译,可以将表的初始化函数initialize_table_lyTable()放到简单变量的初始化函数init_lianyiPublic(void)中调用;将init_lianyiPublic(void)作为主函数的初始化函数;同时,修改相关头文件的引用(将表的各个文件包含到简单变量的头文件中)。 如:在lianyiPublic.h中加入:
这样
4.8 配置和运行
在主函数中,代理的初始化由三个语句顺序完成:
init_agent("snmpd "); /*运行代理名*/
init_lianyiPublic ();
init_snmp("snmpd "); /*读入的配置文件名*/
这里需要写一个名为snmpd.conf的配置文件。然后放在安装目录~\usr\etc\snmp下。关闭防火墙,在命令提示符下运行该程序,然后用snmpget,snmpgetnext,snmptable,snmpset测试程序。
5 用net-snmp软件包扩展代理---嵌入式板端
5.1 概述
如何将代理程序放入嵌入式板子上?这里主要涉及到交叉编译。选择一台服务器,在服务器上进行交叉编译,编译过之后,再将代理程序snmpd直接放入板端指定目录,同时在/usr/local/etc/snmp/下放入配置文件即可。
在服务器上交叉编译的指令为:
交叉编译后,将指定安装目录/home/a/ly/mysnmp 下的snmpd文件拷贝到板端的/usr/sbin/目录下(/usr/sbin/snmpd);然后,放置配置文件:/usr/local/etc/snmp/snmpd.conf。 同时:cp /usr/local/etc/snmp/snmpd.conf /var/net-snmp/
下面是流程的详细介绍:
5.2 配置
运行./configuare --help,仔细查看了其安装编译选项。
./configure --host=arm-linux-uclibc --with-endianness=little --prefix=/home/a/ly/mysnmp 说明:
--host指明了我的目标平台;
--prefix指明安装路径;/home/a/ly/mysnmp 是我自己建立的一个安装路径,该路径可以自己随意制定;
make LDFLAGS="-static"
说明:
static:指明是静态编译;如果没有装lib库,可以用-static选项,指明是静态编译;若有库,就不需。如果不指出静态编译,那么直接放到板子上的程序会提示:can’t load library ‘libnetsnmpmibs.so.15’.
5.3 安装
make install
说明:
如果在./configuare的时候没有指定安装路径,也可以在此制定。
5.4 检查
查看下是否已经存在snmpd文件。因为得到的snmpd文件比较大,所以可以对它进行strip处理:处理过之后就剩下几百KB了。
5.5 移植
将指定安装目录/home/a/ly/mysnmp 下的snmpd文件拷贝到板端的/usr/sbin/目录下(/usr/sbin/snmpd);
然后,配置配置文件/snmpd.conf。并将该配置文件放入制定目录
和/var/net-snmp/ 目录下。
snmpd运行后会在/var/net-snmp目录下生成一个snmpd.conf文件。根据测试发现:
需要把/usr/local/etc/snmp/snmpd.conf下的文件拷贝到/var/net-snmp中