专栏/绿联 UGREEN DX及DXP系列 NAS 黑群晖 面板LED 控制 V2.0

绿联 UGREEN DX及DXP系列 NAS 黑群晖 面板LED 控制 V2.0

2024年11月27日 05:50--浏览 · --点赞 · --评论
粉丝:32文章:5

更新日志:

1.简化操作流程,适配绿联DX及DXP系NAS;

2.执行命令增加条件检测;

3.解决盘位顺序与HCTL顺序不关联,导致指示灯错位的问题;

4.硬盘状态检测改为smartctl查看smart信息;

RR版本需要24.6.9及以上,脚本使用root权限运行

示范设备及版本:

RR版本 v24.7.0

型号:     SA6400(epyc7002)

版本:     7.2(69057u4)

内核:     official

LKM:      prod

DMI:      UGREEN DX4600 Pro/To be filled by O.E.M, BIOS 5.19 05/10/2023

CPU:      Intel(R) Pentium(R) Silver N6005 @ 2.00GHz

MEM:      15844 MB


cut-off-5

一、前置条件:

1.RR引导中

如果没设置过模块,默认是全选,跳过这一步。 确保在模块列表中,选择了如下模块:

编译引导后,启动进入DSM。

2.检查准备

SSH登陆NAS,并切换到root帐号:

sudo -i   # 输入你帐户密码

确认加载了i2c模块:

lsmod | grep i2c

i2c_algo_bit           16384  1 i915
i2c_i801               28672  0
cut-off-5

二、部署

