显示标签为“SNMP”的博文。显示所有博文
显示标签为“SNMP”的博文。显示所有博文

2010年5月19日星期三

手动编译安装SNMP5.5的过程

./configure --prefix=/usr/local --with-perl-modules --enable-embedded-perl --enable-shared

Make

Make test

Make install

 

 

mib2c TEST-MIB:test   MIB2C生成代码

 

 



snmpwalk 出�"Timeout: No Response

snmpwalk 出�"Timeout: No Response

十月 22nd, 2008 at 17:38

bash: snmpwalk: command not found 是因为snmpwalk需要安装额外的软件包 net-snmp-utils

排除net-snmp安装的问题.......

如果还出现Timeout: No Respons

Timeout: No Response 是因为以下4种原因:

1、安全映射名(还有别的叫法,反正默认的就是public)。

2、防火墙。

3、系统没有启动服务。

4、您自己写的搜集状态的脚本运行时间较长。第四种原因还没有证实,目前我碰到的情况应该就是第四种。

使用snmpwalk若跑了一些讯息后停下来Timeout: No Respons

可能是网路环境不好,可以适度调整一下

请加参数(-t),例如:snmpwalk -c public -v 1 -t 120 192.168.1.55

 

源文档 <http://www.ai77.org/archives/77>

 



snmp配置问题

�教snmpd的��~�是出�~~Timeout: No Response from localhost

(1/1)

owenchen:

小弟的系��FC6

 

安�的SNMP版本�

net-snmp-utils-5.3.1-14.fc6

net-snmp-devel-5.3.1-14.fc6

net-snmp-5.3.1-14.fc6

 

snmpd.conf�定��:

 

com2sec notConfigUser  default       public

com2sec local          localhost     mymrtg

com2sec mynetwork      192.168.1.0/24 mymrtg

 

group   notConfigGroup v1           notConfigUser

group   notConfigGroup v2c          notConfigUser

group   MyRWGroup      v1           local

group   MyROGroup      v1           mynetwork

group   MyRWGroup      v2c          local

 

view    systemview    included   .1.3.6.1.2.1.1

view    systemview    included   .1.3.6.1.2.1.2

view    systemview    included   .1.3.6.1.2.1.25.1.1

view    all           included   .1 80

 

access  notConfigGroup ""      any       noauth    exact  systemview none none

access  MyROGroup      ""      any       noauth    exact  all none none

access  MyRWGroup      ""      any       noauth    exact  all all none

 

syslocation Unknown (edit /etc/snmp/snmpd.conf)

syscontact Root <root@localhost> (configure /etc/snmp/snmp.local.conf)

 

pass .1.3.6.1.4.1.4413.4.1 /usr/bin/ucd5820stat

 

�器Listsen的��如下:

[root@test snmp]# netstat -tulnp

Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name

tcp        0      0 0.0.0.0:20000               0.0.0.0:*                   LISTEN      2351/perl

tcp        0      0 0.0.0.0:832                 0.0.0.0:*                   LISTEN      1923/ypserv

tcp        0      0 0.0.0.0:389                 0.0.0.0:*                   LISTEN      1953/slapd

tcp        0      0 127.0.0.1:199               0.0.0.0:*                   LISTEN      7399/snmpd

tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN      2071/mysqld

tcp        0      0 0.0.0.0:110                 0.0.0.0:*                   LISTEN      2106/dovecot

tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      1902/portmap

tcp        0      0 0.0.0.0:10000               0.0.0.0:*                   LISTEN      2357/perl

tcp        0      0 192.168.1.12:53             0.0.0.0:*                   LISTEN      1876/named

tcp        0      0 192.168.1.11:53             0.0.0.0:*                   LISTEN      1876/named

tcp        0      0 127.0.0.1:53                0.0.0.0:*                   LISTEN      1876/named

tcp        0      0 0.0.0.0:25                  0.0.0.0:*                   LISTEN      5328/master

tcp        0      0 127.0.0.1:953               0.0.0.0:*                   LISTEN      1876/named

