首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Net-SNMP 自定義 MIB 添加後 snmpget 返回「No such object」排查指南

     編輯:程式設計綜合問答

現象重現

  • 環境:Ubuntu 12.04,net-snmp 開發。
  • 自定義 MIB 僅含一個節點,參考教程編譯安裝。
  • 執行 snmpget -v2c -c public localhost 1.3.6.1.4.1.16535.1.1.0
  • 回應:Test-MIB::GetString.0 = No such object available on this agent at this OID

關鍵線索

輸出顯示 Test-MIB::GetString,說明 MIB 解析正確(OID 映射到符號名),但 Agent 實例中找不到對應的標量物件實例。

常見原因與排查步驟

1. MIB 模組未正確註冊到 Agent

  • 檢查 snmpd.conf 是否包含 dlmod testMIB /usr/lib/libtestMIB.so(或你的 .so 路徑)。
  • 重啟 snmpd:systemctl restart snmpd 或 /etc/init.d/snmpd restart。
  • 查看日誌 /var/log/syslog 是否有 dlmod: opening ... 及初始化訊息。

2. 節點註冊代碼缺少 REGISTER_SCALAR 或 REGISTER_MIB

C 代碼中必須在初始化函數(通常是 `init_testMIB`)中呼叫:

netsnmp_register_scalar(
    netsnmp_create_handler_registration(
        "testMIB",          // 模組名
        handle_testMIB,     // 處理函數
        testMIB_oid,        // OID 陣列
        OID_LENGTH(testMIB_oid),
        HANDLER_CAN_RONLY   // 唯讀
    )
);

若使用舊版 API,需確認 REGISTER_MIB("testMIB", testMIB_variables, variable1, testMIB_oid) 正確編譯鏈接。

3. OID 定義與 MIB 文件不一致

  • MIB 文件中 GetString OBJECT-TYPE SYNTAX DisplayString ACCESS read-only STATUS mandatory ::= { testMIB 1 }
  • C 代碼 oid testMIB_oid[] = {1,3,6,1,4,1,16535,1,1,0}; 最後一個 0 表示標量實例(.0)。
  • 兩者必須完全對應,否則 Agent 找不到實例。

4. 處理函數未正確填充 request->requestvb

int handle_testMIB(netsnmp_mib_handler *handler,
                   netsnmp_handler_registration *reginfo,
                   netsnmp_agent_request_info *reqinfo,
                   netsnmp_request_info *requests) {
    switch (reqinfo->mode) {
        case MODE_GET:
            snmp_set_var_typed_value(requests->requestvb, ASN_OCTET_STR,
                                     "Hello from custom MIB", 22);
            break;
    }
    return SNMP_ERR_NOERROR;
}

若處理函數未被調用(可加日誌驗證),說明註冊失敗。

驗證指令

# 1. 列出 Agent 支援的 MIB 模組
snmpwalk -v2c -c public localhost NET-SNMP-AGENT-MIB::nsModuleName

# 2. 直接查詢 OID 數值形式(繞過 MIB 解析)
snmpget -v2c -c public -On localhost 1.3.6.1.4.1.16535.1.1.0

# 3. 檢查 snmpd 運行狀態
systemctl status snmpd

快速修復清單

  1. 確認 .so 放置於 /usr/lib/ 或 /usr/local/lib/,並執行 ldconfig。
  2. snmpd.conf 添加 dlmod testMIB /full/path/libtestMIB.so。
  3. 重啟 snmpd,觀察 syslog 有無 testMIB: registered 訊息。
  4. 若仍失敗,編寫最小測試模組(僅一個標量),對比官方範例 agent/mibgroup/ucd-snmp/memory.c。

核心原則:MIB 文件只負責「翻譯」,Agent 共享庫負責「實現」。兩者缺一不可,且 OID、處理函數、註冊流程必須三位一體。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved