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の温度とファン回転数データがあれば調整には充分でしょう。
|