tcp        0      0 :::389                      :::*                        LISTEN      1953/slapd

tcp        0      0 :::80                       :::*                        LISTEN      2229/httpd

tcp        0      0 :::22                       :::*                        LISTEN      2002/sshd

tcp        0      0 :::443                      :::*                        LISTEN      2229/httpd

udp        0      0 0.0.0.0:32768               0.0.0.0:*                               1876/named

udp        0      0 0.0.0.0:10000               0.0.0.0:*                               2357/perl

udp        0      0 0.0.0.0:20000               0.0.0.0:*                               2351/perl

udp        0      0 0.0.0.0:161                 0.0.0.0:*                               7399/snmpd

udp        0      0 192.168.1.12:53             0.0.0.0:*                               1876/named

udp        0      0 192.168.1.11:53             0.0.0.0:*                               1876/named

udp        0      0 127.0.0.1:53                0.0.0.0:*                               1876/named

udp        0      0 0.0.0.0:829                 0.0.0.0:*                               1923/ypserv

udp        0      0 0.0.0.0:602                 0.0.0.0:*                               2121/rpc.yppasswdd

udp        0      0 0.0.0.0:111                 0.0.0.0:*                               1902/portmap

udp        0      0 :::32769                    :::*                                    1876/named

 

本���防火��置~~~~@@

�什�每次我下snmpwalk指令~~~都�有回�呢@@

[root@test snmp]# snmpwalk localhost -c mymrtg -v 1

Timeout: No Response from localhost

 

�教各位前�~~~真的不懂阿@@

��

[0] 文章列表

 

源文档 <http://phorum.study-area.org/index.php?topic=45287.0;wap2>

 



net-snmp中载入第三方mib库

 

Management Information Base(管理信息库,MIB)是一组对象,定义可对某个设备提出的查询。

我们所用的snmp监控主机如果要轮询一个支持snmp的设备的某项数据,它必须发出被查询设备所能理解的查询命令,这个就需要监控主机载入被查询设备对应的MIB,这个MIB将通知snmp监控主机有关由 MIB 模块化的数据的布局和组成。

Linux中所使用的net-snmp自带了一些标准的MIB,但是世界上支持snmp的设备有无数种,各厂家都有自己的定义,这些定义不可能都包含在net-snmp自带的MIB中,因此,想要正确轮询一个这样的设备,必须载入厂家自己的MIB文件。

一般我们下载回来的MIB文件可能后缀名为.mib,为了清晰起见,一般改成 MIB_NAME.txt 这样的形式,当然不改也可以,这个MIB文件叫什么名字无关紧要

 

系统要载入一个MIB文件,net-snmp必须知道从哪里载入。默认情况下是下边两个目录:

 

   1.  $HOME/.snmp/mibs

   2. /usr/local/share/snmp/mibs 

 

不过也有些发行版会改变这个默认路径,那么可以用下边两种方法之一获取它所使用的路径。

 

1.如果系统安装了net-snmp-config:   net-snmp-config --default-mibdirs

 

2.如果未安装net-snmp-config:   snmptranslate -Dinit_mib .1.3 2>&1 |grep MIBDIR

 

一般来说MIB文件是一个纯文本文件,我们打开这个文件查看,找到第一个包含 DEFINITIONS 的行

 

例如/usr/share/snmp/mibs/IP-MIB.txt 中包含如下一行

IP-MIB DEFINITIONS ::= BEGIN

这个DEFINITIONS关键字前边的 "IP-MIB" 就是系统在调用这个MIB文件时所使用的Module名称,这个很重要。

网上有一些文档说增加一个新的mib文件就是把mib文件复制到'/usr/share/snmp/mibs/'中就可以了,其实这是不对的!

首先,我们要将下载到的MIB文件复制到前边所说的两个默认路径中的一个里

但是光复制过去还不能生效,net-snmp是不会自动加载所有在/usr/share/snmp/mibs/目录中的mib文件的!

如果不能正确加载mib文件的话,就会出现 "Unknown Object Identifier" 这样的错误。 

