1. 程式人生 > >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的時候注意大小寫不要寫錯。