下载ugreen_leds_cli:  [ https://github.com/miskcoo/ugreen_leds_controller/releases/download/v0.1-debian12/ugreen_leds_cli ]和下面代码块存为sh脚本,丢一个文件夹里面。比如在

/volume1/homes/xxxx/ugreen_leds/
├── ugreen_leds.sh
└── ugreen_leds_cli

整合包: https://wwcv.lanzn.com/b00ef8cs3c  密码:3rg8

在群晖控制面板-计划任务-新增-计划中的任务-用户自定义的脚本

任务名称 ugreen_led 用户账号为 root

计划中勾选 在同一天内继续运行,第5分钟重复一次。(自己改运行频率)

任务设置-运行命令 中粘贴以下脚本:

cd /volume1/homes/xxxx/ugreen_leds  #你刚才放脚本的文件夹目录
chmod +x ugreen_leds.sh
chmod +x ugreen_leds_cli
bash ugreen_leds.sh

power:默认白色,CPU温度高于90°C红色闪烁(rr引导中需要加上sensors插件);

netdev:能ping通网关为蓝色,否则为红色

disk[1-8]:测量S.M.A.R.T.信息正常为绿色,异常为红色,未知为黄色,温度高于50°C黄色闪烁

部分SSD不支持 smartctl -H 查看健康状态,默认为OK不代表健康,已跳过检测,请用厂商提供工具细看,HDD正常为PASSED,仅提供简单的健康评估结果,详细的 SMART 属性请使用 smartctl -a 查看。


ugreen_leds.sh:

#!/bin/bash

SCRIPTPATH=$(dirname "${0}")

if ! [[ -f "${SCRIPTPATH}/ugreen_leds_cli" ]]; then
  echo "在脚本目录没有找到ugreen_leds_cli!"
  exit 1
fi

# LED 到 HCTL 的映射
# https://github.com/miskcoo/ugreen_leds_controller?tab=readme-ov-file#disk-mapping
# 对于 DX4600 Pro 和 DXP8800 Plus,映射为 X:0:0:0 -> diskX。
# 对于 DXP6800 Pro,0:0:0:0 和 1:0:0:0 映射到 disk5 和 disk6,2:0:0:0 到 6:0:0:0 映射到 disk1 到 disk4。
# 其它机型或宿主机中虚拟群晖DSM请自行看看盘位 HCTL,根据实际盘位顺序,填写HCTL值
# disk是面板灯位,不要改动,物理机上有几个灯就留几个,其它灯注释掉。
declare -A led_map=(
    ["disk1"]="0:0:0:0"
    ["disk2"]="1:0:0:0"
    ["disk3"]="2:0:0:0"
    ["disk4"]="3:0:0:0"
    ["disk5"]="4:0:0:0"
    ["disk6"]="5:0:0:0"
    ["disk7"]="6:0:0:0"
    ["disk8"]="7:0:0:0"
)

# 映射以保持所需的 LED 颜色和状态
declare -A led_status

# 将所有 LED 初始化为关闭
led_status["power"]="-off"
led_status["netdev"]="-off"
for key in "${!led_map[@]}"; do
    led_status[$key]="-off"
done

# 检查网络状态
check_network_connectivity() {
    gw=$(ip route | awk '/default/ { print $3 }')
    if ping -q -c 1 -W 1 "${gw}" >/dev/null; then
        return 0
    else
        return 1
    fi
}

# 获取活动的 SATA 硬盘及其 HCTL 地址
active_disks=$(
    for dev in /dev/sata*; do
         # 确保设备是sata而不是分区
        if [ -e "$dev" ] && [[ "$(basename "$dev")" =~ ^sata[0-9]+$ ]]; then
            # 判断设备是否是 SATA 设备
            if udevadm info --query=property --name="$dev" | grep -q "SYNO_DEV_DISKPORTTYPE=SATA"; then
                # 提取 HCTL 地址
                hctl=$(udevadm info --query=all --name="$dev" | grep -oP 'target\d+:\d+:\d+/(\d+:\d+:\d+:\d+)' | head -n 1 | sed -E 's/target[0-9]+:[0-9]+:[0-9]+\///')

                # 输出设备名和 HCTL 地址
                echo "$(basename "$dev") $hctl"
            fi
        fi
    done
)

# 设置电源的 LED 状态(默认白色)
led_status["power"]="-color 255 255 255 -on -brightness 64"

# 检查是否安装了 sensors 命令(rr引导中需要加上sensors插件)
if command -v sensors >/dev/null 2>&1; then
    # 获取 CPU 温度
    cpu_temp=$(sensors | awk '/Core 0/ {print $3}' | cut -c2- | cut -d'.' -f1)
    # echo "当前CPU $cpu_temp°C"  # 日志 可注释
    if [[ -n "$cpu_temp" && "$cpu_temp" -gt 90 ]]; then
        # 如果超过 90°C,设置电源 LED 为红色闪烁
        led_status["power"]="-color 255 0 0 -on -blink 400 600 -brightness 64"
    fi
else
    echo "警告:未找到sensors命令。跳过 CPU 温度检查。" >&2
fi

# 检查网络连接并相应地设置 netdev LED
if check_network_connectivity; then
    led_status["netdev"]="-color 0 0 255 -on -brightness 64"  # Blue for connected
else
    led_status["netdev"]="-color 255 0 0 -on -brightness 64"  # Red for not connected
fi

# 根据活动硬盘信息调整 LED 状态
while read -r disk_info; do
    disk_name=$(awk '{print $1}' <<< "${disk_info}")
    hctl=$(awk '{print $2}' <<< "${disk_info}")
    led_name=$(for key in "${!led_map[@]}"; do [[ ${led_map[$key]} == "${hctl}" ]] && echo "${key}"; done)

    if [[ -n "${led_name}" ]]; then
        # 检查 SMART 状态
        smart_status=$(smartctl -H "/dev/${disk_name}" | sed -n '5p' | awk '{print $NF}')

        # 默认设置为 SMART 状态对应的 LED 状态
        case "${smart_status^^}" in
            #SSD默认为OK不代表健康,请用厂商提供工具细看,HDD正常为PASSED
            "PASSED"|"OK")
                led_status[$led_name]="-color 0 255 0 -on -brightness 64"  # Green for good
                ;;
            "FAILED")
                led_status[$led_name]="-color 255 0 0 -on -brightness 64"  # Red for bad
                ;;
            *)
                led_status[$led_name]="-color 255 255 0 -on -brightness 64"  # Yellow for unknown
                ;;
        esac

        # 检查温度
        if [[ -f "/run/synostorage/disks/${disk_name}/temperature" ]]; then
            disk_temperature=$(cat /run/synostorage/disks/${disk_name}/temperature 2>/dev/null)
           # echo "硬盘$led_name  温度: $disk_temperature°C"  # 日志 可注释
            if [[ -n "$disk_temperature" && "$disk_temperature" -gt 50 ]]; then
                # 温度超过 50°C,设置为黄色闪烁
                led_status[$led_name]="-color 255 255 0 -on -blink 400 600 -brightness 64"
            fi
        fi
    fi