如果要net-snmp自动加载我们下载的新MIB文件,有两种方法:

方法一: 放到snmp.conf中。

 

用 net-snmp-config --snmpconfpath可以确定snmp.conf文件的位置

 

[root@Kickstart-O ~]# net-snmp-config --snmpconfpath

/etc/snmp:/usr/share/snmp:/usr/lib/snmp:/root/.snmp:/var/net-snmp

 

将所要加载的MIB的Module名称加到snmp.conf中,如下例:

 

   mibs +CISCO-RHINO-MIB

   mibs +SOME-OTHER-SPIFFY-MIB

 

如果图省事也可以这样,当然我们不建议这样。

 

   mibs +ALL

 

因为这样有可能会提示如下错误

 

% snmpwalk -v2c public 192.168.1.100

 Warning: Module MAU-MIB was in /usr/share/snmp/mibs//DOT3-MAU-MIB.txt now is /usr/share/snmp/mibs//RFC2668-MIB.txt

 Warning: Module DISMAN-EVENT-MIB was in /usr/share/snmp/mibs//EVENT-MIB.txt now is /usr/share/snmp/mibs//DISMAN-EVENT-MIB.txt

 Warning: Module P-BRIDGE-MIB was in /usr/share/snmp/mibs//P-BRIDGE-MIB.txt now is /usr/share/snmp/mibs//P-BRIDGE.txt

 

可以将标准错误文件转向来屏蔽这些警告信息

 

% snmpwalk -v2c public 192.168.1.100 2>/dev/null

 SNMPv2-MIB::sysDescr.0 = STRING: Linux server1 2.4.34-pre2 #170 Fri Sep 15 20:10:21 CEST 2006 mips

 SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-TC::linux

 DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (706980) 1:57:49.80

 

方法二: 使用系统变量

 

   MIBS=+CISCO-RHINO-MIB:SOME-OTHER-SPIFFY-MIB

   export MIBS

通过上述两种方法之一,net-snmp就可以正确加载我们的新MIB文件,使用snmpget也就可以轮询到新MIB文件中所定义的OID了。

# snmpget -v1 -c public 192.168.49.253 BREEZECOM-DOT11EXT-MIB::roamQuality.1

  BREEZECOM-DOT11EXT-MIB::roamQuality.1 = INTEGER: 3

或者这样也可以

# snmpget -v1 -c public 192.168.49.253 roamQuality.1

  BREEZECOM-DOT11EXT-MIB::roamQuality.1 = INTEGER: 3

一个不太常用,但是非常有用的命令是snmptranslate,使用'snmptranslate' 命令可以获得一个文本项对应的OID值

# snmptranslate -On BREEZECOM-DOT11EXT-MIB::roamQuality

   .1.3.6.1.4.1.710.7.1.5.1.23.1.7

也可以使用'snmptranslate' 命令查询一个指定的对象

# snmptranslate -IR roamQuality

   BREEZECOM-DOT11EXT-MIB::roamQuality

还可以用snmptranslate命令把OID转化成文字描述

# snmptranslate .1.2.840.10036.2.2.1.12

   IEEE802dot11-MIB::dot11FCSErrorCount

# snmptranslate -Of .1.2.840.10036.2.2.1.12

.iso.member-body.us.ieee802dot11.dot11mac.dot11CountersTable.dot11CountersEntry.dot11FCSErrorCount

也可用snmptranslate命令从mib文件获得某个对象的全部细节

# snmptranslate -Td BREEZECOM-DOT11EXT-MIB:roamQuality

   BREEZECOM-DOT11EXT-MIB::roamQuality

   roamQuality OBJECT-TYPE

     -- FROM       BREEZECOM-DOT11EXT-MIB

     SYNTAX        Integer32

     MAX-ACCESS    read-only

     STATUS        current

     DESCRIPTION   "An indicator for the quality of the BSS. The quality is

                    calculated over the received Beacons of the BSS and depends

                    on the selected quality indicator. The semantics of the

                    indicator is 'low is good quality' and 'high is bad quality'."

   ::= { iso(1) org(3) dod(6) internet(1) private(4) enterprises(1) breezeCOM(710) ds11Products(7)    dot11ExtMIB(1) dot11ExtWBUObjs(5) roam(1) roamTable

(23) roamEntry(1) 7 }

