GLAN TANKファン&HDD停止のまとめ

HDDへのアクセスが一定時間以上発生していないときにHDDとファンを停止し、アクセスが発生したときにまた回転を始める、という方法です。
この方法のほかにも、カーネルにファン停止用のドライバを組み込んで、HDDが一定の温度以下になったらファンを停止するという方法もあるようです。こちらの方が合理的な気がしますね…。
私は毎日の自動バックアップ用というゆるい使い方をしていますが、ヘビーに使う方はファンなぞ停止しない方が良いかもしれません。
お好みで。ということで、まとめ開始。


usbhdmngを入手

IO DATAから公開されているHDL-GXシリーズのファームウェアアップデートから、ファン&HDD制御用のプログラム(usbhdmng)を取り出し、/usr/local/binにコピーします。

wget http://www.iodata.jp/lib/soft/h/hdlgx_f108.zip
unzip x hdlgx_f108.zip
tar zxvf update.tgz
tar zxvf update-files.tar.gz
cp usr/local/bin/usbhdmng /usr/local/bin/
chmod 755 /usr/local/bin/usbhmng

hdparmをインストール

/sbin/hdparmが無いと、ファンが止まってもHDDが停止しません。
どうにかして/sbin/hdparmをインストールしてください。

apt-get install hdparm

spindownd.confを書いてテスト

とりあえず動作確認をしてみます。
/tmp/spindownd.confが設定ファイルになります。

IDE:    hda    /dev/hda    /dev/hda    30
IDE:    hdb    /dev/hdb    /dev/hdb    30

区切りはタブで。スペースは不可。最後の数字は、ファンとHDDを止めるまでの時間。単位は秒のようです。(前のusbhdmngのバージョンでは分だったような…)

しばらく放っておくとファンとHDDが停止することを確認。(アクセスを確認する間隔が30秒くらいの様で、1秒に設定してもすぐには止まりません)


USB外付けHDDを制御することもできるようですが、使っていないので調べていません。(ファームウェアアップデートの中に入っているusr/local/bin/HDLdisk.pmなどを解析すればわかるはず)


起動スクリプトを書く

Debian流儀に従って起動スクリプトを書きます。


/etc/init.d/usbhdmng
コピー&ペーストだと、タブがスペースになっているので注意。create_conf()の中のecho注意。

#! /bin/sh
#
# /etc/init.d/ubhdmng Control userland daemon to spin down idle disks and stop fans.
#

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/local/bin/usbhdmng
CONF=/tmp/spindownd.conf
NAME=usbhdmng
DESC="HDD Spindown Daemon"

test -x $DAEMON || exit 0

TIMEOUT="600"
IDE_DISKS=""

# Include usbhdmng defaults if available
if [ -f /etc/default/usbhdmng ] ; then
        . /etc/default/usbhdmng
fi

set -e

create_conf() {
        echo -n "" > $CONF
        chmod 600 $CONF
        for DISK in $IDE_DISKS; do
                echo "IDE:    $DISK    /dev/$DISK    /dev/$DISK    $TIMEOUT" >> $CONF
                # ↑区切りはタブ(\t)。スペース不可
        done
        echo "" >> $CONF
}

case "$1" in
  start)
        echo -n "Starting $DESC: "
        create_conf
        start-stop-daemon --start --quiet -m --pidfile /var/run/$NAME.pid \
                --exec $DAEMON -- $DAEMON_OPTS 2>/dev/null
        echo "$NAME."
        ;;
  stop)
        echo -n "Stopping $DESC: "
        start-stop-daemon --stop --quiet --pidfile /var/run/$NAME.pid \
            --signal 2 --exec $DAEMON --oknodo
        echo "$NAME."
        ;;
  reload|force-reload)
        echo "Reloading $DESC configuration files."
        start-stop-daemon --stop --signal 1 --quiet --pidfile \
            /var/run/$NAME.pid --exec $DAEMON
  ;;
  restart|force-reload)
        echo -n "Restarting $DESC: "
        start-stop-daemon --stop --quiet --exec $DAEMON --pidfile \
                /var/run/$NAME.pid --oknodo
        sleep 1
        create_conf
        start-stop-daemon --start --quiet --pidfile \
                /var/run/$NAME.pid --exec $DAEMON -- $DAEMON_OPTS
        echo "$NAME."
        ;;
  *)
        N=/etc/init.d/$NAME
        echo "Usage: $N {start|stop|restart|reload|force-reload}" >&2
        exit 1
        ;;
esac

exit 0

設定ファイル
/etc/default/usbhdmng

# This is a configuration file for /etc/init.d/usbhdmng

# Time in seconds before a disk and fan are spun down.
TIMEOUT="600"

# Disks to be watched. usbhdmng currently only works with ide hard disks;
IDE_DISKS="hda hdb"

#DAEMON="/usr/local/bin/usbhdmng"

仕上げ

chmod 755 /etc/init.d/usbhdmng
update-rc.d usbhdmng start 80 2 3 4 5 . stop 80 0 1 6 .

ディスクアクセスを抑制する

このままでは、ファン&HDDが止まっても、すぐにまた回転し始めてしまいます。
静かにしたければ、thttpdのログ出力を抑制する(むしろいらなければアンインストール)、syslogの出力をバッファリングする、/etc/cron.hourlyをcron.dailyに格下げする、/のマウントオプションにcommit=600,noatimeを付加する(commit=600はどうかな)などなどの対策が必要です。



たとえば
syslog

apt-get remove --purge syslogd klogd
apt-get install syslog-ng

で/etc/syslog-ng/syslog-ng.confに

options {
    ....
    ....
    sync(10)         # 10行バッファリング
    stats(86400);    # 状態出力は一日一回
    ....
    ....
}


cron

mv /etc/cron.weekly/man-db /etc/cron.monthly
mv /etc/cron.daily/{netkit-inetd,ntpdate,bsdmainutils,find,modutils} /etc/cron.monthly/
mv /etc/cron.daily/{standard,logrotate,man-db} /etc/cron.weekly/
mv /etc/cron.hourly/chkraid1 /etc/cron.weekly/

/etc/crontabでhourlyとdailyをコメントアウト

#17 *   * * *   root    run-parts --report /etc/cron.hourly
#25 6   * * *   root    test -x /usr/sbin/anacron || run-parts --report /etc/cron.daily

などなど。
このせいで何が起こるかはわかりません。