准备工作
开启SSH
SSH登陆FnOS切换root sudo -i
下载 ugreen_leds_cli 工
切换到 root
1:sudo -i
下载 ugreen_leds_cli 工具
2:cd /usr/bin
3:wget https://github.com/miskcoo/ugreen_leds_controller/releases/download/v0.1-debian12/ugreen_leds_cli
4:chmod +x ugreen_leds_cli
检查功能能不能用
5 :./ugreen_leds_cli all -off
如果报以下错误
Err: fail to open the I2C device.
Please check that (1) you have the root permission;
and (2) the i2c-dev module is loaded.
就执行下面的代码
6:sudo modprobe i2c-dev
完整监控脚本(包含电源和网口 LED 控制)
#!/bin/bash
# 飞牛NAS多设备LED监控脚本
# 功能:
# - 硬盘:待机时白色常亮,读写时根据操作类型闪烁
# - 电源:开机后保持白色常亮
# - 网口:无流量时白色常亮,有流量时七彩呼吸灯(流量越大呼吸越快)
# 配置参数(请根据实际设备修改)
DISKS=("sda" "sdb" "sdc" "sdd") # 硬盘设备名
DISK_LEDS=("disk1" "disk2" "disk3" "disk4") # 硬盘对应的LED名称
POWER_LED="power" # 电源LED名称
NETDEV_LED="netdev" # 网口LED名称
CHECK_INTERVAL=0.2 # 检查间隔(秒)
DISK_BLINK_RATE=200 # 硬盘活动时闪烁速率(毫秒)
IDLE_BRIGHTNESS=180 # 待机时亮度(0-255)
MAX_BRIGHTNESS=255 # 最大亮度(0-255)
NETDEV_BASE_SPEED=2000 # 网口无流量时的呼吸速度(毫秒)
NETDEV_MAX_SPEED=500 # 网口最大流量时的呼吸速度(毫秒)
# 颜色定义
IDLE_COLOR="255 255 255" # 待机时白色 (RGB)
DISK_READ_COLOR="0 0 255" # 硬盘读取时蓝色 (RGB)
DISK_WRITE_COLOR="255 0 0" # 硬盘写入时红色 (RGB)
DISK_MIXED_COLOR="255 0 255" # 硬盘混合操作时紫色 (RGB)
# 七彩灯颜色序列(用于网口流量显示)
RAINBOW_COLORS=(
"255 0 0" # 红
"255 127 0" # 橙
"255 255 0" # 黄
"0 255 0" # 绿
"0 0 255" # 蓝
"75 0 130" # 靛
"148 0 211" # 紫
)
# 定义命令路径
LED_CLI="/usr/bin/ugreen_leds_cli"
# 日志函数
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | logger -t "disk-led"
}
# 获取硬盘I/O计数
get_disk_io() {
local disk=$1
cat /sys/block/$disk/stat 2>/dev/null | awk '{print $1, $5}' || echo "0 0"
}
# 获取网络接口流量(单位:KB/s)
get_netdev_traffic() {
local iface="eth0" # 默认网卡,可修改为实际网卡名称
local rx_bytes=$(cat /sys/class/net/$iface/statistics/rx_bytes 2>/dev/null || echo 0)
local tx_bytes=$(cat /sys/class/net/$iface/statistics/tx_bytes 2>/dev/null || echo 0)
local total_bytes=$((rx_bytes + tx_bytes))
# 计算流量变化率
local traffic_diff=$((total_bytes - ${prev_net_bytes:-0}))
prev_net_bytes=$total_bytes
# 转换为KB/s
echo $((traffic_diff / 1024 / CHECK_INTERVAL))
}
# 设置网口LED为七彩呼吸灯
set_netdev_rainbow() {
local traffic=$1
local speed=$((NETDEV_BASE_SPEED - (traffic > 100 ? 100 : traffic) * (NETDEV_BASE_SPEED - NETDEV_MAX_SPEED) / 100))
# 根据流量计算呼吸速度(流量越大,速度越快)
local color_index=$(( $(date +%s%N) / 100000000 % ${#RAINBOW_COLORS[@]} ))
local color=${RAINBOW_COLORS[$color_index]}
$LED_CLI $NETDEV_LED -color $color -breath $speed $speed
}
log "启动飞牛NAS多设备LED监控服务..."
# 初始化LED状态
log "初始化电源LED为白色常亮"
$LED_CLI $POWER_LED -color $IDLE_COLOR -brightness $MAX_BRIGHTNESS -on
log "初始化网口LED为白色常亮"
$LED_CLI $NETDEV_LED -color $IDLE_COLOR -brightness $IDLE_BRIGHTNESS -on
# 初始化硬盘LED为白色常亮
for ((i=0; i<${#DISKS[@]}; i++)); do
log "初始化硬盘LED ${DISK_LEDS[$i]} 为白色常亮"
$LED_CLI ${DISK_LEDS[$i]} -color $IDLE_COLOR -brightness $IDLE_BRIGHTNESS -on
disk_counts[$i]=$(get_disk_io ${DISKS[$i]})
done
# 初始化网络流量
prev_net_bytes=$(get_netdev_traffic)
trap "cleanup; exit" SIGINT SIGTERM
cleanup() {
log "停止监控服务,关闭所有LED"
$LED_CLI $POWER_LED -off
$LED_CLI $NETDEV_LED -off
for ((i=0; i<${#DISKS[@]}; i++)); do
$LED_CLI ${DISK_LEDS[$i]} -off
done
}
log "开始监控所有设备状态..."
while true; do
# 检查硬盘状态
for ((i=0; i<${#DISKS[@]}; i++)); do
disk=${DISKS[$i]}
led=${DISK_LEDS[$i]}
# 检查硬盘是否存在
if [ ! -e "/sys/block/$disk" ]; then
$LED_CLI $led -off
continue
fi
# 获取当前I/O计数
curr_counts=$(get_disk_io $disk)
prev_counts=${disk_counts[$i]}
# 计算差值
read_diff=$(( $(echo $curr_counts | awk '{print $1}') - $(echo $prev_counts | awk '{print $1}') ))
write_diff=$(( $(echo $curr_counts | awk '{print $2}') - $(echo $prev_counts | awk '{print $2}') ))
# 根据硬盘状态控制LED
if [ $read_diff -gt 0 ] && [ $write_diff -eq 0 ]; then
# 读取活动:蓝色闪烁
$LED_CLI $led -color $DISK_READ_COLOR -blink $DISK_BLINK_RATE $DISK_BLINK_RATE
elif [ $write_diff -gt 0 ] && [ $read_diff -eq 0 ]; then
# 写入活动:红色闪烁
$LED_CLI $led -color $DISK_WRITE_COLOR -blink $DISK_BLINK_RATE $DISK_BLINK_RATE
elif [ $read_diff -gt 0 ] && [ $write_diff -gt 0 ]; then
# 混合活动:紫色闪烁
$LED_CLI $led -color $DISK_MIXED_COLOR -blink $DISK_BLINK_RATE $DISK_BLINK_RATE
else
# 待机状态:白色常亮
$LED_CLI $led -color $IDLE_COLOR -brightness $IDLE_BRIGHTNESS -on
fi
# 更新计数
disk_counts[$i]=$curr_counts
done
# 检查网络流量
traffic=$(get_netdev_traffic)
if [ $traffic -le 1 ]; then
# 无流量:白色常亮
$LED_CLI $NETDEV_LED -color $IDLE_COLOR -brightness $IDLE_BRIGHTNESS -on
else
# 有流量:七彩呼吸灯(流量越大,呼吸越快)
set_netdev_rainbow $traffic
fi
# 等待下一次检查
sleep $CHECK_INTERVAL
done
部署步骤
创建脚本文件:
nano /usr/local/sbin/feiniu_full_led_monitor.sh
粘贴上述代码,保存并设置权限:
chmod +x /usr/local/sbin/feiniu_full_led_monitor.sh
配置 systemd 服务:
nano /etc/systemd/system/feiniu-led-monitor.service
添加以下内容:
[Unit]
Description=FeiniuNAS Full LED Monitor
After=network.target local-fs.target
Wants=network-online.target
[Service]
Type=simple
ExecStart=/usr/local/sbin/feiniu_full_led_monitor.sh
Restart=always
RestartSec=5
User=root
Environment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
KillMode=process
TimeoutStopSec=5
[Install]
WantedBy=multi-user.target
启动服务并设置开机自启:
systemctl daemon-reload
systemctl enable feiniu-led-monitor
systemctl start feiniu-led-monitor