在 Linux 系统中,有的时候我们需要根据实际需要调节风扇转速,特别是私人存储服务的场景中,要保证硬盘正常运行的同时,有效降低噪音并节约能源要兼顾安静又需要兼顾硬盘散热,。

在现有的工具中,已经有fancontrol、HDDFanControl可以控制风扇转速,后者可以直接根据硬盘温度调节特定风扇。已经很方便了。

但是我是用的存储系统是OpenMediaVault,不知道为什么我安装的HDDFanControl就不起作用,明明也能识别到风扇。试了很多种方法还是不行,因此有了本篇文章这种另辟蹊径的方法:通过脚本来控制。

一、所需应用及工具

  1. sensors :用于获取硬件传感器数据,包括硬盘温度等(Debian/Ubuntu安装指令:apt install lm-sensors)。
  2. bc :命令行计算器,用于进行浮点数比较。
  3. 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

三、脚本说明

  1. 脚本首先定义了温度阈值、风扇控制文件路径和日志文件路径。
  2. get_scsi_temps 函数用于获取所有 drivetemp-scsi 设备的温度。
  3. 主逻辑部分检查每个温度是否超过阈值,根据检查结果设置风扇速度并记录日志。

四、使用 cron 定时执行脚本

  1. 编辑 crontab
crontab -e
  1. 添加以下行来每 5 分钟运行一次脚本:
*/5 * * * * /bin/bash /root/monitor_temps.sh

五、总结

通过上述步骤,我们成功实现了根据硬盘温度动态调整风扇转速的功能。这有助于在保证硬盘正常运行的同时,降低噪音并节约能源。在实际应用中,你可以根据需要调整温度阈值、风扇控制文件路径等参数,以适应不同的系统环境。

不过这个脚本适合硬盘24小时待机的情况,因为在获取温度信息的时候会有可能唤醒硬盘。后面另外再附上适合硬盘休眠的脚本,可以只针对唤醒的硬盘进行监控。

最后修改:2026 年 01 月 16 日
如果觉得我的文章对你有用,请随意赞赏