done <<< "${active_disks}"


# 应用所需的 LED 颜色和状态
for led in "${!led_status[@]}"; do
    ${SCRIPTPATH}/ugreen_leds_cli $led ${led_status[$led]}
done
cut-off-5

三、问题

可能会遇到的问题:

1.灯位显示与实际不一致

复制到ssh中运行,查看硬盘型号与HCTL地址。

for dev in /dev/sata*; do
    if [ -e "$dev" ] && [[ "$(basename "$dev")" =~ ^sata[0-9]+$ ]]; then
        # 获取第 4 行和第 5 行的第二列(供应商和产品)
        vendor=$(smartctl -i "$dev" | sed -n '5p' | awk '{print $NF}')
        product=$(smartctl -i "$dev" | sed -n '6p' | awk '{print $NF}')
        capacity=$(smartctl -i "$dev" | sed -n 's/.*User Capacity:.*\[\(.*\)\].*/[\1]/p')
        # 获取硬盘的 HCTL 地址
        hctl=$(readlink "/sys/block/$(basename "$dev")/device" | sed 's/.*\([0-9]\+:[0-9]\+:[0-9]\+:[0-9]\+\)/\1/')

        # 输出供应商、产品和 HCTL 地址
        echo "制造商/品牌: $vendor 型号/标识: $product 容量: $capacity HCTL: $hctl"
    fi
done

例子:

制造商/品牌: A 型号/标识: 001 容量:\[8.00 TB] HCTL: 5:0:0:0

制造商/品牌: B 型号/标识: 002 容量:\[4.00 TB] HCTL: 9:0:0:0

如果现在我四盘位机型,对应disk1-4灯位,插入两块盘,A插在第二槽,B在第四槽。就改动disk2和disik4后面的HCTL,其它没插硬盘就可以注释掉:

物理机 disk2 这个灯位对应是 【制造商/品牌: A 型号/标识: 001 容量:\[8.00 TB] HCTL: 5:0:0:0】这块硬盘,就是 `["disk2"]="5:0:0:0"`

**disk1-8 是面板灯位,不要改动**

declare -A led_map=(
#    ["disk1"]="0:0:0:0"
    ["disk2"]="5:0:0:0"
#    ["disk3"]="2:0:0:0"
    ["disk4"]="9:0:0:0"
#    ["disk5"]="4:0:0:0"
#    ["disk6"]="5:0:0:0"
#    ["disk7"]="6:0:0:0"
#    ["disk8"]="7:0:0:0"
)

2.我的/dev里没有sata* 设备

如果你使用的是DT(Device tree)机型,如DS920+,DS923+, DS1520+, DS1621+, DS1821+, DS2422+,DVA1622, FS2500, SA6400等,则硬盘是以sata* 样式,不用修改。
如果你使用的是非DT机型,如DS918+,DS1621xs+,DS3622xs+,DS3617xs+,DS3615xs+等,则所有内容的 sata* 要替换为 sd* , ^sata[0-9]+$ 替换成 ^sd[a-z]$ 

四、扩展

常用颜色



参考


https://github.com/miskcoo/ugreen_leds_controller

https://blog.miskcoo.com/2024/05/ugreen-dx4600-pro-led-controller

https://gist.github.com/Kerryliu/c380bb6b3b69be5671105fc23e19b7e8

https://imnks.com/10101.html


结尾

感谢您花时间阅读这篇教程,咱是个萌新小白,对linux也是一知半解,就喜欢瞎折腾,请大佬轻喷。由于群晖没有lsblk,获取hctl得用其它方法,反而复杂了,如果是Debian、TrueNAS、unRAID、PVE在参考里面GitHub上有大佬写脚本直接用就可以。

希望这篇教程能对您有所帮助,我尽我所能地提供了详细的步骤和解释,但如果你发现任何错误或不清楚的地方,请务必在评论告诉我,欢迎随时交流,我们可以一起进步。


投诉或建议