部分联想主板BIOS风扇控制只有 Intelligent Cooling Engine (ICE) 功能,无法手动修改风扇转速曲线。
我发现手上这块主板在进入系统后风扇就变成固定转速,而且 看不到转速,那第一步就是先安装驱动。通过 sensors 得知控制器为IT8792E,从网上找到了可用的驱动:a1wong/it87 (github.com) 按照文档 sensors-detect 安装即可。make & make install
然后加载驱动,需要忽略资源冲突,强制设备id为IT8792E的0x8733:
modprobe it87 ignore_resource_conflict=1 force_id=0x8733
然后就能在 sensors 里看到风扇转速、电压了。
Linux中我们一般通过Hwmon来手动调整风扇转速,路径是 ,*是设备序号。/sys/class/hwmon/hwmon*
但是到了这里发现无论怎么调整参数,转速都不会变化,唯一有区别的就是 pwm1_enable 设置为手动模式 1 的时候,转速为2600RPM左右,自动模式 2 的时候转速为900RPM。这个问题无论是驱动还是BIOS造成的,都没法简单解决。但是这两个转速正好可以当成两档来控制,所以我写了个脚本监控CPU温度,到达临界温度后指定 pwm1_enable 模式来切换转速。
#!/bin/bash
sleep 3
modprobe it87 ignore_resource_conflict=1 force_id=0x8733
sleep 5
getPath() { # $1 which path: 0 it8792 1 coretemp
cd /sys/class/hwmon
find=false
for subdir in `ls`
do
cd $subdir
nameVar=$(head -n 1 name)
if [ $1 = 0 ]
then
if [ $nameVar = "it8792" ]
then
find=true
it8792_path=$(pwd)
fi
else
if [ $nameVar = "coretemp" ]
then
find=true
coretemp_path=$(pwd)
fi
fi
if $find ;then
echo "Find path."
break
fi
cd ..
done
}
it8792_path=""
coretemp_path=""
getPath 0
echo $it8792_path
if [ -z $it8792_path ]; then
exit
fi
getPath 1
echo $coretemp_path
if [ -z $coretemp_path ]; then
exit
fi
cd $it8792_path
echo 2 > pwm1_enable
cd $coretemp_path
while true
do
sleep 2
temp=$(head -n 1 temp1_input)
mode=$(head -n 1 $it8792_path/pwm1_enable)
if (( $temp > 50000 ))
then
if [ $mode = "2" ]; then
echo 1 > $it8792_path/pwm1_enable
fi
else
if [ $mode = "1" ]; then
echo 2 > $it8792_path/pwm1_enable
fi
fi
done
再把这个脚本注册到systemd开机自启就行了,先在 下新建文件 /usr/lib/systemd/systemIt87FanControl.service,内容为
[Unit] Description=It87FanControl [Service] ExecStart=/home/it87_fan.sh #你的脚本路径 [Install] WantedBy=multi-user.target
然后 开启服务就可以了。这样就能够开机后自动加载驱动,并根据温度两档调整转速。systemctl enable It87FanControl.service
