自宅サーバーをたてていると気になるのが、電気代でしょう。その中でも、ハードディスクのモーター回転は、使用していない時は、是非、停止させておきたいものです。 オープンソースのFreeBSDなので、ソースを改造して実現してみました。
方法としては、ディスクそのものにアイドリング時の動作設定を行うことにしました。
ATAコマンドにパワー管理系のコマンドがあります。
そのコマンドを初期化時に強制的に送ってしまおうということです。
/usr/src/sys/dev/ata/ata-disk.c
ad_attach関数の中で、「/* init device parameters */」の後に「ad_init(dev);」とあるので、その後に以下のコードを追加します。
/* ATA Suspend & Idle Mode Setting */
/* 0xe6..Sleep 0xe2..Suspend 0xe3..Idle value * 5sec */
ata_controlcmd(dev, 0xe3, 0, 0, 0x02);
ata_controlcmd(dev, 0xe2, 0, 0, 0x78);
これで、アイドリング10秒で、アイドルモードに遷移、10分で、サスペンドします。
引数については、ATAコマンドを参照して下さい。 ドライブによっては、効かないコマンドであることも注意して下さい。
これで、ドライブが自主的にサスペンドするんですが、サスペンドからの復帰に時間がかかってしまいタイムアウトとされてしまいます。
Release 7.x 以前は、以下を適用して下さい。
これを回避する為に、タイムアウト値を伸ばしておきます。
上と同じソースのad_strategy関数内にrequest->timeoutとあるので、その値を31としておきます。 ATAの仕様では、サスペンドからの復帰は、最高でも30秒としているからです。
後は、カーネルを再構築して、カーネルを入れ替えれば完了です。