ACPI (advanced configuration and power interface)は、オペレーティングシステムが個々のハードウェアコンポーネントをセットアップ、および制御できるように設計されています。ACPIは、PnPとAPMの両方の後継となります。また、ACPIはバッテリ、ACアダプタ、温度、ファン、および「close lid」や「battery low」などのシステムイベントに関する情報も提供します。
BIOSには個々のコンポーネントとハードウェアアクセス方法についての情報が入ったテーブルがあります。オペレーティングシステムは、この情報を使用して、割り込みまたはコンポーネントの有効化と無効化などのタスクを実行します。BIOSに格納されているコマンドを、オペレーティングシステムが実行するとき、機能はBIOSの実装方法に依存します。ACPIが検出可能で、ロードできるテーブルは、/var/log/boot.msgにレポートされます。ACPIに生じた問題のトラブルシューティングについては、28.3.4項 「トラブルシューティング」を参照してください。
システムのブート時に、カーネルがACPI BIOSを検出する場合、ACPIが自動的に有効になります。旧式のコンピュータでは、ブートパラメータacpi=onを指定しなければならない場合があります。コンピュータは、ACPI 2.0以降をサポートする必要があります。/var/log/boot.msgのカーネルブートメッセージで、ACPIが有効にされていることを確認します。
続いて、複数のモジュールがロードされます。これは、acpidの起動スクリプトによって行われます。これらのモジュールのいずれかが問題になる場合、/etc/sysconfig/powersave/commonから、該当するモジュールをロード/アンロードの対象から除外することができます。システムログ(/var/log/messages)には、モジュールに関するメッセージが記録されています。このログから、どのコンポーネントが検出されたかを確認することができます。
/proc/acpiには、システム状態に関する情報を提供するファイルや、状態を変更するために使用できるファイルが多数含まれています。一部の機能はまだ開発中であるため動作しません。また、一部の機能はメーカの実装状況に大きく依存するためサポートされていない場合もあります。
すべてのファイル(dsdtおよびfadt)は、コマンドcatで読み取ることができます。一部のファイルでは、echoを使って設定を変更することができます。たとえば、Xに適切な値を指定するには、「echo X > file」と指定します。これらの値に簡単にアクセスする手段としては、powersaveコマンドがあります。このコマンドは、Powersaveデーモンのフロントエンドとして機能します。以下で最も重要なファイルについて説明します。
/proc/acpi/infoACPIに関する一般的な情報。
/proc/acpi/alarmシステムがいつスリープ状態から回復するかを指定します。現在、この機能は完全にはサポートされていません。
/proc/acpi/sleepさまざまなスリープ状態に関する情報を提供します。
/proc/acpi/event
すべてのイベントがここにレポートされ、Powersaveデーモン(powersaved)で処理されます。Powerボタンの押下げ、またはふたを閉じるなど、いずれのデーモンもこのファイルにアクセスしないイベントは、cat /proc/acpi/eventによって読み取ることができます(Ctrl+Cキーで終了します)。
/proc/acpi/dsdtおよび/proc/acpi/fadt
これらのファイルにはACPIテーブルのDSDT (differentiated system description table)とFADT (fixed ACPI description table)が含まれています。これらは、acpidmp、acpidisasm、およびdmdecodeで読み取ることができます。これらのプログラムとマニュアルは、pmtoolsパッケージにあります。たとえば、acpidmp DSDT | acpidisasmなどです。
/proc/acpi/ac_adapter/AC/stateACアダプタが接続されているかを示します。
/proc/acpi/battery/BAT*/{alarm,info,state}
バッテリ状態についての詳細情報です。充電レベルを読み取るには、infoのlast full capacityとstateのremaining capacityを比較します。これをもっと円滑に行うには、28.3.3項 「ACPIツール」で説明する特別なプログラムの1つを使用します。バッテリイベント(warning、low、criticalなど)がトリガされる充電レベルは、alarmで指定できます。
/proc/acpi/infoこのディレクトリには、ラップトップの蓋およびボタンなどのスイッチに関する情報が含まれています。
/proc/acpi/fan/FAN/state
ファンが現在、作動しているかを示します。ファンは、このファイルに0 (オン)か3 (オフ)かを書き込゙ことによって、オンまたはオフにできます。ただし、システムが異常に熱くなった場合は、カーネルとハードウェア(またはBIOS)の両方のACPIコードによってこの設定が上書きされます。
/proc/acpi/processor/*システムに搭載されているCPUごとに、個別のサブディレクトリが保持されます。
/proc/acpi/processor/*/infoプロセッサの省エネオプションに関する情報。
/proc/acpi/processor/*/power
現在のプロセッサ状態に関する情報。C2の横にアスタリスクが付いている場合、プロセッサがアイドル状態です。usageに示すように、これが最もよくある状態です。
/proc/acpi/processor/*/throttlingプロセッサクロックの減速の設定に使用できます。通常、スロットリングは8つのレベルで使用できます。これは、CPUの周波数制御とは独立しています。
/proc/acpi/processor/*/limitパフォーマンス(廃止)とスロットリングがデーモンによって自動的に制御される場合、上限をここで指定できます。制限事項の一部は、システムによって決まります。中には、ユーザによって調整できるものもあります。
/proc/acpi/thermal_zone/すべてのサーマルゾーンに対し、個別の下位ゾーンが存在します。サーマルゾーンとは、よく似たサーマルプロパティを持ち、ハードウェアメーカによって番号と名前が指定された領域です。しかし、ACPIが持つ可能性の多くは、ほとんど実装されていません。そして、温度制御は相変わらずBIOSによって管理されています。オペレーティングシステムが介入すると、ハードウェアの寿命が短くなるので、オペレーティングシステムが介入する機会はあまりありません。したがって、一部のファイルの内容は、単なる理論上の値です。
/proc/acpi/thermal_zone/*/temperatureサーマルゾーンの現在の温度です。
/proc/acpi/thermal_zone/*/state
この状態は、すべてがokなのか、またはACPIがアクティブまたはパッシブ冷却を適用しているかを示します。ACPI独立のファン制御の場合、この状態は常にokです。
/proc/acpi/thermal_zone/*/cooling_modeACPIで制御される冷却化方式を選択します。パッシブ(パフォーマンスは低いが経済的)またはアクティブ(フルパフォーマンス、ファンノイズ)のどちらかを選択できます。
/proc/acpi/thermal_zone/*/trip_points
パッシブ/アクティブ冷却、サスペンション(hot)、またはシャットダウン(critical)など、特定のアクションをトリガする温度を設定します。可能なアクションは、DSDT(デバイス依存)内で定義されます。ACPI仕様で定義されているトリップポイントは、critical、hot、passive、active1、およびactive2です。実装されていないトリップポイントがあっても、このファイルにはすべてを常にこの順序で入力する必要があります。たとえば、エントリecho90:0:70:0:0>trip_pointsは、criticalの温度を90、passiveの温度を70に設定します (温度はすべて摂氏)。
/proc/acpi/thermal_zone/*/polling_frequency
温度が変化してもtemperatureの値が自動的に更新されない場合は、ポーリングモードをここでオンにします。コマンド echoX > /proc/acpi/thermal_zone/*/polling_frequency を使用すると、X 秒ごとに温度の問い合わせが行われます。ポーリングを無効にするには、X=0に設定します。
これらの設定、情報、イベントは、いずれも手動で編集する必要はありません。編集はPowersaveデーモン(powersaved)および各種フロントエンド(powersave、kpowersave、wmpowersaveなど)で実行できます。詳細については、28.3.3項 「ACPIツール」を参照してください。
CPUには、3つの省電力方法があります。コンピュータの動作モードによっては、この3つの方法を併用することもできます。また、省電力とは、システムの温度上昇が少なく、ファンが頻繁にアクティブにならないことを意味します。
PowerNow!とSpeedstepは、AMD社とIntel社が使用するこのテクノロジの名称です。ただし、このテクノロジは他のメーカのプロセッサにも適用されます。CPUのクロック周波数とそのコア電圧が同時に低下し、段階的な省エネよりも大きな効果が得られます。つまり、周波数が半分になると(半分のパフォーマンス)、消費電力も半分以下になります。このテクノロジは、APMまたはACPIには依存していません。CPU周波数制御には、カーネル自体か、またはユーザスペースアプリケーションを使用した2つのアプローチがあります。従って、/sys/devices/system/cpu/cpu*/cpufreq/で設定できる各種カーネルガバナがあります。
ユーザスペースガバナが設定されている場合、カーネルは、通常、デーモンなどのユーザスペースアプリケーションにCPU周波数制御を譲渡します。SUSE Linux Enterpriseでは、このデーモンはpowersavedパッケージにあります。この実装が使用されるとき、CPU周波数は現在のシステム負荷に応じて調整されます。デフォルトでは、カーネル実装の1つが使用されます。ただし、一部のハードウェア、特定のプロセッサまたはドライバによっては、ユーザスペースの実装が唯一の対策となっています。
これは、動的CPU周波数ポリシーのカーネル実装で、ほとんどのシステムで使用できます。システムの負荷が高くなるとすぐに、CPU周波数が直ちに上がります。システム負荷が低い場合は、周波数が下がります。
このガバナは、より保守的なポリシーが使用される以外は、オンデマンド実装と類似しています。CPU周波数が上がる前に、一定の時間、システムの負荷が高くなっている必要があります。
CPU周波数を一定にできるだけ低く設定します。
CPU周波数を一定にできるだけ高く設定します。
このテクノロジでは、CPUのクロック信号インパルスが一定割合だけ省略されます。25%のスロットリングでは、4回に1回の割合でインパルスが省略されます。87.5%では、プロセッサにインパルスが届くのは8回に1回だけになります。ただし、省エネ度が減速の割合に比例して増えることはありません。通常、スロットリングが使用されるのは、周波数調節を使用できない場合、または省電力を最大限に使用する場合だけです。このテクノロジも、特殊なプロセスで制御する必要があります。システムインタフェースは、/proc/acpi/processor/*/throttlingです。
オペレーティングシステムは、何も実行することがない場合にプロセッサをスリープ状態にします。この場合、オペレーティングシステムはCPUにhaltコマンドを送ります。C1、C2、およびC3の、3つのオプションがあります。最も経済的な状態C3では、プロセッサキャッシュとメインメモリとの同期も停止します。そのため、この状態を適用できるのは、バスマスタアクティビティを介してメインメモリの内容を変更している他のデバイスが存在しない場合だけです。一部のドライバでは、C3を使用できません。現在の状態は、/proc/acpi/processor/*/powerに表示されます。
周波数調節とスロットリングが関係するのは、プロセッサがビジー状態の場合だけです。これは、プロセッサがアイドル状態のときには、最も経済的なC状態が常に適用されるためです。CPUがビジー状態の場合、省電力方式として周波数調節を使用することをお勧めします。通常、プロセッサは部分的な負荷でのみ動作します。この場合は、低周波数で実行できます。一般に、カーネルのオンデマンドガバナまたはpowersavedのようなデーモンで制御される動的な周波数調節が最善の方法といえます。低周波数をスタティックに設定する方法は、バッテリ使用時やコンピュータを冷却または静止させたい場合に役立ちます。
スロットリングは、システムが高負荷であるにもかかわらずバッテリ使用時間を延長する場合など、最後の手段として使用する必要があります。ただし、スロットリングの割合が高すぎると、スムーズに動作しないシステムがあります。さらに、CPUの負荷が小さければ、CPUスロットリングは無意味です。
SUSE Linux Enterpriseでは、これらのテクノロジはpowersaveデーモンで制御されます。この設定については、28.5項 「powersaveパッケージ」を参照してください。
総合的に呼べるACPIユーティリティには、バッテリ充電レベルや温度などの情報を表示するだけのツール(acpi、klaptopdaemon、wmacpimonなど)、/proc/acpi内の構造へのアクセスを容易にするツール、変化の監視を補助するツール(akpi、acpiw、gtkacpiw)、BIOS内のACPIテーブルを編集するためのツール(パッケージ pmtools)などが含まれています。
問題を2つに大別できます。1つはカーネルのACPIコードに、未検出のバグが存在する可能性があることです。この場合は、いずれ修正プログラムがダウンロードできるようになります。ただし、問題の多くはBIOSが原因になっています。また、場合によっては、他の広く普及しているオペレーティングシステムにACPIを実装した場合にエラーが起きないよう、BIOSにおけるACPIの指定を故意に変えていることがあります。ACPIに実装すると重大なエラーを生じるハードウェアコンポーネントは、ブラックリストに記録され、これらのコンポーネントに対してLinuxカーネルがACPIを使用しないようにします。
問題に遭遇したときに最初に実行することは、BIOSの更新です。コンピュータがまったくブートしない場合、次のブートパラメータは有用です。
PCIデバイスの設定にACPIを使用しません。
単純なリソース設定のみを実行します。ACPIを他の目的には使用しません。
ACPIを無効にします。
![]() | ACPIなしに起動できない場合 |
|---|---|
一部の新型のコンピュータは(特に、SMPシステムとAMD64システム)、ハードウェアを正しく設定するためにACPIが必要です。これらのコンピュータでACPIを無効にすると、問題が生じます。 | |
システムのブートメッセージを調べてみましょう。そのためには、ブート後にコマンドdmesg | grep -2i acpiを使用します(または、問題の原因がACPIだとは限らないので、すべてのメッセージを調べます)。ACPIテーブルの解析時にエラーが発生した場合、重要なDSDTテーブルを改善版と置換することができます。この場合、BIOSで障害のあるDSDTが無視されます。具体的な手順については28.5.4項 「トラブルシューティング」を参照してください。
カーネルの設定には、ACPIデバッグメッセージを有効にするスイッチがあります。ACPIデバッグを有効にした状態でカーネルをコンパイルし、インストールすると、詳細な情報を表示するエラーのエキスパート検索がサポートできるようになります。
BIOSまたはハードウェアに問題がある場合は、常にメーカに連絡することをお勧めします。特に、Linuxに関するサポートを常に提供していないメーカには、問題を通知する必要があります。なぜなら、メーカは、自社の顧客の無視できない数がLinuxを使用しているとわかってやっと、問題を真剣に受け止めるからです。
ACPIに関する補足資料とヘルプ
http://www.cpqlinux.com/acpi-howto.html (詳細なACPI HOWTO、DSDTパッチが含まれています)
http://www.intel.com/technology/iapc/acpi/faq.htm (IntelのACPIに関するFAQ)
http://acpi.sourceforge.net/ (SourceforgeによるACPI4Linuxプロジェクト)
http://www.poupinou.org/acpi/ (Bruno DucrotによるDSDTパッチ)