絖綛 N@i.jp  昨日:00040310
 今日:00040193
 総計:00381784
keywords
管理者専用
  Post   Add link   Control Panel 































新しいトピック
最新:04/16 19:55


新しいコメント
最新:07/28 16:47






管理人へMAIL

プライバシーポリシー

ReadyNAS RN10200のファン制御スクリプト(続き)

システム起動時に自動起動するよう組み込みました。


 RN10200のファン回転数制御スクリプトをシステムに組み込みました。まだまだ調整の必要がありそうですが、とりあえず温度が安定するようになったので、いちいち手でスクリプトを起動、停止する面倒を無くしておこうと思ったのでした。
 しかし、また工場出荷状態へ初期化なんて事になったら、せっかく組み込んだのも消えてしまうかもしれませんので、備忘録として書いておくことにします。と言うことで、スクリプトやシステムへの組み込み方については、間違いやバグがあるかも知れませんので、ご注意ください。

 先ず、ファン回転数制御のスクリプト本体 "fan_control.sh" は、以下のようにしました。

#!/bin/bash

PID_FILE="/var/run/fan_control.pid"
LOG_FILE="/var/log/fan_control.log"
LOG_MAXLINES=1000

INTERVAL=120
DEVICE="/dev/sda"
TEMP_KEYWORD="Temperature_Celsius"
PWM="/sys/devices/platform/mv64xxx_i2c.0/i2c-0/0-003e/pwm1"
CPU="/sys/devices/platform/axp-temp.0/temp1_input"
FAN_SPEED="/sys/devices/platform/mv64xxx_i2c.0/i2c-0/0-003e/fan1_input"

#
# FAN PWM
#
FAN_MIN=75      # 
FAN_SLOW=95     #   780 RPM
FAN_NORMAL=128  #   960 RPM
FAN_FAST=186    # 1,780 RPM
FAN_FASTER=208  # 2,600 RPM
FAN_FULL=255    # 3,600 RPM
NOW_PWM=$FAN_NORMAL

#
# HDD temperature setting
#
HDDTEMP_MIN=35
HDDTEMP_SLOW=38
HDDTEMP_NORMAL=40
HDDTEMP_FAST=42
HDDTEMP_FASTER=44
HDDTEMP_MAX=46

#
# CPU temperature setting
#
CPUTEMP_MIN=53
CPUTEMP_SLOW=56
CPUTEMP_NORMAL=58
CPUTEMP_FAST=61
CPUTEMP_FASTER=63
CPUTEMP_MAX=67

function LogPrint() {
    local LOGSIZE=`wc -l ${LOG_FILE} | awk '{print $1}'`
    if [ $LOGSIZE -gt $LOG_MAXLINES ]; then
        if [ -f ${LOG_FILE}.0 ]; then
            rm -f ${LOG_FILE}.0
        fi
        mv ${LOG_FILE} ${LOG_FILE}.0
        rm -f ${LOG_FILE}
    fi
    echo $1 >> ${LOG_FILE}
}

function CalcFanPER {
    local TEMP_CPU_RANGE=$(expr $CPUTEMP_MAX - $CPUTEMP_MIN)
    TEMP_CPU_REL=$(expr $CPU_TEMP - $CPUTEMP_MIN)
    TEMP_CPU_REL=$(expr $TEMP_CPU_REL * 100)
    TEMP_CPU_PER=$(expr $TEMP_CPU_REL / $TEMP_CPU_RANGE)
    if [ $TEMP_CPU_PER -lt 0 ]; then
        TEMP_CPU_PER=0
    fi
    if [ $TEMP_CPU_PER -gt 100 ]; then
        TEMP_CPU_PER=100
    fi

    local TEMP_HDD_RANGE=$(expr $HDDTEMP_MAX - $HDDTEMP_MIN)
    TEMP_HDD_REL=$(expr $HDD_TEMP - $HDDTEMP_MIN)
    TEMP_HDD_REL=$(expr $TEMP_HDD_REL * 100)
    TEMP_HDD_PER=$(expr $TEMP_HDD_REL / $TEMP_HDD_RANGE)
    if [ $TEMP_HDD_PER -lt 0 ]; then
        TEMP_HDD_PER=0
    fi
    if [ $TEMP_HDD_PER -gt 100 ]; then
        TEMP_HDD_PER=100
    fi
}

function CalcSpeed {
    if [ $TEMP_CPU_PER -gt $TEMP_HDD_PER ]; then
        NEW_PER=$TEMP_CPU_PER
    else
        NEW_PER=$TEMP_HDD_PER
    fi
    NEWPWM=$(expr $FAN_FULL - $FAN_MIN)
    NEWPWM=$(expr $NEWPWM * $NEW_PER)
    NEWPWM=$(expr $NEWPWM / 100)
    NEWPWM=$(expr $NEWPWM + $FAN_MIN)

    if [ $NEWPWM -gt $NOW_PWM ]
    then
        echo $NEWPWM > $PWM
    else
        NEWPWM=$NOW_PWM
    fi
}

