更新日志:
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

一、前置条件:
1.RR引导中
如果没设置过模块,默认是全选,跳过这一步。 确保在模块列表中,选择了如下模块:

编译引导后,启动进入DSM。
2.检查准备
SSH登陆NAS,并切换到root帐号:
sudo -i # 输入你帐户密码
确认加载了i2c模块:
lsmod | grep i2c
i2c_algo_bit 16384 1 i915
i2c_i801 28672 0

二、部署
下载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

三、问题
可能会遇到的问题:
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上有大佬写脚本直接用就可以。
希望这篇教程能对您有所帮助,我尽我所能地提供了详细的步骤和解释,但如果你发现任何错误或不清楚的地方,请务必在评论告诉我,欢迎随时交流,我们可以一起进步。