snmpget -v2c -c public localhost 1.3.6.1.4.1.16535.1.1.0Test-MIB::GetString.0 = No such object available on this agent at this OID輸出顯示 Test-MIB::GetString,說明 MIB 解析正確(OID 映射到符號名),但 Agent 實例中找不到對應的標量物件實例。
snmpd.conf 是否包含 dlmod testMIB /usr/lib/libtestMIB.so(或你的 .so 路徑)。systemctl restart snmpd 或 /etc/init.d/snmpd restart。/var/log/syslog 是否有 dlmod: opening ... 及初始化訊息。REGISTER_SCALAR 或 REGISTER_MIBC 代碼中必須在初始化函數(通常是 `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) 正確編譯鏈接。
GetString OBJECT-TYPE SYNTAX DisplayString ACCESS read-only STATUS mandatory ::= { testMIB 1 }oid testMIB_oid[] = {1,3,6,1,4,1,16535,1,1,0}; 最後一個 0 表示標量實例(.0)。request->requestvbint 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
.so 放置於 /usr/lib/ 或 /usr/local/lib/,並執行 ldconfig。snmpd.conf 添加 dlmod testMIB /full/path/libtestMIB.so。testMIB: registered 訊息。agent/mibgroup/ucd-snmp/memory.c。核心原則:MIB 文件只負責「翻譯」,Agent 共享庫負責「實現」。兩者缺一不可,且 OID、處理函數、註冊流程必須三位一體。