ubuntu16.04

Ubuntuでlm_sensorsができないときにファン制御をする

ubuntu16.04でCPUファン制御ができずにノートPCがよく熱暴走していました.
lm_sensorsやacpiなどなど試してみてダメだった方の役に立てば幸いです.

1. ファンのスピードを変える

必要なファイルがあるか確認します.
0〜11の数字が出てくればオッケーです.

$ cat /sys/class/thermal/cooling_device0/cur_state

0が最低速度,11が最高速度になります.

数字を11に変えて,ファンのスピードが変わるか確認してください.
ここで変わらなければこの方法はできません..

$ sudo vim /sys/class/thermal/cooling_device0/cur_state

vimは必要であればgeditやemacsなどに変えてください.

2. 実行ファイルを作る

実行スクリプトを作って好きなときに実行できるようにしましょう.

まず,ホームにbinフォルダを作ってPATHを通します.

$ mkdir ~/bin
$ echo export PATH='$HOME/bin:$PATH' >> ~/.profile
$ source ~/.profile

続いて実行スクリプトを作ります.

$ vim ~/bin/fan.sh
~/bin/fan.sh
#!/bin/sh

if [ -n "$1" ]
then
sudo sh -c "echo '$1' > /sys/class/thermal/cooling_device0/cur_state"
else
printf "level: "
read level
sudo sh -c "echo '$level' > /sys/class/thermal/cooling_device0/cur_state"
fi


実行権限を与えます.

$ cd ~/bin
$ sudo chmod +x fan.sh

PATHがきちんと通っていれば任意の場所で実行可能です.

$ fan.sh 10

とにかく熱暴走したくない!という方は高負荷なときに8や9など適度な数字に変えて実行するのが最も単純です.

3. CPU温度に合わせて速度を変える

$ vim ~/bin/fan_control.sh
~/bin/fan_control.sh
#!/bin/sh
while true ;do
temp=$(sudo cat /sys/class/thermal/thermal_zone0/temp)
#echo $temp
  if [ $temp -gt 60000 ] ; then
    sudo sh -c "echo 10 > /sys/class/thermal/cooling_device0/cur_state"
  elif [ $temp -gt 55000 ] ; then
    sudo sh -c "echo 8 > /sys/class/thermal/cooling_device0/cur_state"
  elif [ $temp -gt 50000 ] ; then
    sudo sh -c "echo 7 > /sys/class/thermal/cooling_device0/cur_state"
  elif [ $temp -gt 45000 ] ; then
    sudo sh -c "echo 6 > /sys/class/thermal/cooling_device0/cur_state"
  elif [ $temp -gt 40000 ] ; then
    sudo sh -c "echo 4 > /sys/class/thermal/cooling_device0/cur_state"
  else
    sudo sh -c "echo 2 > /sys/class/thermal/cooling_device0/cur_state"
  fi
#cat /sys/class/thermal/cooling_device0/cur_state
sleep 10
done

CPU温度に合わせてスピードが変わるようにします.
sleep 10で10秒後にまたwhileに入るようになっています.
温度と回転スピードは好きなように変更してください.
tempが60000(60℃)より高いと10にするといった具合です.

現在のCPU温度はこのように調べられます.

$ cat /sys/class/thermal/thermal_zone0/temp

4. サービスにして起動時に実行されるようにする

こちらのページがとてもわかりやすいです.https://qiita.com/DQNEO/items/0b5d0bc5d3cf407cb7ff

/home/binでもサービスに登録できますが,すぐに消せてしまうので先程のスクリプトを/optにコピーします.

$ sudo cp ~/bin/fan_control.sh /opt/fan_control.sh

あとは本当に上のサイト通りなのでそちらを見たほうが詳しくのっています..

サービス用のファイルを作ります.

$ sudo vim /etc/systemd/system/fan_control.service
/etc/systemd/system/fan_control.service
[Unit]
Description = fan_control daemon

[Service]
ExecStart = /opt/fan_control.sh
Restart = always
Type = simple

[Install]
WantedBy = multi-user.target

あとは以下のようにすれば再起動しても自動でfan_controlができるはずです.

$ sudo systemctl enable fan_control.service
$ sudo systemctl start fan_control.service

4. きちんとファン制御できているか確認する

$ cat /sys/class/thermal/thermal_zone0/temp
$ cat /sys/class/thermal/cooling_device0/cur_state

温度と回転が設定どおりになっているか確認してください.
実行スクリプトにして確認するほうが楽です.

~/bin/fan_check.sh
#!/bin/sh
while true ; do
date +"%H:%M:%S"
cat /sys/class/thermal/thermal_zone0/temp
cat /sys/class/thermal/cooling_device0/cur_state
sleep 2
done
$ cd ~/bin
$ sudo chmod +x fan_check.sh

もっとスマートな方法はあると思います..