うちでファイルサーバにしているFreeBSDマシンは、ハードディスクを4台つないでいます。でも、通常運用にはルートファイルシステムなどが載っている1台だけ動いていれば十分なので、残りの3台はatacontrol spindownコマンドで、10分間アクセスがなければ回転を停止するように設定していました。

が、先日OSをFreeBSD 9.0-RELEASEにしたところ、camcontrolを使えーというメッセージが出て、atacontrolは使えなくなってしまいました。

# atacontrol spindown ad4 600
atacontrol:
ATA_CAM option is enabled in kernel.
Please use camcontrol instead.

camcontrolのマニュアルページを見てみると、standbyというそれらしいサブコマンドがあります。早速実験。

# camcontrol standby ada0

すると、ワットチェッカーの実測で、数Wほど消費電力が下がりました。この状態でada0にアクセスすると、数秒で復帰、消費電力も元に戻ります。確かに機能しているようです。

では-tオプションでスタンバイまでの秒数を指定してみます。

# camcontrol standby ada0 -t 15

あれ、コマンド発行したとたんにスピンダウンしてしまいました。15秒を指定したはずなのに……。

少しググってみたら、The FreeBSD Forumsというところで [AHCI] Spinning down ada(4) disksという記事を見つけました。いちばん最後のDr_Sweetyさんの投稿(2010-08-23 13:32)に、camcontrolのidleとstandbyの詳しい挙動が書かれています。簡単にまとめると……

  • camcontrol idle adaX: すぐにアイドルモードにするけど、スピンダウンはしない
  • camcontrol idle adaX -t XXX: すぐにアイドルモードにするとともに、最後のリクエストからXXX秒後にスピンダウンするようスタンバイタイマーをセットする。
  • camcontrol standby adaX: すぐにスピンダウンする。
  • camcontrol standby adaX -t XXX: すぐにスピンダウンするとともに、最後のリクエストからXXX秒後にスピンダウンするようスタンバイタイマーをセットする。

ということで、結論としては、atacontrol spindown adX XXXにいちばん近いのはcamcontrol idle adaX -t XXXのようです。試してみたところ、確かに、指定した秒数アクセスがないとスピンダウン、スピンダウン中にアクセスがあるとスピンアップ、その後また指定した秒数アクセスがないとスピンダウン、という挙動が確認できました。

ところで、マシンの起動後に毎回手でこの設定をするのは面倒なので、rc.dのスクリプトを作って起動時に自動で設定されるようにしてみました。下記の内容を/usr/local/etc/rc.d/spindownなどに保存して実行フラグを立て、/etc/rc.confにspindown_enable=”YES”と書いておくと、spindown_set_spindownの引数に指定したドライブに、指定した秒数でスタンバイタイマーがセットされるようになります。スクリプトを変更したときは、/usr/local/etc/rc.d/spindown startで適用することもできます。

#!/bin/sh

# PROVIDE: spindown
# REQUIRE:
# BEFORE:

. /etc/rc.subr

name="spindown"
rcvar=`set_rcvar`
start_cmd="${name}_start"
stop_cmd=":"

load_rc_config $name
eval "${rcvar}=\${${rcvar}:-'NO'}"

spindown_set_spindown() {
    echo -n " $1($2)"
    camcontrol idle "$1" -t "$2"
}

spindown_start() {
    echo -n "Setting ${name}:"
    spindown_set_spindown ada0 600
    spindown_set_spindown ada2 600
    spindown_set_spindown ada3 600
    echo
}

run_rc_command "$1"

※バージョンメモ

  • FreeBSD 9.0-RELEASE

※更新履歴

  • 2012-03-17 rc.confの記述を追加