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度まで下がるとファンが停止します。
|