在笔记本(ThinkPad T440)连续两天因过热而死机后, 对内核的风扇控制算法果断失去信心.
风扇的用户层控制接口是 /proc/acpi/ibm/fan, 但为防止用户控制不当烧坏机器, 默认情况下并没有对用户开放控制权. 这个由内核模块 thinkpad_acpi 控制, 可在加载该内核模块时传递参数 fan_control=1 打开风扇控制开关. 如果安装了 thinkfan 的话, 它包含文件 /usr/lib/modprobe.d/thinkpad_acpi.conf, 其文件内容为:
options thinkpad_acpi fan_control=1
这样以后在开启启动加载 thinkpad_acpi 模块时会自动传递参数 fan_control=1 以便打开用户层控制开关.
然后就可以向 /proc/acpi/ibm/fan 写如特定数据控制风扇了, 比如说:
echo enable/disable > /proc/acpi/ibm/fan: 启用/禁用风扇;
echo level 1-7 > /proc/acpi/ibm/fan: 设置风扇转速为 1-7 级, 等级越高转速越大;
echo level auto > /proc/acpi/ibm/fan: 由内核模块控制风扇转速(这就是默认配置, 烧死机了.);
echo level full-speed/disengaged > /proc/acpi/ibm/fan: 风扇启动最大转速(要的就是这种情况);
注: /proc/acpi/ibm/fan 还支持其他很多控制参数, 详情可查阅 thinkpad_acpi 模块文档[参考2].
上面提到的 thinkfan 就是一个通过传感器检测硬件温度来实现自动控制风扇转速的工具. 它的配置文件是 /etc/thinkfan.conf, 支持两种格式:
简单模式;
复杂模式.
1.简单模式:
# 配置传感器
hwmon /sys/devices/virtual/thermal/thermal_zone0/temp
# 配置风扇控制接口(默认是: /proc/acpi/ibm/fan)
tp_fan /proc/acpi/ibm/fan
# 配置风扇等级与温度之间的关系
(0, 0, 55)
(1, 48, 60)
(2, 50, 61)
(3, 52, 63)
(4, 56, 65)
(5, 59, 66)
(7, 63, 32767)
配置风扇等级与温度之间的关系时, 每一行分三列, 第一列是风扇转速等级, 第二列和第三列是启用当前等级的最低和最高温度. 注意每一级的最低和最高温度与上一级的最高温度和下一级的最低温度都有重合. 当配置有多个传感器时, 取值最大(温度最高)的一个.
这种模式配置简单, 但只支持配置 1-7 等级的转速, 不能配置 auto/full-speed.
2.复杂模式:
复杂模式就要复杂一点, 它支持配置多个传感器, 支持为每个传感器设置温度阈值. 最重要的是, 它支持 auto/full-speed.
为了省电和降温, 就配置了两条温度规则:
# 配置传感器
hwmon /sys/devices/virtual/thermal/thermal_zone0/temp
# 配置风扇控制接口(默认是: /proc/acpi/ibm/fan)
tp_fan /proc/acpi/ibm/fan
{ "level auto"
(0)
(55)
}
{ "level disengaged"
(50)
(100)
}
配置 OK 后重启 thinkfan 服务使之生效.
我最开始用的是简单模式, 在最初几天相安无事, 但后来又发生了过热死机的问题, 于是切换到复杂模式的配置, 就靠上面两条规则达到低温省电高温全速转起来的效果.
参考:
1.Archlinux WiKi: ThinkPad Fan Control
2.Linux Kernel: ThinkPad ACPI Extras Driver