在 Linux 系统中,有的时候我们需要根据实际需要调节风扇转速,特别是私人存储服务的场景中,要保证硬盘正常运行的同时,有效降低噪音并节约能源要兼顾安静又需要兼顾硬盘散热,。
在现有的工具中,已经有fancontrol、HDDFanControl可以控制风扇转速,后者可以直接根据硬盘温度调节特定风扇。已经很方便了。
但是我是用的存储系统是OpenMediaVault,不知道为什么我安装的HDDFanControl就不起作用,明明也能识别到风扇。试了很多种方法还是不行,因此有了本篇文章这种另辟蹊径的方法:通过脚本来控制。
一、所需应用及工具
- sensors :用于获取硬件传感器数据,包括硬盘温度等(Debian/Ubuntu安装指令:
apt install lm-sensors)。 - bc :命令行计算器,用于进行浮点数比较。
- cron :用于定时执行脚本。
二、脚本编写
#!/bin/bash
# 定义温度阈值(摄氏度)
TEMP_THRESHOLD=42
# 定义风扇控制文件路径
FAN_CONTROL_PATH="/sys/devices/platform/nct6775.656/hwmon/hwmon5/pwm4"
# 定义日志文件路径
LOG_FILE="/var/log/temperature_monitor.log"
# 函数:获取所有drivetemp-scsi的温度
get_scsi_temps() {
sensors | grep "drivetemp-scsi" -A 2 | grep "temp1:" | awk '{print $2}' | tr -d '+°C'
}
# 主逻辑
get_scsi_temps >/dev/null 2>&1
if [ $? -ne 0 ]; then
echo "$(date +'%Y-%m-%d %H:%M:%S') - Failed to get temperature data." >> "$LOG_FILE"
exit 1
fi
TEMPS=$(get_scsi_temps)
OVER_THRESHOLD="0"
for temp in $TEMPS; do
if (( $(echo "$temp > $TEMP_THRESHOLD" | bc -l) )); then
OVER_THRESHOLD="1"
break
fi
done
if [ "$OVER_THRESHOLD" = "1" ]; then
echo "180" > "$FAN_CONTROL_PATH"
echo "$(date +'%Y-%m-%d %H:%M:%S') - Temperature over threshold ($TEMP_THRESHOLD°C). Setting fan speed to 180." >> "$LOG_FILE"
else
echo "0" > "$FAN_CONTROL_PATH"
echo "$(date +'%Y-%m-%d %H:%M:%S') - All temperatures below threshold ($TEMP_THRESHOLD°C). Setting fan speed to 0." >> "$LOG_FILE"
fi三、脚本说明
- 脚本首先定义了温度阈值、风扇控制文件路径和日志文件路径。
get_scsi_temps函数用于获取所有drivetemp-scsi设备的温度。- 主逻辑部分检查每个温度是否超过阈值,根据检查结果设置风扇速度并记录日志。
四、使用 cron 定时执行脚本
- 编辑
crontab:
crontab -e- 添加以下行来每 5 分钟运行一次脚本:
*/5 * * * * /bin/bash /root/monitor_temps.sh五、总结
通过上述步骤,我们成功实现了根据硬盘温度动态调整风扇转速的功能。这有助于在保证硬盘正常运行的同时,降低噪音并节约能源。在实际应用中,你可以根据需要调整温度阈值、风扇控制文件路径等参数,以适应不同的系统环境。
不过这个脚本适合硬盘24小时待机的情况,因为在获取温度信息的时候会有可能唤醒硬盘。后面另外再附上适合硬盘休眠的脚本,可以只针对唤醒的硬盘进行监控。
1 条评论
[...]Linux根据硬盘温度调节风扇转速[...]