MIB报错(noSuchName)及私有RASP-MIB相关技术咨询
解决netSnmp中(noSuchName):该MIB中不存在此变量名的问题
先看你贴的RASP-MIB内容,直接就能找到几个导致错误的核心问题:
- 没有定义可查询的实际变量:你只创建了MIB的根节点
rasp MODULE-IDENTITY,但下面完全没有具体的OBJECT-TYPE(比如要采集的CPU温度、内存使用率这类实际数据项)。SNMP查询的是具体变量,没有这些变量,自然会返回noSuchName。 - RowStatus定义不完整:你写的
RowStatus ::= TEXTUAL-CONVENTION S...明显是截断状态,这会导致MIB编译失败,net-snmp根本无法正确解析这个MIB的结构。
下面给你梳理私有MIB配置和使用的关键注意事项,一步步来就不会踩坑:
一、先把MIB结构补完整
1. 添加具体的采集变量
在你的根节点下补充实际要采集的对象,比如采集树莓派CPU温度的示例:
raspObjects OBJECT IDENTIFIER ::= { rasp 1 } raspCpuTemp OBJECT-TYPE SYNTAX INTEGER MAX-ACCESS read-only STATUS current DESCRIPTION "树莓派CPU温度(单位:摄氏度)" ::= { raspObjects 1 }
只有定义了这类具体变量,SNMP才有可查询的目标。
2. 修复TEXTUAL-CONVENTION定义
如果不是要自定义RowStatus,其实直接从SNMPv2-TC里导入即可,不用自己编写:
IMPORTS OBJECT-TYPE, MODULE-IDENTITY, enterprises FROM SNMPv2-SMI TEXTUAL-CONVENTION, RowStatus FROM SNMPv2-TC;
要是非要自定义,就得写完整的结构,比如标准RowStatus的写法:
RowStatus ::= TEXTUAL-CONVENTION STATUS current DESCRIPTION "用于标识概念行的状态" SYNTAX INTEGER { active(1), notInService(2), notReady(3), createAndGo(4), createAndWait(5), destroy(6) }
二、正确编译与验证MIB
- 先检查MIB语法:
执行snmpwalk -m +RASP-MIB -v 2c -c public localhost .1.3.6.1.4.1.9100(这个OID对应你的rasp根节点),如果有语法错误,会直接给出提示,先把所有语法问题修复完毕。 - 用
mib2c生成代理代码框架:
执行mib2c raspObjects,根据提示选择合适的代码生成模式,这样能快速搭建采集逻辑的基础框架,不用从零写起。
三、配置net-snmp加载私有MIB
- 把你的
RASP-MIB文件放到net-snmp的MIB目录,通常是/usr/share/snmp/mibs/或者用户个人目录下的~/.snmp/mibs/。 - 修改
snmpd.conf配置文件:- 添加
mibs +RASP-MIB,确保snmpd启动时加载这个私有MIB; - 添加访问控制规则,比如
view systemview included .1.3.6.1.4.1.9100,让你的私有OID段可以被正常查询;
- 添加
- 重启snmpd服务:
sudo systemctl restart snmpd(不同系统可能用service snmpd restart命令)。
四、验证查询与完善采集逻辑
- 用变量名或OID验证查询:
比如查询刚才定义的CPU温度:snmpwalk -v 2c -c public localhost raspCpuTemp,或者直接用OID查询:snmpwalk -v 2c -c public localhost .1.3.6.1.4.1.9100.1.1。 - 填充实际采集逻辑:
生成的mib2c代码里,需要你自己编写获取数据的逻辑,比如读取树莓派的/sys/class/thermal/thermal_zone0/temp文件,把数值转换为摄氏度后返回。写完后编译成动态模块加载到snmpd,或者直接编译进snmpd即可。
内容的提问来源于stack exchange,提问作者Bali Vinayak
相关产品推荐
相关产品推荐

