2019年12月18日水曜日

HDD自動スピンダウン

24時間稼働予定のラズベリーパイで、接続している外付けHDDを常時起動しておくのは、電気代的に避けたい。
バックアップ用途であり、頻繁に使うものでもないので、一定時間アクセスがなければ、スピンダウン(休止状態)になるようにしたい。

環境:
RaspberryPi 3B+
Description:Raspbian GNU/Linux 10 (buster)
sdparm version: 1.10 20160222 [svn: r279]
USB-HDD:HD-AD4U3 4TB
外付けHDDの電源管理としては、sdparmとhdparmというものがある。
私の環境ではsdparmが利用可能だったので、sdparmの設定方法の備忘録。

sdparmのインストール

$ sudo apt update
$ sudo apt install sdparm

デバイスの接続場所を確認
$ df -h
/dev/sdb1        3.7T  428G  3.3T   12% /media/pi/HD-ADU3
USB-HDDは /dev/sdb1として接続されている。


sdparmによるHDDスピンダウンのコマンド
$ sudo sdparm --command=stop /dev/sdb1
>>1回ではゆっくりとした点滅後に点灯に戻るが、同じコマンドで2回目を実行することで、アクセスランプが消灯した。

HDDを監視し、一定時間アクセスがなければ、上記のコマンドを実行するスクリプトを新規作成する。
(adu3_spindownは任意のファイル名でOK)
$ sudo nano /usr/local/bin/adu3_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 sdparm --command=stop -r /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
--------------------


・whileループ関数で監視し続ける
・sleepで60秒ごとに実行するようにする
・/proc/diskstatsの内容を監視し、指定した時間(下記の/etc/rc.localに記載する第2
引数)経っても変更がなかったらスピンダウンさせ、echoでlogにメッセージ記載

・upがHDDの稼働状態の管理。起動時にup=1に設定。スピンダウンしたらup=0に変更。スピンアップしたらup=1に変更。
・ページの下にフローチャートを追記。

上記のファイルを作成したら、実行できるようにパーミッションを変更。
$ sudo chmod 755 /usr/local/bin/adu3_spindown.sh
chmod 755=「rwxr-xr-x」 所有者:全部、グループ&その他:読み出し&実行

起動時に動作させるために上記のスクリプトをrc.localに登録する。
$ sudo nano /etc/rc.local
以下の内容を文末のexit 0 の直前に追記する。
--------------------
/usr/local/bin/adu3_spindown.sh sdb1 3600 2>&1 | logger -t adu3_spindown &
--------------------
・1時間=3600秒。/proc/diskstatsの内容に変更がなかったら、スピンダウンするように設定した。
・3600は使用目的に沿った秒数に変更可能。
・"&"と文末に記載することでバックグラウンドで稼働。

スピンダウン、スピンアップの状況は以下のコマンドで確認可能。
$ tail /var/log/user.log
>>Dec 18 00:07:54 raspberrypi adu3_spindown: spin-down
>>Dec 18 00:11:55 raspberrypi adu3_spindown: drive is up

最初はrc.localへの記載を3600秒等ではなく、120秒など短い秒数で設定して、きちんと動作しているかの確認を行うとよい。
rc.localへの記載は再起動しないと反映されないので、変更した際には、再起動を行う。

2019.12.22追記
シェルスクリプトの内容をフローチャート化してみた。

0 件のコメント:

コメントを投稿