三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

OpenWrt LED触发器实战:从心跳指示到网络监控

OpenWrt LED触发器实战:从心跳指示到网络监控

1. OpenWrt LED触发器入门指南

路由器上那些闪烁的小灯不只是装饰品,在OpenWrt系统中它们可以变身成为强大的状态监控工具。想象一下,当你走进房间,只需瞥一眼路由器LED就能知道:CPU是否过载、网络是否通畅、USB设备是否连接成功——这就是LED触发器能带给我们的直观体验。

我刚开始接触OpenWrt时,发现系统默认的LED配置相当基础。直到某次排查网络故障,看到同事的路由器LED会随着数据流量跳动,才意识到这些指示灯可以如此智能。现在我的路由器就像个会说话的小助手:蓝色灯规律闪烁表示系统正常,黄色灯快速跳动提醒CPU负载过高,绿色灯常亮则代表外网连接畅通。

要开启这个神奇功能,首先需要了解LED在OpenWrt中的组织方式。所有可控制的LED设备都集中在/sys/class/leds目录下,每个LED对应一个以路由器型号:颜色:功能命名的子目录。比如我的Newifi D2路由器就有这些LED设备:

newifi-d2:amber:internet newifi-d2:blue:power newifi-d2:blue:wlan5g

2. 基础触发器实战配置

2.1 心跳指示器(heartbeat)

这个触发器能让LED像心跳一样跳动,而且频率会随系统负载变化。上周我服务器遭遇CC攻击时,就是通过这个功能第一时间发现了异常——LED疯狂闪烁的频率明显不正常。

配置方法简单到令人惊讶:

# 进入LED设备目录 cd /sys/class/leds/newifi-d2:blue:power # 设置触发器类型 echo heartbeat > trigger

要让配置永久生效,需要修改/etc/config/system文件:

uci set system.led_power.trigger='heartbeat' uci commit service led restart

实测发现几个实用技巧:

  • 负载低于0.3时,LED每2秒闪烁一次
  • 负载达到1.0时,闪烁频率升至每秒2次
  • 负载超过5.0后,LED会进入近乎常亮状态

2.2 网络活动监控(netdev)

这个功能我称之为"网络脉搏监控器"。配置好后,LED会在以下情况亮起:

  • 网络连接建立(link)
  • 数据发送(tx)
  • 数据接收(rx)

配置示例:

echo netdev > trigger echo eth0 > device_name # 监控网卡 echo 1 > link # 启用连接状态指示 echo 1 > tx # 启用发送指示 echo 1 > rx # 启用接收指示

更专业的做法是直接修改配置文件:

uci batch <<EOF set system.led_wan=led set system.led_wan.name='WAN' set system.led_wan.sysfs='newifi-d2:amber:internet' set system.led_wan.trigger='netdev' set system.led_wan.dev='eth0.2' set system.led_wan.mode='link tx rx' EOF uci commit

3. 高级触发器应用场景

3.1 定时闪烁(timer)

这个触发器特别适合用来做视觉提醒。我把备用路由器的LED配置成每5秒闪烁一次,当主路由器故障时,这个醒目的闪烁模式能立即吸引注意力。

精确控制闪烁节奏的参数:

echo timer > trigger echo 500 > delay_on # 亮灯500毫秒 echo 2000 > delay_off # 灭灯2000毫秒

在配置文件中可以这样设置:

config led 'led_alert' option name 'Alert' option sysfs 'newifi-d2:red:status' option trigger 'timer' option delayon '100' option delayoff '100'

3.2 USB设备连接指示(usbport)

对于常接移动硬盘的路由器,这个功能非常实用。当USB设备被识别时,特定LED会自动亮起。我遇到过USB供电不足导致硬盘频繁掉线的情况,就是通过观察LED异常才定位到问题。

配置方法:

opkg install kmod-ledtrig-usbdev echo usbport > trigger echo 1 > ports/usb1-port1 # 监控USB1的第一个端口

等效的UCI配置:

config led 'led_usb' option name 'USB' option sysfs 'newifi-d2:blue:usb' option trigger 'usbport' option dev '1-1' # 1号USB hub的第1个端口

4. 创意组合应用

4.1 多LED协同工作

我把三个LED组合起来创建了完整的系统状态指示方案:

  • 蓝色LED:heartbeat模式显示CPU负载
  • 黄色LED:netdev模式显示WAN口活动
  • 红色LED:timer模式作为定时提醒

配置片段示例:

# CPU负载LED config led 'led_cpu' option name 'CPU' option sysfs 'newifi-d2:blue:status' option trigger 'heartbeat' # 网络活动LED config led 'led_net' option name 'NET' option sysfs 'newifi-d2:yellow:internet' option trigger 'netdev' option dev 'eth0.2' option mode 'link tx rx' # 定时提醒LED config led 'led_reminder' option name 'REMIND' option sysfs 'newifi-d2:red:status' option trigger 'timer' option delayon '100' option delayoff '5000'

4.2 网络故障自诊断

通过LED触发器可以实现基础的自诊断功能。当检测到网络异常时,可以让LED进入特定闪烁模式。比如我的路由器配置了这些告警模式:

  • 慢闪(1Hz):DNS解析失败
  • 快闪(5Hz):网关不可达
  • 交替闪烁:IP冲突

实现方法是通过cron定时执行网络检测脚本,发现问题时修改LED配置:

#!/bin/sh # 测试网络连通性 ping -c 1 8.8.8.8 >/dev/null 2>&1 if [ $? -ne 0 ]; then # 网络不通时设置红色LED快速闪烁 echo timer > /sys/class/leds/newifi-d2:red:status/trigger echo 100 > /sys/class/leds/newifi-d2:red:status/delay_on echo 100 > /sys/class/leds/newifi-d2:red:status/delay_off fi

5. 常见问题排查

在调试LED触发器时遇到过几个典型问题。最棘手的一次是配置完发现LED毫无反应,后来发现是内核模块没有正确加载。现在我的检查清单是这样的:

  1. 确认LED设备存在:
ls /sys/class/leds/
  1. 检查可用触发器:
cat /sys/class/leds/newifi-d2:blue:power/trigger
  1. 验证内核模块:
lsmod | grep led
  1. 查看系统日志:
logread | grep led

常见错误解决方案:

  • 缺少内核模块:opkg install kmod-ledtrig-xxxx
  • 权限问题:尝试用root用户操作
  • 拼写错误:检查LED名称和路径
  • 触发器不支持:查看内核编译选项

记得有次配置netdev触发器后LED始终不亮,最后发现是网卡名称写错了。通过ifconfig确认实际网卡名后问题迎刃而解。

← 返回列表