另一个有用的命令是snmpwalk

  # snmpwalk -v1 -c public 192.168.49.253 dot11CountersTable

  IEEE802dot11-MIB::dot11TransmittedFragmentCount.1 = INTEGER: 122172497

  IEEE802dot11-MIB::dot11MulticastTransmittedFrameCount.1 = INTEGER: 45242

  IEEE802dot11-MIB::dot11FailedCount.1 = INTEGER: 4009

  IEEE802dot11-MIB::dot11RetryCount.1 = INTEGER: 1601483

  IEEE802dot11-MIB::dot11MultipleRetryCount.1 = INTEGER: 885859

  IEEE802dot11-MIB::dot11FrameDuplicateCount.1 = INTEGER: 543281

  IEEE802dot11-MIB::dot11RTSSuccessCount.1 = INTEGER: 0

  IEEE802dot11-MIB::dot11RTSFailureCount.1 = INTEGER: 0

  IEEE802dot11-MIB::dot11ACKFailureCount.1 = INTEGER: 3971754

  IEEE802dot11-MIB::dot11ReceivedFragmentCount.1 = INTEGER: 108826417

  IEEE802dot11-MIB::dot11MulticastReceivedFrameCount.1 = INTEGER: 31359

  IEEE802dot11-MIB::dot11FCSErrorCount.1 = INTEGER: 831325

  IEEE802dot11-MIB::dot11TransmittedFrameCount.1 = INTEGER: 122156588

  IEEE802dot11-MIB::dot11WEPUndecryptableCount.1 = INTEGER: 0

需要注意的是,在使用snmpget命令的时候,需要在查询的OID尾部增加.0 或者 .1,不然会报错。

   # snmpget -v1 -c public 192.168.49.253 dot11ACKfailureCount

   Error in packet

   Reason: (noSuchName) There is no such variable name in this MIB.

   Failed object: IEEE802dot11-MIB::dot11ACKFailureCount

   # snmpget -v1 -c public 192.168.49.253 dot11ACKFailureCount.1

   IEEE802dot11-MIB::dot11ACKFailureCount.1 = INTEGER: 3971912

还有在unix系统中,系统是大小写敏感的,因此写OID的时候注意大小写不要写错。

参考文档:

http://www.nwsmith.net/HintsTips/net-snmp-tutorial.htm

http://www.net-snmp.org/wiki/index.php/TUT:Using_and_loading_MIBS

注: 因为有几个网友加我msn询问本文中的一些问题,让我觉得原来一些地方写的不够清晰明了,因此在2010年02月05日对这篇博文作了一些修改,希望大家能看得更明白一些,^^。

 

源文档 <http://polygun2000.spaces.live.com/blog/cns!182B490BAC7D9686!389.entry>

 

http://polygun2000.spaces.live.com/default.aspx



安装SNMP需要注意的问题

本说明仅针对于下面的开发环境:

UCD-SNMP 4.2.7.1

RedHat Ent AS 4

-----------------------------------------------------------------------------------------------------------------

UCD-SNMP是个开源的SNMP实现项目。支持SNMPv1SNMPv2SNMPv3,支持基于IPv4IPv6SNMP应用程序开发。

 

UCD-SNMP包括以下内容:

完整的API用于SNMP应用程序开发(包括cperlAPI);

一个可扩展的SNMP代理程序(snmpd);开发者可开发动态模块扩展snmpdUCD-SNMP内置扩展子代理与主代理的通信协议;

提供众多命令行工具检查和使用SNMP协议;

一个trap接收进程,用于接收和显示trap。并可以将trap记录到日志文件里;一个图形化的MIB浏览工具(tkmib:基于Tk/Perl的);

UCD-SNMP被很多商业化linux包含,绝大部分公司使用UCD-SNMP的主代理实现LinuxSNMP支持。

 

 

