最近入手了一款6盘位矿渣:
它前面有一个LCD屏幕,用以显示硬盘信息以及风扇转速。LCD是1.8寸的z180sn009,由stm32f030控制,从cp2102转到usb接主机。所以理论上可以通过重新编程来实现任何想要的效果,不过太麻烦了。
在移除了自带的系统后,没有相应的驱动程序,屏幕的硬盘状态信息显示功能就失效了,因此需要编写脚本向stm32传输所需的数据。好在这个数据格式已经有大佬解析出来了:
"@QRC,$qrcode,${disk_num[5]},${disk_num[4]},${disk_num[3]},${disk_num[2]},${disk_num[1]},${disk_num[0]"
其中@QRC
为二维码标识符,qrcode
为二维码信息,后面的为硬盘图标颜色信息,用以改变对应硬盘图标的颜色。
大佬同时也编写了脚本,此脚本可以显示硬盘的安装状态:
#!/bin/bash
lcd_ctl(){
lcd_port=$(ls /dev/ttyUSB* |head -n1)
scsi_port=($(ls -l /sys/class/scsi_disk |egrep -v usb |awk '{print $9}' |grep -oE '[0-9].*'|cut -d: -f1))
qrcode=$(ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|tr -d "addr:" |xargs)
#qrcode=$(date)
stty -F $lcd_port speed 115200
disk_num=( 0 0 0 0 0 0 )
for ((i=0;i<${#scsi_port[@]};i++));do
num=$(( 5 - ${scsi_port[i]} ))
disk_num[$num]=3
done
diskinfo="${disk_num[5]},${disk_num[4]},${disk_num[3]},${disk_num[2]},${disk_num[1]},${disk_num[0]}"
echo "@QRC,$qrcode,$diskinfo*" > $lcd_port
}
while true;do
lcd_ctl
sleep 5
done
不过对于已经6个硬盘全部装满的我来说实在是没啥卵用,考虑到unraid可以实现硬盘单独休眠,因此想要实现如下功能:硬盘未安装、硬盘休眠、硬盘运行三个状态用不同的颜色表示。为了实现此功能,需要获取硬盘的运行状态,经查找,以下命令可以输出对应硬盘的状态:
smartctl -n standby $disk
$disk
为硬盘路径。
最终修改的脚本如下:
#!/bin/bash
lcd_ctl(){
# 获得LCD的USB端口
lcd_port=$(ls /dev/ttyUSB* |head -n1)
# 设置波特率
stty -F $lcd_port speed 115200
qrcode="10.0.0.4"
# 获取所有scsi硬盘路径
scsi_disk=("$(smartctl --scan | cut -b 1-8 | sed ':a ; N;s/\n/ / ; t a ; ')")
# 初始化硬盘状态(未安装)
disk_status=( 0 0 0 0 0 0 )
process_num=0
for disk in $scsi_disk
do
# 检测硬盘状态
if [[ $(smartctl -n standby $disk) =~ "ACTIVE" ]];then
disk_status[$process_num]=3 # 运行中
elif [[ $(smartctl -n standby $disk) =~ "STANDBY" ]];then
disk_status[$process_num]=1 # 已休眠
fi
let process_num+=1
echo $process_num
done
diskinfo="${disk_status[5]},${disk_status[4]},${disk_status[3]},${disk_status[2]},${disk_status[1]},${disk_status[0]}"
# 输出到LCD
echo "@QRC,$qrcode,$diskinfo*" > $lcd_port
}
while true;do
lcd_ctl
sleep 30
done