因为自己在使用的ThinkPad T440p的芯片散热实在是SB至极,为了守卫本本的安全,为了世界的和平……不说那么多了,总之为了方便,自己写了一个温控脚本,根据不同的温度来控制风扇转速。别和我说有thinkfan什么的,那玩意儿在这里不管用——它拒绝执行……不管你用什么办法,它就是拒绝的!
反正本人也懒,懒得找什么论坛解决那些奇葩的bug与设置问题,所以直接自己动手,丰衣足食,写了一个脚本。虽然不高明,但总比每次开机自己手动更改要好一些,不然一不小心电脑就煎蛋了。
所需内容
也很简单,需要:
- 获取对风扇速度调整的权限。ThinkPad用户参考这里或者thinkwiki,稍后会介绍如何操作。
- lm_sensors,用来读取温度
- linux基本命令的head、sed以及awk,用于获取设备温度。
- crontab服务以便于自动执行
思路
通过sensors检测cpu温度,根据温度的不同来向/proc/acpi/ibm/fan写入不同的级别来控制风扇转速。
echo level [1-5,7,full-speed] > /proc/acpi/ibm/fan
具体命令方式参考fan文件内容——前提是你获得了对风扇控制的权限。
然后将脚本加入到crontab任务——必须是root用户权限,每个几分钟执行一次脚本检测并调整风扇。
方法
获取对风扇速度调整的权限(以ThinkPad为例)
首先使用root用户,在 /etc/modprobe.d/ 目录下创建一个文件:
root@localhost:~ # vi /etc/modprobe.d/thinkpad_acpi.conf
内容如下:
options thinkpad_acpi experimental=1 fan_control=1
加载对风扇控制模块:
root@localhost:~ # modprobe thinkpad_acpi fan_control=1 experimental=1
然后进入到 /proc/acpi/ibm/fan中看看是否可以更改,以本人为例,如果可以更改的话内容如下:
status: enabled
speed: 3426
level: auto
commands: level <level> (<level> is 0-7, auto, disengaged, full-speed)
commands: enable, disable
commands: watchdog <timeout> (<timeout> is 0 (off), 1-120 (seconds))
当然了,不同的发行办可能有些许不同,但使一般都会提供给commands以供选择,否则您没有修改权限。
手动更改级别的话执行如下命令:
root@localhost:~ # echo level 5 > /proc/acpi/ibm/fan
以上命令使风扇以级别5的转速运转。一般数字越大风扇速度越快。有的发行版没有级别6,而且命令模式也可能不一样。本人使用的是opensuse,命令中可以执行级别6的控制,在脚本中设置成注释,想使用的话设置好数值取消注释即可。
创建脚本,放到一个自己喜欢的地方
可能会放在你的家目录下的某一个地方,或者/etc/的某一个地方,随你喜好——只要你自己觉得合理即可。
脚本如下:
#!/bin/bash
cpu_temp=$(sensors -u|sed -n '/Core 0/ {n;p}'|awk {'print $2'}|sed 's/.000//')
#-------------configure file------------
#You can modify these arguments in this area by yourself.
#Example:
# lv5=45 #It means that the fan will be running at level 5 speed when CPU temperature exceeds 45 digrees Celsius.
#If the command 'sensors' returns the value in Fahrenheit,you have to modify these arguments as Fahenheit,too.
lv1=30
lv2=35
lv3=40
lv4=42
lv5=45
#lv6= #Setting a vaild value and deleting '#' in the relevent code snippet if you want to use level 6.
lv7=50
lv_max=70 #full speed
#--------------end of configure file--------------
change_fan_level() {
echo level $1 > /proc/acpi/ibm/fan
}
if [ $cpu_temp -gt $lv_max ]
then
change_fan_level full-speed
elif [ $cpu_temp -gt $lv7 ]
then
change_fan_level 7
#Deleting '#' in the following code snippet and set a vaild value for argument lv6 if you want to use level 6.
#elif [ $cpu_temp -gt $lv6 ]
#then
#change_fan_level 6
elif [ $cpu_temp -gt $lv5 ]
then
change_fan_level 5
elif [ $cpu_temp -gt $lv4 ]
then
change_fan_level 4
elif [ $cpu_temp -gt $lv3 ]
then
change_fan_level 3
elif [ $cpu_temp -gt $lv2 ]
then
change_fan_level 2
elif [ $cpu_temp -gt $lv1 ]
then
change_fan_level 1
else
change_fan_level 1
fi
求别吐槽我的蹩脚英文和这糟糕的代码缩进风格了……谁让人家是小白~的呢。
然后赋予其可执行权限。
root@localhost:~ # chmod a+x file.sh
添加进任务列表
编辑root的crontab列表。
root@localhosts:~ # crontab -e
打开后是一个vi编辑器,添加新的一行,内容如下:
*/2 * * * * /bin/bash /shell_script_path
注意,这里脚本的路径是绝对路径。
这样便每隔2分钟便执行脚本,来修改风扇策略。
后记
还不是因为thinkfan搞不定所以才出此下策,尽量不推荐如此调教。毕竟脚本的执行能力你懂的,而且是靠crontab来实现动态检测调整的。除非实在是没有办法,否则不推荐用这个方法。
另外啊,我的sensors有些坑爹的每次重启对于温度的标识都有所改变,所以不得不直接认定Core 0核心的温度为准。通配符什么的复杂好用,一时间想不起来了,所以根据这位大触的方法来定位cpu核心0的温度。