准备工作
开启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