Raspberry PiにSambaをインストールしてNASを作った時に、一定時間アクセスしなかった場合にUSB HDDを停止(スピンダウン)してスリープさせる方法を紹介します。ググっていると、なにやら長いスクリプトを作成している記事もありますが、そんな必要はなく、1つのコマンドを設定ファイルに記述しておくだけです。
外付けのUSB HDDによっては一定時間アクセスしないと、自律的にディスクが停止(スピンダウン)してスリープする製品があるのですが、安価に購入できる録画用と謳われているUSB HDDの場合には、大抵はレコーダーの電源に連動する形でスリープに入るようになっており、サーバーをRaspberry Piで作った場合には、基本的に電源ONのままで運用しますので、結果的にこのようなHDDは回りっぱなしになります。
スピンダウン・スピンアップはそれ自体がHDDにダメージが及ぶとされていて、回りっぱなしにしておく方が良いという説もあるのですが、1日に1時間程度しか使わないような場合に、残りの23時間は無駄に電力を消費して回りっぱなしになるのも精神衛生上良くありません。最近のHDDは静かですが、どうしてもある程度の騒音はありますしね。
今回使用したUSB HDDはこちらです。
外付けのUSB HDDを安価に購入しようとすると、大体バッファローの録画用を謳う製品になるのですが、6TBの容量になるとこの東芝の製品が安価でした。販売元がバッファローなのですが、ロゴも製品自体もTOSHIBAです。今回紹介する方法はHDDの製品は問わない汎用的なツールによるものなのですが、HDDによっては受け付けないものもあるそうですので、これから購入する人で不安な方は同じ製品を購入するのが良いでしょう。
hdparmのインストール
hdparmはHDDの設定を表示・変更できるツールです。その機能の一つとして「一定時間アクセスがない時にスリープ(スピンダウン)させる」機能があります。
Raspberry Pi OSには標準では入っていませんので、まずはインストールする必要があります。まずは、お決まりのおまじないです。Windows Updateのようなものです。
sudo apt update sudo apt upgrade -y
そして、hdparmをインストールします。
sudo apt install hdparm -y
これでインストールされました。ためしにHDDの設定値を表示してみます。
sudo hdparm -I /dev/sda
こんな感じに表示されればOKです(実際にはもっと下にずらずらと表示されます。このスクリーンショットは上にスクロールしています)
一定時間アクセスがない場合にHDDをスリープさせる設定
それではhdparmによってHDDにスリープを設定してみます。下記のコマンド形式で指定します。
sudo hdparm -S 「この時間アクセスがなければスリープする」 /dev/sda
「この時間アクセスがなければスリープする」の部分に時間を指定するのですが、これが少し癖があります。
- 0:スリープが無効になる
- 1~240:指定した値 × 5秒
- 241~251:(指定した値 – 240) × 30分
となります。例えば240を指定すると、240 × 5 = 1200秒 = 20分で、241を指定すると(241 – 240) × 30 = 30分となりますので、21~29分は指定できないことになります。試しに4(20秒)を指定してみましょう。
sudo hdparm -S 4 /dev/sda
20秒後にHDDがスリープ(スピンダウン)して静かになるはずです。HDDにアクセスすればまた動き出し、20秒後にスリープします。
しかし、この設定はRaspberry Piが再起動するとクリアされてしまいます。そこでRaspberry Piの起動時にこのコマンドを実行するように設定しますが、その前に。。。
複数のディスクが接続されるケースに備えておく
ここまではコマンドに対象となるUSB HDDを「/dev/sda」として指定してきました。しかし、これはあくまでもRaspberry PiにHDDやSSDなどのディスクが1つしか接続されていない(起動用のSDカード以外で)前提の話です。Raspberry Piに接続されているディスクの一覧は次のコマンドで確認できます。
lsblk
「USB-HDD」というのは私がUSB HDDにつけたボリュームラベルです。sdaとして認識されているのがわかります。sda1というのはパーテションですので、複数のパーテションがある場合にはsda2・・・と続きます。mmcblk0というのはRaspberry Pi OSが入っているSDカードです。 例えばここに新たにUSBのSSDを繋いでみます。
sdbとしてUSB SSDが認識されました。このように複数のディスクが接続されている場合にはsda、sdb、sdc・・・と名前がついていきますので、コマンドに/dev/sdaのように指定しておくと、これが変わってしまう可能性があります。今はUSB-HDDがsdaになっていますが、再起動すると自動マウントするタイミングで入れ替わってしまう可能性もあります。
そこで、確実にこのHDDを指定するために、HDD固有のIDで指定する必要があります。IDを確認するには次のコマンドを使用します。
ls -l /dev/disk/by-id
今回使用しているHDDはTOSHIBAの製品ですので、sdaの赤枠の部分が今回使用するIDです。後ろに「-part1」と付いているのはパーテションです。また、頭に「usb-」が付いているものありますが、「ata-」が付いているものを使用します。
Raspberry Piの起動時にコマンドが実行されるように設定する
では、このIDを使って、hdparamコマンドをRaspberry Piが起動した時に実行されるように設定します。エディタにて設定ファイルを開きます。
sudo nano /etc/rc.local
/etc/rc.localは元から存在していて、こんな感じの内容がエディタに表示されます。
この「exit 0」の上に、次のようにhdparmのコマンドを記述します。
hdparam -S [時間] /dev/disk/byid/[上で確認したHDDのID]
頻繁にスピンダウンさせるとHDDにダメージとなりますので、私は241(30分)を指定しています。もちろん「ata-TOSHIBA~」のHDDのIDはご自分のものを指定してください。
上書きセーブするためにctrl + oを押します。下のスクリーンショットのように書き込み先のファイルを確認してきますので、enterキーを押してください。
ctrl + xでエディタを閉じます。
最後にRaspberry Piを再起動します。
sudo reboot
30分くらい放置しておくと、HDDがスリープ(スピンダウン)して静かになるはずです。