Raspberry Pi No.13 HDDのスピンダウンに再チャレンジ

前回、HDDのスピンダウンにhdparmの「-S」オプションが効かなかったため、あきらめていましたが、別のアプローチで再チャレンジしました。

hdparmのインストール

sudo apt-get -y install hdparm

強制スピンダウンが効くかどうか確認(私の環境ではsda2ですので、以降はすべてsda2で記載)

sudo sdparm --command=stop /dev/sda2
sudo hdparm -y /dev/sda2

私の環境では、sdparmは効かず、hdparmのスピンダウンが効くようです。

スピンダウンしているかどうかは、以下の方法で確認します。

sudo hdparm -C /dev/sda2

active/idel:通常
standby:スピンダウンしている
sleeping:停止している

スピンダウンすることで、電力は、14Wから5Wになりました。
5Wなら一ヶ月で5W*24時間*30日/1000KW*25円=90円です。
仮にまったく使用しなかっても90円、以前計測したRaspberry Piの本体80円より高い・・・・・
HDD2台のRAID1なので、この程度の電気代は仕方ないですね・・・・・

あとはどうやって未使用ならスピンダウンコマンドを発行するかですね。
サンプルコードの記載がありました。
http://www.nslu2-linux.org/wiki/FAQ/SpinDownUSBHarddisks


考え方としては、HDDのアクセス情報が「/proc/diskstats」に記載されていますので、その内容を監視して指定した時間変更がなければスピンダウンさせます。
値としては11項目ありますが、詳細は以下を参照。
https://www.kernel.org/doc/Documentation/iostats.txt

まずは、自分のHDDがアクセスがあった時となかった時で値の変化を何度か確認します。

grep " sda2 " /proc/diskstats

確かに何もしていないと変化なしで、アクセスがあると変化するようです。(但し、キャッシュが効くような場合は変化なし)

以上を踏まえた上で、サンプルに少し手を加えて以下のようにしてファイルを作成します。

sudo nano /usr/local/bin/nas_spindown.sh

内容は以下の通り

#!/bin/sh
disk=$1
interval=$2
state=`grep " $disk " /proc/diskstats`
count=$interval
up=1
while [ true ]; do
    sleep 60
    count=$(($count-60))
    newstate=`grep " $disk " /proc/diskstats`
    if [ "$state" = "$newstate" ]; then
        if [ $count -lt 0 ]; then
            count=$interval
            if [ $up = 1 ]; then
                echo "spin-down"
                sync
                state=`grep " $disk " /proc/diskstats`
                sudo hdparm -y /dev/$disk > /dev/null 2>&1
                up=0
            fi
        fi
    else
        count=$interval
        state="$newstate"
        if [ $up = 0 ]; then
            echo "drive is up"
            up=1
        fi
    fi
done

実行出来るように権限を変更。

sudo chmod 755 /usr/local/bin/nas_spindown.sh

 

サンプルから変更した箇所は以下の通り。

  • hdparmを使用して停止
  • ログの出力はスピンダウンとスピンアップ時のみに変更
  • echoの内容を変更
  • 私は1時間程度とかなりの時間アクセスしなかった場合に停止させる目的なので監視時間を60秒に変更

 

ソースの概要は以下の通り。

  • while doで延々と監視し続ける
  • 延々と繰り返すとCPU負荷が高くなるので、sleepで60秒ごとに実行するようにする
  • /proc/diskstatsの内容を監視し、指定した時間経っても変更がなかったらスピンダウンさせると同時にechoでメッセージ表示
  • 変更があり前回スピンダウンだった場合は、スピンダウンから復帰したので、echoでメッセージ表示

 

起動時に動作させるためにスクリプトを「/etc/rc.local」に登録

sudo nano /etc/rc.local

以下の内容を「exit 0」の直前に登録

/usr/local/bin/nas_spindown.sh sda2 3600 2>&1 | logger -t nas_spindown &

「logger」でechoで指定したメッセージをシステムログに登録させます。
最後の「&」はバックグラウンドで実行させるために指定します。
私の場合は1時間何もなかったら停止させたいので3600秒を指定しています。

 

スピンダウン、スピンアップの状況は以下の内容で確認します。

tail /var/log/user.log

いい感じで機能しているようです。
最初は小さな値(120とか)で確認した方がよいと思います。
私の環境ではスピンダウンしてしばらくは14Wから5Wになっているのですが、スピンアップしていないにもかかわらず、電力が14Wに戻ったりしていました・・・・・

「sudo hdparm -C /dev/sda2」で確認してもスピンダウンしているし、HDDにアクセスするとスピンアップする時の音もするし、電力が14Wに戻る原因はわかりませんでした。
いつ電力が戻っているんだろう・・・・・
それでもスピンダウンして5Wにまで落ちるのは環境に優しいはずです。
さすがに寝ている間はスピンダウンしておいて欲しいです。
頻繁にスピンダウン、スピンアップはHDDの寿命にも影響しますので、監視時間の設定は自分の運用環境に合わせて検討する必要があります。
使わないなら電源切れよという話もありますが・・・・・