TL;DR

下载关灯脚本,配置udev规则。实现插入指定USB网卡设备后不会亮灯、闪烁的效果。

问题描述

使用树梅派组建低成本网络存储项目搭建成的个人NAS是使用USB网卡进行互联的,这造成了USB网卡上的链接状态灯在夜间无数据访问时也会不断闪烁。 势必会影响周遭的正常休息。

在上网查找后,发现有基于Linux老版本内核的关灯教程。但是并不适用于Linux4.x的新子系统。故实验成功后记录。

解决的思路是直接将网卡灯在任何情况下的亮度设置为0,并配置内核udev设备管理器,在插入USB网卡设备后当即运行关闭网卡灯脚本。

解决方法

1. 下载disable_led_usb_wifi.sh脚本,设置其可被执行的权限,并存储在/usr/local/bin目录中。

#!/bin/sh
# Wait for associate then disable led on USB wifi adapter with led sub-system

disable_led() {
local DEVICE_NAME=rt2800usb-phy0

sleep 60
for i in /sys/class/leds/${DEVICE_NAME}*
do
echo 0 > ${i}/brightness
done
}

(disable_led ) &

如上所示,关灯脚本使用了后台执行的方案。这是因为udev的策略执行是阻塞性的,同时在插入设备后立即执行脚本不能实现关灯效果。 所以我们选择等待一个魔法数字(MAGIC NUMBER)的时长,待此之后再执行关灯脚本。

同时,你需要根据自身网卡设备,更改变量DEVICE_NAME的内容。

2. 添加udev策略

在目录/etc/udev/rules.d中添加规则100-usbwifi.rules,内容如下

ACTION=="add", ATTRS{idVendor}=="your-idvendor-here", ATTRS{idProduct}=="your-idproduct-here", RUN+="/usr/local/bin/disable_led_usb_wifi.sh"

请根据实际lsusb指令的输出,更换上述文本中的your-idvendor-hereyour-idproduct-here

举个例子,

root@OpenMediaVault:~# lsusb
Bus 001 Device 002: ID 0424:9512 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp.
Bus 001 Device 004: ID 1a40:0101 Terminus Technology Inc. 4-Port HUB
Bus 001 Device 005: ID 0080:a001
Bus 001 Device 006: ID 2001:3c1b D-Link Corp.
Bus 001 Device 007: ID 2537:1068

在上述的命令回显中,我们能得知USB网卡设备为

Bus 001 Device 006: ID 2001:3c1b D-Link Corp.

其中,idVendor为2001,idProduct为3c1b,规则100-usbwifi.rules的内容应为

ACTION==”add”, ATTRS{idVendor}==”2001”, ATTRS{idProduct}==”3c1b”, RUN+=”/usr/local/bin/disable_led_usb_wifi.sh”

FYI