Skip to main content.
Google custom search

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カーネルとのインターフェースを取り、 ユーザーランドのイベント処理のスクリプトを起動します。 コマンド行のプログラム apmapmd とのインターフェースを取り、 バッテリー容量問い合わせやシステムのサスペンドの開始に使用できます。

一般的な電源管理のイベントの流れは、以下の手順を踏みます。

  1. APM BIOSはマシンが特定の時間にアイドルな状態を続けたと判断すると、 スタンバイまたはサスペンドの要求をキューに入れます。
  2. APMのカーネル・ドライバーは(一般的に1秒に一度といった)ポーリングを APM BIOSに対して行って、要求のイベントを取得します。そして、 スタンバイまたはサスペンドの要求をapmデーモンへのキューに入れます。
  3. APMデーモンは、現在の電源の状態やデーモンの設定をもとに、 要求を受け付けるかどうかを決定します。 要求を受け付けた場合、 apmデーモンはスタンバイまたはサスペンドの動作を実行して、 カーネル・ドライバーに受け付けまたは拒否したかの通知を送ります。
  4. カーネル・ドライバーは受け付けまたは拒否したかを、 APM BIOSに通知を送ります。
  5. イベントの要求が受け付けられたなら、 APM BIOSはハードウェアを指示されたモードに置きます。

NetBSD APMサポートの設定 (トップ)

まず始めに、APMドライバーを有効にしたカーネルをコンパイルする必要があります。 使用しているカーネルの構成ファイルの次の行を追加、 またはコメントを外してください。

	apm0	at mainbus0	# Advanced power management

自分のカーネルを作成する方法の詳細は、 カーネルの作り方を参照してください。

APMカーネル・ドライバーを組み込んだカーネルができたなら、 APMデーモン(apmd)をブート時に起動させるために、 /etc/rc.conf の変数 apmdYES にセットして下さい。

これら両方の段階を行うと、 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以下の、 standbysuspendresumeのスクリプトです。 apmdは対応したAPMイベントを受け取ると、 適切なスクリプトを動作させます。

standbysuspendスクリプトで、 実行させたいことには以下のものがあります。

  • ネットワーク・インターフェース・カードの電源を切断。 PCMCIAのネットワーク・インターフェース・カードを使用している場合は、 ifconfig <interface> downを実行することで達成できます。
  • ネットワーク・ファイルシステムのアンマウント (そのファイルシステムをアクセスできないところで、 ラップトップをリジュームする予定がある場合)。
  • 稼働中のdhclientpppdを停止。

逆に、resumeスクリプトで、 スタンバイやサスペンドさせたときに行ったこと、 すべてを取り消す適切なコマンドを実行することができます。

NetBSD 1.4に新しいatactlコマンドがあります。 このコマンドを使用して、(IDEとしてより広く知られている) ATAデバイスの電源管理機能を制御することができます。 atactlsetidleオプションを使用して、 ディスクの回転低下を制御するスタンバイ・タイマーを設定できます。 より明確な情報は、 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のスクリプト、 linebatteryがあります。 これらのスクリプトは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 ドキュメンテーション