function FanControl() {
    while true; do
        CPU_TEMP=`cat ${CPU}`
        HDD_TEMP=`smartctl -A $DEVICE | grep ${TEMP_KEYWORD} | awk '{ print $10 }'`
        NOW_PWM=`cat ${PWM}`
        CalcFanPER
        CalcSpeed
        local DATE=`date`
        local SPEED=`cat ${FAN_SPEED}`
        LogPrint "${DATE}: CPU:${CPU_TEMP}(${TEMP_CPU_PER}%), HDD:${HDD_TEMP} (${TEMP_HDD_PER}%), PWM:${NEWPWM}, FanSpeed:${SPEED}rpm"

        sleep $INTERVAL
    done
}

function start() {
    if [ -f ${PID_FILE} ] && kill -0 $(cat ${PID_FILE}); then
        echo 'Fan control service is already running' >&2
        return 1
    fi
    echo 'Starting Fan control service.' >&2
    local DATE=`date`
    LogPrint "${DATE}: Starting FAN control service."
    echo $$ > ${PID_FILE}
    FanControl
}

function stop() {
    if [ ! -f $PID_FILE ] || ! kill -0 $(cat ${PID_FILE}); then
        echo 'Fan control service is not running' >&2
        return 1
    fi
    local PID=`cat ${PID_FILE}`
    rm -f ${PID_FILE}
    echo 'Fan control service stopped' >&2
    local DATE=`date`
    LogPrint "${DATE}: FAN control service stopped."
    kill -15 $PID
}

function stat() {
    if [ -f ${PID_FILE} ] && kill -0 $(cat ${PID_FILE}); then
        echo 'Fan control service is running' >&2
    else
        echo 'Fan control service is not running' >&2
    fi
}


case "$1" in
start)  start
        ;;
stop)   stop
        ;;
status) stat
        ;;
*)      echo "Usage: $0 {start|stop|status}"
        ;;
esac

 以前のものから大分変わったように見えますが、コアの部分は殆ど変わっていません。変更した所は、

  • HDD, CPUの温度の下限値、上限値を変更
  • ファンの回転数を下げて良いときは何もせず、RN10200デフォルトのファン制御によって回転数が下るのに任せる
  • 温度の監視、ファン回転数制御の時間間隔を2分にした

くらいです。それ以外は、システムに組み込むにあたっての肉付けみたいなものですね。このスクリプト本体は共有フォルダ "/data/works" 配下に置いてあります。スクリプトを修正するのを容易にするためと、ファームウェアのアップデート等で消されてしまわないようにするためです。

 次に "/etc/init.d" 配下に、以下の "fan_control" という名前のスクリプトを置きました。

#!/bin/bash

SCRIPT=/data/works/fan_control.sh
RUNAS=root

function start() {
    local CMD="${SCRIPT} start &"
    su -c "$CMD" $RUNAS
}

function stop() {
    ${SCRIPT} stop
}

function stat() {
    ${SCRIPT} status
}

case "$1" in
start)   start ;;
stop)    stop  ;;
restart) stop
         start ;;
status)  stat  ;;
*) echo "Usage: $0 {start|stop|restart|status}" ;;
esac

 これはファン回転数制御のスクリプトを起動、停止するためのものです。この状態で、

# /etc/init.d/fan_control start
〜
# /etc/init.d/fan_control stop

などすれば、ファン回転数制御のスクリプト本体が起動したり停止したりするはず。
 あとは、これがシステム起動時に呼び出されるようにするだけですね。そのためには "/etc/rc5.d" から "/etc/init.d/fan_control" へシンボリックリンクを張ります。

# cd /etc/rc5.d
# ln -s ../init.d/fan_control S99fan_control
# ls -l S99fan_control
lrwxrwxrwx 1 root root 21 Jul 21 10:17 S99fan_control -> ../init.d/fan_control

 これでRN10200を再起動させたときに自動的に "fan_control.sh" が起動されるはずです。試しに再起動させて、psで確認したところ

# ps -efa | grep fan
root      5548     1  0 10:35 ?        00:00:02 /bin/bash /data/works/fan_control.sh start

というように動いているようでした。またログファイルが "/var/log/fan_control.log" に作成されますので、これで動作しているか確認できます。
 とは言え、今のログファイル出力処理はかなり手抜きです。最大1,000行で過去1世代分しか残していません。とは言うものの、2分間に1行増えるログファイルですから33時間分になります。1世代前のログファイルと現在のログファイルを合わせれば、1.5日〜2日分程度のログが記録されるわけで、これくらいのCPU, HDDの温度とファン回転数データがあれば調整には充分でしょう。


< 過去の記事 [ 7月の 全てのカテゴリ リスト ] 新しい記事 >

2014 calendar
7月
12345
6789101112
13141516171819
20212223242526
2728293031


掲示板
最新:08/15 17:19


GsBlog was developed by GUSTAV, Copyright(C) 2003, Web Application Factory All Rights Reserved.