天天看點

net-snmp中載入第三方mib庫

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檔案的位置

[[email protected] ~]# 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日對這篇博文作了一些修改,希望大家 能看得更明白一些,^^。

繼續閱讀