Cacti能在Linux上展示网络流量图表,但必须同时满足snmpd正确暴露网卡OID、rrdtool可写且路径权限无误、poller.php能稳定轮询并写入RRD文件三个条件,缺一不可,否则图表空白或报RRD/ SNMP timeout等错误。

直接上结论:Cacti 能在 Linux 上展示网络流量图表,但必须同时满足三个条件——snmpd 正确暴露网卡 OID、rrdtool 可写且路径权限无误、cacti 的 poller.php 能稳定轮询并写入 RRD 文件。缺一不可,否则图表空白或报 RRD: Could not create、SNMP timeout 等错误。
snmpd.conf 配置必须放开 .1.3.6.1.2.1.2(IF-MIB)整棵子树
很多用户只加了 view systemview included .1.3.6.1.2.1.2,却忽略 SNMPv2c 默认的 access 规则只允许 systemview,而 Cacti 的“Interface Statistics”数据查询实际需要遍历 .1.3.6.1.2.1.2.2.1(ifTable)和 .1.3.6.1.2.1.31.1.1.1(ifXTable)等多个分支。
- 必须确保
snmpd.conf中有这三行(顺序无关,但缺一不可):view systemview included .1.3.6.1.2.1.2 view systemview included .1.3.6.1.2.1.31 access notConfigGroup "" any noauth exact systemview none none
- 不要用
view all included .1,它会暴露全部 MIB,存在安全风险;也不要只放开.1.3.6.1.2.1.1(system),那只能查主机名,查不到网卡 - 改完后执行
/etc/init.d/snmpd restart,再用snmpwalk -v 2c -c public localhost .1.3.6.1.2.1.2.2.1.2验证能否列出所有网卡名(如lo、eth0、ens33)
cacti poller.php 执行失败的常见原因和验证方式
/usr/bin/php /usr/share/cacti/poller.php --force 报错是图表不出的最直接信号。它不报错 ≠ 数据写入成功,需逐层验证。
- 先确认 PHP CLI 能加载必要扩展:
php -m | grep -E "(snmp|mysql|pdo|mbstring)"—— 缺snmp扩展会导致 SNMP 查询直接跳过 - 检查
cacti数据库用户是否有SELECT/INSERT/UPDATE权限:mysql -u cactiuser -p -e "use cacti; SELECT COUNT(*) FROM poller_output LIMIT 1;" - 确认
/var/lib/cacti/rra/(或你配置的$config['rra_path'])目录属主为apache或www-data,且有写权限:ls -ld /var/lib/cacti/rra/;若属主是root,poller.php写 RRD 时会静默失败 - 手动运行一次并加调试:
php /usr/share/cacti/poller.php --force --debug | tail -20,重点关注是否出现PHP Warning: snmpget(): No response from或RRD: Can't open '/var/lib/cacti/rra/xxx.rrd'
添加设备后没网卡可选?重点检查 Host Template 和 Data Query 绑定
Cacti 不是自动发现网卡,而是靠 “Host Template” 关联的 “Data Query” 来决定能查什么。默认模板 ucd/net SNMP Host 本身不含接口数据查询能力。
- 添加设备时,“Host Template” 必须选
Linux - Localhost(或明确带Interface字样的模板),而非ucd/net SNMP Host - 创建 Graph 前,点开该设备的 “Associated Data Queries”,确认 “SNMP – Interface Statistics” 已勾选并显示 “Success (X rows)”;若为 “Failed”,说明 SNMP 连通但返回空,大概率是
snmpd.confOID 权限不足 - 如果界面里始终看不到网卡名,用命令行验证:
snmpwalk -v 2c -c public 192.168.0.1 .1.3.6.1.2.1.2.2.1.2 | head -10,输出应为类似IF-MIB::ifDescr.1 = STRING: lo的格式;若返回No Such Object,就是 SNMP 配置问题
真正容易被忽略的是 RRD 文件的时间戳对齐问题:Cacti 默认每 5 分钟轮询一次,但如果你手动用 --force 多次执行 poller.php,RRD 文件里会出现时间断点,导致绘图引擎无法插值,图表就一直为空白——必须等真实轮询周期跑满 2–3 次,才能看到第一张有效图。


















