NetBSD ドキュメンテーション: 電源管理
ラップトップのための電源管理
ラップトップのための電源管理
導入 (トップ)
このドキュメンテーションは NetBSD に用意されている電源管理機能の一部と、 殆どの今時のラップトップ・コンピューターに備わっている Advanced Power Management (APM)を含めて説明しています。
現時点では、このページの殆どはi386に特定な情報です。 NetBSD がさらに多くのラップトップのアーキテクチャーのサポートを始めるときに、 それらのアーキテクチャーの電源管理機能をカバーする様に、 このドキュメンテーションは拡充されるでしょう。
電源管理の基本 (トップ)
ラップトップの電源管理はAdvanced Power Management、 略してAPMが中心となります。 APMはラップトップのハードウェアの電源管理機能へのインターフェースを提供 する、BIOSに用意されたサービス・ルーチンの集合です。 このインターフェースを経由して、 NetBSD は(サスペンド要求といった)APMのイベントを受け取ったり、 電源管理の要求や(現在のバッテリー容量といった)問い合わせを行います。
APMは2つの異なる電源の節約状態、 すなわちスタンバイとサスペンドを規定しています。 APMが実際にハードウェアのレベルで行うことは、 使用する特定のラップトップに依存します。 一般的に“スタンバイ”は軽い眠りの状態を意味していて、 “サスペンド”の状態より多くの電力を消費し、より速い復帰ができます。 スタンバイとサスペンドの状態へのAPMタイマーは、 マシンのBIOSで設定されるのが一般的です。 マシンが特定の期間に渡って“アイドル”と判断されると、 BIOSはそれに応じた電源節約モードへの移行をオペレーティングシステムに 要求します。
NetBSD のレベルでは、3つのAPMをサポートするための要素があります。 カーネル・ドライバーはAPM BIOSへのインターフェースを取ります。 apmデーモンの apmd はAPMカーネルとのインターフェースを取り、 ユーザーランドのイベント処理のスクリプトを起動します。 コマンド行のプログラム apm は apmd とのインターフェースを取り、 バッテリー容量問い合わせやシステムのサスペンドの開始に使用できます。
一般的な電源管理のイベントの流れは、以下の手順を踏みます。
- APM BIOSはマシンが特定の時間にアイドルな状態を続けたと判断すると、 スタンバイまたはサスペンドの要求をキューに入れます。
- APMのカーネル・ドライバーは(一般的に1秒に一度といった)ポーリングを APM BIOSに対して行って、要求のイベントを取得します。そして、 スタンバイまたはサスペンドの要求をapmデーモンへのキューに入れます。
- APMデーモンは、現在の電源の状態やデーモンの設定をもとに、 要求を受け付けるかどうかを決定します。 要求を受け付けた場合、 apmデーモンはスタンバイまたはサスペンドの動作を実行して、 カーネル・ドライバーに受け付けまたは拒否したかの通知を送ります。
- カーネル・ドライバーは受け付けまたは拒否したかを、 APM BIOSに通知を送ります。
- イベントの要求が受け付けられたなら、 APM BIOSはハードウェアを指示されたモードに置きます。
NetBSD APMサポートの設定 (トップ)
まず始めに、APMドライバーを有効にしたカーネルをコンパイルする必要があります。 使用しているカーネルの構成ファイルの次の行を追加、 またはコメントを外してください。
apm0 at mainbus0 # Advanced power management
自分のカーネルを作成する方法の詳細は、 カーネルの作り方を参照してください。
APMカーネル・ドライバーを組み込んだカーネルができたなら、
APMデーモン(apmd)をブート時に起動させるために、
/etc/rc.conf
の変数 apmd
を YES
にセットして下さい。
これら両方の段階を行うと、 apm ユーティリティーを使用してAPMシステムとやりとりできるようになります。例えば、
% apm Battery charge state: high Battery remaining: 98 percent A/C adapter state: not connected Power management enabled
APMサポートの使用方法への、より詳細な情報は apm(8) と apmd(8) を参照してください。
電源管理のヒントとトリック (トップ)
電源管理のイベントの基本的なインターフェースは/etc/apm
以下の、
standby
、suspend
、
resume
のスクリプトです。
apmd
は対応したAPMイベントを受け取ると、
適切なスクリプトを動作させます。
standby
やsuspend
スクリプトで、
実行させたいことには以下のものがあります。
- ネットワーク・インターフェース・カードの電源を切断。
PCMCIAのネットワーク・インターフェース・カードを使用している場合は、
ifconfig <interface> down
を実行することで達成できます。 - ネットワーク・ファイルシステムのアンマウント (そのファイルシステムをアクセスできないところで、 ラップトップをリジュームする予定がある場合)。
- 稼働中のdhclientや pppdを停止。
逆に、resume
スクリプトで、
スタンバイやサスペンドさせたときに行ったこと、
すべてを取り消す適切なコマンドを実行することができます。
NetBSD 1.4に新しいatactlコマンドがあります。
このコマンドを使用して、(IDEとしてより広く知られている)
ATAデバイスの電源管理機能を制御することができます。
atactlのsetidle
オプションを使用して、
ディスクの回転低下を制御するスタンバイ・タイマーを設定できます。
より明確な情報は、
atactl(8) を参照して下さい。
ATAスタンバイ・タイマーへ設定する値に疑問があるなら、 以下の文献を読むことをお勧めします。
- “A Quantitative Analysis of Disk Drive Power Management in Portable Computers”, Kester Li, Roger Kumpf, Paul Horton, Thomas Anderson, Computer Science Division, University of California, Berkeley, Winter 1994 Usenix.
- “Thwarting the Power-Hungry Disk”, Fred Douglas, P. Krishnan, Brian Marsh, Matsushita Information Technology Laboratory, Winter 1994 Usenix.
これらの文献の両方で、スタンバイ・タイマーには低い値、 2から8秒のレートを推奨しています。
低い値をスタンバイ・タイマーに設定することによる1つの問題があります。
それは NetBSD はデフォルトでは、絶えず(少なくとも30秒に1度、
すなわちupdateが動作するたび)
ディスクを回転開始状態にさせるのに十分な頻度でディスクへ書き込むことです。
この書き込みのもっとも共通な原因は、ファイルシステムで
ファイルの最終アクセス時刻と(仮想ターミナルといった)
デバイス特殊型ファイルの最終更新時刻の更新であることが判明しました。
これらの動作は、
mount(8) の
オプションnoatime
と(NetBSD 1.4で新しい)
nodevmtime
で抑止できます。
これを行おうと決めた場合、
cronから起動されるatrunを変更するか、
完全に停止したくなるでしょう。デフォルトでは、10分間隔に実行されて、
cronのログファイルにエントリーを書き込み、
ディスクを回転させます。
また、電源がAC電源かバッテリーかによって、
電源管理を異なる設定や
完全に電源管理を無効とすることが望ましい状況があります。
NetBSD 1.4での新しい機能に、2つの新しいapmdのスクリプト、
line
とbattery
があります。
これらのスクリプトはAPMが電源の供給元が変わったことを検出したときに、
apmdから実行されます。
line
スクリプトは電灯線/AC電源へ移行したときに、
battery
スクリプトはバッテリー電源に移行したときに実行されます。
また、現在の電源の供給元に対応したスクリプトは、
apmdが最初に起動されたときにも実行されます。
これらのスクリプトの中にコマンドを記述して、 バッテリーか電灯線を使用したときに応じた電源管理の設定に変更することができます。 ここにスクリプトの例があります。
-
/etc/apm/line
#!/bin/sh mount -u / mount -u /usr atactl wd0 setidle 0
-
/etc/apm/battery
#!/bin/sh mount -u -o async,noatime,nodevmtime / mount -u -o async,noatime /usr atactl wd0 setidle 5
ネットワークインターフェース等の設定にも使われるスクリプトの例については、
/usr/share/examples/apm/script
もあわせて参照してください。
他の便利な機能に、
apmdの-a
フラグがあります。
これを指定すると、
apmdはマシンが電灯線の電源に接続されている場合は、
スタンバイやサスペンドのイベントを無視します。
Squid がラップトップのディスクを回転させてしまう (トップ)
Squid は 15 秒ごとにキャッシュディレクトリーのひとつを検査します。 デフォルトでは、キャッシュ構築のため、第 1 階層のディレクトリー 16 個、 第 2 階層 256 個が使われます。簡単な計算によれば:
16 * 256 * 8k(ブロックサイズ) = ~32mb
バッファーキャッシュにないディレクトリーを新たに読んだ場合、
Squid の動作は非常に遅くなります。 squid.conf
をいじって
このディレクトリー数を減らすことで、ラップトップのディスクが回転する
問題を修正できるはずです。
syslog がディスクを回転させるのを防ぐ (トップ)
ディスクを回転させないようにしようとした場合に問題となるのは、 たとえば syslogd(8) が、 定期的にディスクに書き込もうとしてディスクを回転させてしまうことです。
この問題のうまい回避策は、syslog の出力をすべて、
ディスクではなく仮想コンソールに振り替えることです。
そうするためには、以下の内容を
/etc/syslog.conf
に書きます。
*.* /dev/ttyE3
もちろん、/dev/ttyE3
以外の、
都合のよい仮想コンソールを自由に選んでかまいません。
Back to NetBSD ドキュメンテーション