网心云OES 刷飞牛后:散热风扇的智能控制方法

前言


  网心云OES自带三个2.5硬盘位,由于其设计存在缺陷,造成运行中硬盘温度很高,后面官方第二代虽然改进增加了散热风扇。但是刷了第三方固件后,风扇不能调用,现在折腾方法分享出来。

智能风扇温控脚本安装指南

一、创建智能温控脚本(根据温度自动调整风扇速度)

1. 使用 cat 命令直接创建(推荐)

# 方法:使用 sudo 直接创建到 /usr/local/bin
sudo tee /usr/local/bin/fan_control.sh << 'EOF'

将以下脚本内容粘贴进去,然后输入大写的 EOF 并回车完成创建:

#!/bin/bash
# /usr/local/bin/smart_fan_control.sh
# 智能温控:根据温度自动调整风扇速度

FAN_HWMON="/sys/class/hwmon/hwmon2"
TEMP_SOURCE="/sys/class/hwmon/hwmon0/temp1_input"  # 或 thermal_zone0/temp

# 温度-速度对应表(摄氏度 -> PWM值 0-255)
# 格式:温度阈值:PWM值
TEMP_MAP=(
    "40:0"     # 40°C以下:停止
    "50:80"    # 40-50°C:低速
    "60:120"   # 50-60°C:中低速
    "65:160"   # 60-65°C:中速
    "70:200"   # 65-70°C:中高速
    "75:230"   # 70-75°C:高速
    "80:255"   # 75°C以上:全速
)

# 获取当前温度(摄氏度)
get_temp() {
    if [ -f "$TEMP_SOURCE" ]; then
        echo $(($(cat "$TEMP_SOURCE") / 1000))
    elif [ -f "/sys/class/thermal/thermal_zone0/temp" ]; then
        echo $(($(cat /sys/class/thermal/thermal_zone0/temp) / 1000))
    else
        echo "无法获取温度" >&2
        exit 1
    fi
}

# 根据温度计算PWM值
calc_pwm() {
    local temp=$1
    local pwm=0
    local last_pwm=0  # 默认值

    for mapping in "${TEMP_MAP[@]}"; do
        local threshold="${mapping%:*}"
        local speed="${mapping#*:}"

        if [ "$temp" -lt "$threshold" ]; then
            pwm=$last_pwm
            break
        fi
        last_pwm=$speed
    done

    # 如果温度超过所有阈值,使用最后一个值
    if [ "$pwm" -eq 0 ] && [ "$last_pwm" -ne 0 ]; then
        pwm=$last_pwm
    fi

    echo $pwm
}

# 主程序
echo "启动智能风扇温控系统..."
echo "温度-PWM映射:"

for mapping in "${TEMP_MAP[@]}"; do
    echo "  ${mapping%:*}: ${mapping#*:}/255"
done

# 设置手动模式
if [ -f "${FAN_HWMON}/pwm1_enable" ]; then
    echo 1 | sudo tee "${FAN_HWMON}/pwm1_enable" > /dev/null
fi

last_pwm=-1
while true; do
    temp=$(get_temp)
    pwm=$(calc_pwm $temp)

    # 只在PWM值变化时更新
    if [ "$pwm" -ne "$last_pwm" ]; then
        echo "$(date '+%H:%M:%S') 温度: ${temp}°C -> PWM: ${pwm}/255"
        echo $pwm | sudo tee "${FAN_HWMON}/pwm1" > /dev/null
        last_pwm=$pwm
    fi

    # 每30秒显示一次转速(可选)
    if [ $(( $(date +%s) % 30 )) -eq 0 ]; then
        if [ -f "${FAN_HWMON}/fan1_input" ]; then
            rpm=$(cat "${FAN_HWMON}/fan1_input")
            echo "  当前转速: ${rpm}RPM"
        fi
    fi

    sleep 5  # 5秒检查一次
done

注意:粘贴完脚本后,在新的一行输入 EOF(大写)并按回车完成创建。


二、设置脚本权限

# 添加执行权限
sudo chmod +x /usr/local/bin/fan_control.sh

# 验证权限
ls -l /usr/local/bin/fan_control.sh
# 应该显示: -rwxr-xr-x

三、创建系统服务

1. 创建服务文件

sudo tee /etc/systemd/system/fan-control.service << 'EOF'

粘贴以下内容,然后输入大写的 EOF 并回车:

[Unit]
Description=Temperature Controlled Fan Service
After=multi-user.target

[Service]
Type=simple
ExecStart=/usr/local/bin/fan_control.sh
Restart=always
RestartSec=10
User=root

[Install]
WantedBy=multi-user.target

四、启动并启用服务

# 重新加载 systemd 配置
sudo systemctl daemon-reload

# 启用开机自启动
sudo systemctl enable fan-control.service

# 立即启动服务
sudo systemctl start fan-control.service

# 查看服务状态
sudo systemctl status fan-control.service

五、测试风扇是否正常工作

使用 stress 进行 CPU 压力测试

stress 是一个简单直接的压力测试工具,可以快速创建 CPU、内存、IO 等负载。

1. 安装 stress

sudo apt update
sudo apt install stress

2. 常用命令示例

# 压测所有 CPU 核心(持续 300 秒)
stress -c $(nproc) -t 300s

参数说明:

  • -c $(nproc):创建与 CPU 核心数量相等的工作线程
  • -t 300s:测试持续 300 秒(可调整:如 120s、10m)

中止测试:Ctrl+C


注意事项

  1. 硬件路径检查:脚本中的 FAN_HWMONTEMP_SOURCE 路径可能需要根据实际硬件调整
  2. 温度阈值:可根据需要修改 TEMP_MAP 中的温度-PWM对应关系
  3. 权限问题:确保脚本有正确的执行权限
  4. 日志查看:可使用 sudo journalctl -u fan-control.service -f 实时查看服务日志

安装完成后,运行 stress 测试,观察风扇转速是否随温度升高而增加。