jessie向けの新ページを作成しました。こちらからどうぞ

8.USBHDDの定期的なスピンダウン方法 - RaspberryPiで各種サーバー作り! - ある阪大生の物置小屋

ファイル共有用途等でUSBHDDの電源を長期的に入れておく場合、静かな所だと動作音が気になったりします。
ここでは、「hdparm」や「sdparm」を用いて、定期的にUSBHDDをスピンダウンし、動作音を抑える方法について説明します。

8.1.「hdparm」・「sdparm」のインストール

USBHDDによって、「hdparm」・「sdparm」のどちらが動作するかはわからないようです。
チェックのため両方インストールして動作する方を利用しましょう。
「hdparm」と「sdparm」をインストールするには、以下のコマンドでインストールできます。

sudo apt-get install hdparm sdparm

8.2.「hdparm」・「sdparm」の動作チェック

以下のコマンドで「hdparm」・「sdparm」のどちらが正しく動作するのか確認します。

#hdparmによるHDDスピンダウン
sudo hdparm -y /dev/(デバイス名)

#sdparmによるHDDスピンダウン
sdparm -r --command=stop /dev/(デバイス名)

(動作しなかった方はremoveしてもらってもOK)

8.3.「hdparm」・「sdparm」の常駐化

  1. 以下のような内容のスクリプトを「hdd_spindown.sh」として「/root」に「root権限」で保存します。
    #!/bin/sh
     
    if [ $# -lt 2 ]; then
            echo "not enough arguments supplied."
            echo "hdd_spindown.sh [UUID] [INTERVAL]"
            exit 0
    fi
     
    disk=`findfs UUID="$1"`
    interval=$2
     
    count=$interval
    up=1
     
    if [ -z $disk ]; then
            #echo "findfs error"
            exit 1
    fi
     
    disk=`echo "$disk" |sed -e "s@/dev/@@"`
     
    state=`grep " $disk " /proc/diskstats`
     
    while [ true ]; do
            sleep 10
            count=$(($count-10))
            newstate=`grep " $disk " /proc/diskstats`
            if [ "$state" = "$newstate" ]; then
                    if [ $count -lt 0 ]; then
                            count=$interval
                            if [ $up = 1 ]; then
                                    #echo -e "spin-down"
                                    sync
                                    state=`grep " $disk " /proc/diskstats`
    
    #hdparmを利用するとき
                                    hdparm -y /dev/$disk > /dev/null 2>&1
    #sdparmを利用するとき
                                    sdparm --command=stop -r /dev/$disk > /dev/null 2>&1
    
                                    up=0
                            fi
                    fi
            else
                    #echo -e "drive is up"
                    count=$interval
                    state="$newstate"
                    up=1
            fi
    done
    
    このスクリプトは、NSLU2-Linux - FAQ / SpinDownUSBHarddisksから引っ張ってきて、findfsを利用してUUIDを引数にできるようにいじったり、出力を吐かないようにしてます。
  2. 「/root/hdd_spindown.sh」のパーミッションを変更する。
    sudo chmod 700 /root/hdd_spindown.sh
    
  3. 「/etc/inittab」を以下のように編集して、スクリプトが起動時に実行されるようにする。
    (追加)
    #auto hdd spindown
    hd:2345:once:/bin/sh /root/hdd_spindown.sh (USBHDDのUUID) (直近のアクセスからスピンダウンまでの時間(秒)) > /dev/null 2>&1
    
    「「/etc/init.d/rc.local」に記述したら?」と言われそうですが、
    一度やってみたところ「rc.local」が「hdd_spindown.sh」の終了を待ってゾンビ化したので、
    「これ放っておくと、他の起動スクリプトに影響出るかも・・・」+「なんか気持ち悪い」と思い以上のようにしました。
    元をたどれば「rc.local」は「inittab」に記載され、起動時に動作しているので、「hdd_spindown.sh」もそちらに記載しています。
    (一応書いておくと、「rc.local」は、
    「/etc/inittab」→「/etc/init.d/rcS」→「/etc/init.d/rc」→「/etc/rc2.d/S05rc.local」→「/etc/init.d/rc.local」
    という順に呼び出されています。)
  4. 動作確認
    再起動して正しくスピンダウンされるか確認する。

8.参考サイト

以下のページを参考にさせていただきました。

製品紹介(Amazonアフィリエイト)



2014/11/24 注釈追加・参考サイトの入れ忘れ修正