安装ucd-snmp4.2.7之前需要注意的问题:

  1. 确认是否安装了libselinux libselinux-devel

/bin/sed: cant read /usr/lib/libbeecrypt.la: No such file or directory

libtool: link: `/usr/lib/libbeecrypt.la’ is not a valid libtool archive

make[1]: *** [libnetsnmpmibs.la] Error 1

解决:以为缺少libbeecrypt.la libbeecrypt.so等共享库,如:rpm ivh beecrypt-4.2.1

 

/usr/bin/ld: cannot find -lelf

解决:ln -s /usr/lib/libelf.so.1 /usr/lib/libelf.so linux系统有关

 

/usr/bin/ld:cant not find -lselinux

解决:缺少libselinux libselinux-devel包,如:rpm ivh selinux

 

  1. 确认是否安装了gcc编译器和Perl编译器
  2. 确认是否安装了libtool

 

 

安装ucd-snmp之前一定要注意,先配置好linux的运行环境,安装相应的包,凡是在敲入make命令编译的过程中,出现的错误提示,或是用make test命令编译出现的错误提示,均要首先考虑是否安装了软件包的devel版本。

如:libselinux-devel版本,beecrypt-devel版本,elf-devel版本等等。

 

----------------------------------------------------------------------------------------------------------------

 

 

UCD-SNMP安装完成以后:

  1. 可扩展代理snmpd位于:/usr/local/ snmp
  2. C语言开发库位于: /usr/local/ lib
  3. C语言开发头文件位于:/usr/local/ include
  4. UCD-SNMP提供的SNMP工具位于: /usr/local/ snmp
  5. UCD-SNMP依赖的MIB文件位于:/usr/local/ snmp/mibs
  6. UCD-SNMP依赖的配置文件: /usr/local/ snmp/conf/etc/snmp

 

UCD-SNMP命令说明:

  1. snmptranslate
  2. snmpget
  3. snmpgetnext
  4. snmpwalk
  5. snmptable
  6. snmpset
  7.  

FAQ

1.如何验证snmpd已经启动了?

ps –aef | grep snmpd

 

2. 是否可以从.1开始采集服务器数据?

snmpwalk -v 1 -c public localhost .1

 

  1. 如何使用自己的snmpd.conf文件?(尚未测试)

加入如下参数使snmpd使用指定配置文件启动:

snmpd -C -c /etc/snmp/snmpd.conf

//该方式,我们可以配置很多不同的配置文件,设置不同的运行环境,便于学习和开发。

 

  1. SNMP需要的包是什么?

libselinux-1.19.1-7.4

libselinux-devel-1.19.1-7.4

beecrypt-3.1.0-6

beecrypt-devel-3.1.0-6

 

[root@SAG ~]# rpm -ivh net-snmp-5.1.2-11.EL4.11.i386.rpm

warning: net-snmp-5.1.2-11.EL4.11.i386.rpm: V3 DSA signature: NOKEY, key ID db42a60e

error: Failed dependencies:

        libbeecrypt.so.6 is needed by net-snmp-5.1.2-11.EL4.11.i386

        libbz2.so.1 is needed by net-snmp-5.1.2-11.EL4.11.i386

        libcrypto.so.4 is needed by net-snmp-5.1.2-11.EL4.11.i386

        libelf.so.1 is needed by net-snmp-5.1.2-11.EL4.11.i386

        libnetsnmp.so.5 is needed by net-snmp-5.1.2-11.EL4.11.i386

        libnetsnmpagent.so.5 is needed by net-snmp-5.1.2-11.EL4.11.i386

        libnetsnmphelpers.so.5 is needed by net-snmp-5.1.2-11.EL4.11.i386

        libnetsnmpmibs.so.5 is needed by net-snmp-5.1.2-11.EL4.11.i386

        libnetsnmptrapd.so.5 is needed by net-snmp-5.1.2-11.EL4.11.i386

        libpopt.so.0 is needed by net-snmp-5.1.2-11.EL4.11.i386

        librpm-4.3.so is needed by net-snmp-5.1.2-11.EL4.11.i386

        librpmdb-4.3.so is needed by net-snmp-5.1.2-11.EL4.11.i386

        librpmio-4.3.so is needed by net-snmp-5.1.2-11.EL4.11.i386

        libselinux.so.1 is needed by net-snmp-5.1.2-11.EL4.11.i386

        libsensors.so.3 is needed by net-snmp-5.1.2-11.EL4.11.i386

        libwrap.so.0 is needed by net-snmp-5.1.2-11.EL4.11.i386

        libz.so.1 is needed by net-snmp-5.1.2-11.EL4.11.i386

 

 

rpm -ivh beecrypt-devel-3.1.0-6.x86_64.rpm

rpm -ivh elfutils-libelf-devel-0.97.1-5.x86_64.rpm

rpm -ivh libselinux-devel-1.19.1-7.4.x86_64.rpm

rpm -ivh lm_sensors-2.8.7-2.40.5.x86_64.rpm 



GCC 编译动态库及引用库 收藏

1、把头文件及C文件编译成*.o的文件 一般的命令:

     gcc -c -fPIC x.c 

     x为你的C文件名

     -fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。

2、把编译好的*.o文件链接成库文件 一般的命令:

     gcc -shared -o libxxx.so *.o *.o  ... *.o

     libxxx.so其中xxx为要生成的库文件名,linux动态库,库文件名格式为libxxx.so。*.o为第一步中生成的*.o文件。

3、测试你的库 要自己编一个测试程序假定测试文件名为test.c :

     gcc -Wall -I./ -L./ -lxxx -o run test.c

     -L.:表示要连接的库在当前目录中

     -ltest:编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.so来确定库的名称

     LD_LIBRARY_PATH:这个环境变量指示动态连接器可以装载动态库的路径。

     当然如果有root权限的话,可以修改/etc/ld.so.conf文件,然后调用 /sbin/ldconfig来达到同样的目的,不过如果没有root权限,那么只能采用        输出LD_LIBRARY_PATH的方法了。

     run为要生成的测试程序可执行文件名

4、$ldd run

     执行run,可以看到它是如何调用动态库中的函数的。也可以看哪里调用失败

5、注意:

     调用动态库的时候有几个问题会经常碰到,有时,明明已经将库的头文件所在目录 通过 “-I” include进来了,库所在文件通过 “-L”参数引导,并指定了“-l”的库名,但通过ldd命令察看时,就是死活找不到你指定链接的so文件,这时你要作的就是通过修改LD_LIBRARY_PATH或者/etc/ld.so.conf文件来指定动态库的目录。通常这样做就可以解决库无法链接的问题了。



本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/qihuanfengyun/archive/2010/01/22/5223353.aspx

uCLinux上UCD-SNMP Agent的实现

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

Linux服务器整体性能监控攻略

网管实战:Linux服务器整体性能监控攻略

Linux服务器性能监测是很重要的工作,服务器运行应该提供最有效的系统性能。当服务器系统性能突然低于平均应有的情况,问题可能来自在执行的进程、内存的使用率、磁盘的性能、网络流量和CPU 的压力。在预算短缺的今天,理解如何优化系统性能比以往任何时候都重要。要实现它的前提是,你必须充分了解自己的计算机和网络,从而找到真正的瓶颈所在。本文提供一些基础的工具来辨别和处理一些性能问题。使用的Linux 发行版本是Red Hat Enterprise Linux 4,工作过程是:首先查看整个系统的状态,然后是检查特定的子系统。    Linux服务器进行性能监控有几种方法,每种方法都各有其优缺点。

 使用SNMP等标准工具

    标准及非标准工具能执行一个或多个收集、合并及传输阶段,如rstatd或SNMP工具,然而标准的rstat后台程序提供的信息是有限的,速度慢而且效率低。

 内核模块

    几个系统监控工程利用内核模块来存取监控数据。一般情况下,这是很有效的收集系统数据的方法。然而这种方法存在的问题是,当主内核源内有其它改变时,必须保持代码一致性。一个内核模块可能与用户想使用的其它内核模块相冲突。此外,在使用监控系统之前,用户必须获得或申请模块。

 /proc虚拟文件系统

    /proc虚拟文件系统是一个较快的、高效率执行系统监控的方法。使用/proc的主要缺点是必须保持代码分析与/proc 文件格式改变的同步。事实表明,Linux内核的改变比/proc 文件格式的改变要更频繁,所以,用/proc虚拟文件系统比用内核模块存在的问题要少。本文介绍的方法即基于/proc虚拟文件系统。
一、 /proc文件系统特点
    Linux 系统向管理员提供了非常好的方法,使他们可以在系统运行时更改内核,而不需要重新引导内核系统。这是通过 /proc 虚拟文件系统实现的。/proc 文件虚拟系统是一种内核和内核模块用来向进程 (process) 发送信息的机制 (所以叫做 /proc)。这个伪文件系统让你可以和内核内部数据结构进行交互,获取 有关进程的有用信息,在运行中 (on the fly) 改变设置 (通过改变内核参数)。 与其他文件系统不同,/proc 存在于内存之中而不是硬盘上。不用重新启动而去看 CMOS ,就可以知道系统信息。这就是 /proc 的妙处之一。/proc 目录里主要文件内容,见表-1:
表-1

   小提示: 每个Linux系统根据软硬件不同/proc 虚拟文件系统的内容也有些差异。/proc 虚拟文件系统有三个很重要的目录:net,scsi和sys。Sys目录是可写的,可以通过它来访问或修改内核的参数,而net和scsi则依赖于内核配置。

二、 系统负载监测

    1 使用uptime命令

    使用uptime命令可以查看系统负载,系统平均负载被定义为在特定时间间隔内运行队列中的平均进程数目。如果一个进程满足以下条件则其就会位于运行队列中:没有在等待I/O操作的结果、它没有主动进入等待状态(也就是没有被调用、没有被停止。

    # uptime

    9:51pm up 3 days, 4:43, 4 users, load average:6.02, 5.90, 3.94
    上面命令显示示最近1 分钟内系统的平均负载是6.02,在最近5分钟内系统的平均负载是5.90,在最近的15 分钟内系统的平均负载是3.94。一共四个用户。对于上面的例子来说,由于笔者系统使用是双CPU,那幺其每个CPU的当前任务数为:6.02/2=3.01。另外可以使用cron命令进行定时监测系统负载:
    # crontab -e
    此时打开一个vi编辑器:输入以下内容:
    #30 * * * * * uptime
    存盘退出,这样每隔30分钟就记载其平均负载,这样累计一天,我们就可以得到最近一天的平均负载。

    2 使用cat /proc/loadavg命令

    #cat /proc/loadavg
     0.40 0.79 0.70 2/245 4101
     Cat /proc/loadavg提供以下数据:
    1秒钟平均负载;5秒钟平均负载;15秒钟平均负载;总作业数;正在运行的作业总数。

    3 使用cat /proc/stat命令

    # cat /proc/stat
    cpu  16015 1353 28840 101677 3602 664 4323
    cpu0 16015 1353 28840 101677 3602 664 4323
    intr 1605646 1565008 52 0 4 4 0 6 0 1 8664 296 16675 1418 0 0 13518
    ctxt 617320
    btime 1178342189
     processes 4236
    procs_running 2
    procs_blocked 0
    cat /proc/stat命令是包含内核统计量,提供以下数据:
    CPU 以及CPU0、每行的每个参数意思(以第一行为例)为: 
    user (432661) 从系统启动开始累计到当前时刻,用户态的CPU时间(单位:jiffies) ,不包含 nice值为负进程。1 jiffies=0.01秒 
    nice (13295) 从系统启动开始累计到当前时刻,nice值为负的进程所占用的CPU时间(单位:jiffies) 
    system (86656) 从系统启动开始累计到当前时刻,核心时间(单位:jiffies) 
    idle (422145968) 从系统启动开始累计到当前时刻,除硬盘IO等待时间以外其它等待时间(单位:jiffies) 
    iowait (171474) 从系统启动开始累计到当前时刻,硬盘IO等待时间(单位:jiffies) , 
irq (233) 从系统启动开始累计到当前时刻,硬中断时间(单位:jiffies) 
    softirq (5346) 从系统启动开始累计到当前时刻,软中断时间(单位:jiffies) 
     CPU时间=user+system+nice+idle+iowait+irq+softirq 
    "intr"这行给出中断的信息,第一个为自系统启动以来,发生的所有的中断的次数;然后每个数对应一个特定的中断自系统启动以来所发生的次数。 
    "ctxt"给出了自系统启动以来CPU发生的上下文交换的次数。 
    "btime"给出了从系统启动到现在为止的时间,单位为秒。 
     "processes (total_forks) 自系统启动以来所创建的任务的个数目。 
    "procs_running":当前运行队列的任务的数目。 
    "procs_blocked":当前被阻塞的任务的数目。 

    4 使用xload图形显示系统负载

    如果安装了KDE环境,可以使用xload 显示系统平均负载的柱状图 ,它会定期地更新。xload是Linux一个系统命令,使用方法:
 

     应用实例:

    #xload -scale 1 -update 1 -fg red -hl400 
    上面命令表示使用xload查看系统的负载。每秒更新一次,其尺寸大小为400,前景颜色为红色,背景颜色为蓝。见图-1。

图1 用xload图形显示系统负载

三、 通过phpsysinfo 调用浏览器监控
    由于/proc文件系统非常大,而且系统是动态变化的,所以使用Linux命令比较麻烦,这里我们使用一个工具:phpsysinfo,它是一个支持PHP网页服务器用于侦测主机一些资料的PHP 脚本工具软件,可以提取/proc文件系统中的信息,以图形方式显示出来。另外phpsysinfo支持包括中文在内的20多种语言和许多风格的模板。
    1.系统要求:
    除了要搭建一个基于LAMP(Linux+PHP+APACHE+MYSQL)的网络构架,其它系统要求:软件:它要求内核(Kenerl)至少在2.2以上。KDE 2.0,桌面颜色至少16位增强色。硬件:中央处理器:奔腾II 450 以上 ,内存 64 兆 ,硬盘空间 60兆。安装前的准备工作: phpsysinfo 是用PHP语言写成的。 
    2.软件下载
    #wget http://jaist.dl.sourceforge.net/sourc ... nfo/phpsysinfo-2.3.tar.gz 
    3. 软件安装: 将下载的软件拷贝到/var/www/html/目录下,执行:
    #mv phpsysinfo-2.3.tar.gz /var/www/html/sysinfo
    #tar -zxvf phpsysinfo-2.3.tar.gz 
    #cd sysinfo 
    #cp config.php.new config.php
    4.运行软件:
    启动apache服务 
    #/usr/local/apache2/bin/apachectl start 
    测试http://localhost/sysinfo (见图2)


图2 phpsysinfo的中文工作界面

    phpsysinfo检测分成五个部分:
    (1)主机系统资源:主机名称、IP地址、内核版本、已开机时间、登入人数、系统负载。
    (2)硬件信息:CPU型号、工作频率、快取大小、逻辑操作数、PCI接口、IDE接口、SCSI接口。
    (3)网络负载:网络数据包接收、传送、错误/遗失。
    (4)内存资源情况,包括物理内存、虚拟内存等。
    (5)已挂载分区:硬盘分区名称,使用比例。
     你也可以用它来测试你所租用的虚拟主机的设备及网络状况的品质。


2010年4月20日星期二

很感谢这篇文档,嘿嘿!帮我解决了用mib2c生成 H 头文件和C 程序的功能。

http://openhpi.sourceforge.net/subagent-manual/c53.html


./configure --prefix=/usr/local --with-perl-modules --enable-embedded-perl --enable-shared

Make

Make test

Make install

 

 

mib2c lnvSecurity   MIB2C生成代码