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































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


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






管理人へMAIL

プライバシーポリシー

AINEX AK-FN076(2)

LS210D の HDD温度によってファンをオン・オフする仕組みを作りました


 8cm角の薄型ファン・AINEX AK-FN076ですが、USBの低電圧(5V)駆動でも意外に冷却性能がある事が分かりました。また回転数も低いためファンの回転音は殆ど聞き取れないほどです。次は HDDの温度に基づいて USBへの給電をオン・オフすることでファンを廻したり止めたりする仕組みを作ろうと思います。

 実はLS210Dでもファンを制御する仕組みが動いているみたいなんですよね。"/etc/init.d/fanctld.sh" なんてスクリプトもあるし、シスログ("/var/log/messages")に以下のような出力を見ることができます。

Jan 12 11:35:20 LS210D local0.info fanctld.sh: temp0=50 temp1=34

しかし元々LS210Dにはファンが無いので、全く無意味に動いているだけのようですけどね。何なら "/etc/init.d/fanctld.sh stop" と止めてしまっても良いかもしれません。
 今回は "/etc/init.d/fanctld.sh" とは全く独立に作ります。基本的な仕組みは、以前作った ReadyNAS RN10200のファン制御スクリプトからの一連の記事と同じです。ただ CPUの温度は取得していないし、ファンの回転数を制御することはできないので、随分簡単なものになります。

 スクリプトを置く場所は、ファームウェア更新の際に消されてしまわないよう "/mnt/disk1/"配下にしました。

# cd /mnt/disk1
# mkdir etc
# cd etc
# mkdir fan_control
# cd fan_control

 この fan_controlディレクトリ配下にスクリプトを作って行きます。先ずはファン制御の本体スクリプト "fan_control.sh" から。

#!/bin/sh

#
# fan_control.sh
#
CONFIG="/mnt/disk1/etc/fan_control/fan_control.conf"
PID_FILE="/var/run/fan_control.pid"

#
# for get HDD temperature
#
SMARTCTL="/usr/sbin/smartctl"
SMARTOPT="--device=sat --attributes"
DEVICE="/dev/sda"
GREP="/bin/grep"
HDDTEMP=Temperature_Celsius
AWK="/usr/bin/awk"
INTERVAL=120

#
# Fan and LED control
#
USB_POWER="/proc/buffalo/gpio/power_control/usb0"
POWER_LED="/proc/buffalo/gpio/led/power"
INFO_LED="/proc/buffalo/gpio/led/info"
FUNC_LED="/proc/buffalo/gpio/led/funcred"
FAN_ON=36
FAN_OFF=34
if [ -e ${CONFIG} ]; then
    . ${CONFIG}
fi

function hdd_temp()
{
    local TEMP=$(${SMARTCTL} ${SMARTOPT} ${DEVICE} | ${GREP} ${HDDTEMP} | ${AWK} '{print $10}')
    echo ${TEMP}
}

function usb_switch()
{
    echo $1 > ${USB_POWER}
}

function usb_stat()
{
    echo $(cat ${USB_POWER})
}

function power_led_switch()
{
    echo $1 > ${POWER_LED}
}

function info_led_switch()
{
    echo $1 > ${INFO_LED}
}

function func_led_switch()
{
    echo $1 > ${FUNC_LED}
}

function FanControl() {
    while :
    do
        HDD_TEMP=`hdd_temp`
        USB_PW=`usb_stat`

        if ( [ ${HDD_TEMP} -ge ${FAN_ON} ] && [ ${USB_PW} = off ] ); then
            usb_switch on
            func_led_switch on
        elif ( [ ${HDD_TEMP} -le ${FAN_OFF} ] && [ ${USB_PW} = on ] ); then
            usb_switch off
            func_led_switch off
        fi
        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
    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
    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

 単にファンをオン・オフするだけじゃ面白くないので、ファンが廻っている間はfunc LED(電源LEDの下にあるLED)が点灯するようにしてみました。
 次は、このスクリプトをブート時にバックグラウンドで起動させるためのスクリプト "fan_control" です。(名前が似ていてヤヤコシイですが・・・実はこれを作って試している時に suコマンドが動かないことに気付いたのでした。ですから、先にsuコマンドが動かない問題を解消しておく必要があります。)

#!/bin/sh

SCRIPT=/mnt/disk1/etc/fan_control/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

 これらのスクリプトに実行権を付け、ブート時に呼び出されるようにします。

# chmod 755 /mnt/disk1/etc/fan_control.sh /mnt/disk1/etc/fan_control
# cd /etc/init.d
# ln -s /mnt/disk1/etc/fan_control/fan_control ./fan_control
# cd /etc/rc.d/extensions.d
# ln -s /etc/init.d/fan_control S99_fan_control

という具合にシンボリックリンクを張っておいて、

# /etc/init.d/fan_control start

と起動させるか、LS210Dを再起動させます。再起動後、psコマンドで見て fan_control.sh が動いていればOKです。

 また、ファンをオン・オフするHDDの温度を変えたい場合は、"/mnt/disk1/etc/fan_control/fan_control.conf" に以下のように書いて、

#
# Fan start/stop temperature
#
FAN_ON=36
FAN_OFF=34

"/etc/init.d/fan_control restart" とすれば反映されます。上記ではHDDの温度が36度になるとファンが回転し、34度まで下がるとファンが停止します。


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

2015 calendar
1月
123
45678910
11121314151617
18192021222324
25262728293031


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


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