33.3 ACPI

ACPI (advanced configuration and power interface)は、オペレーティングシステムが個々のハードウェアコンポーネントをセットアップ、および制御できるように設計されています。ACPIは、PnPとAPMの両方の後継となります。また、ACPIはバッテリ、ACアダプタ、温度、ファン、および「close lid」や「battery low」などのシステムイベントに関する情報も提供します。

BIOSには個々のコンポーネントとハードウェアアクセス方法についての情報が入ったテーブルがあります。オペレーティングシステムは、この情報を使用して、割り込みまたはコンポーネントの有効化と無効化などのタスクを実行します。BIOSに格納されているコマンドを、オペレーティングシステムが実行するとき、機能はBIOSの実装方法に依存します。ACPIが検出可能で、ロードできるテーブルは、/var/log/boot.msgにレポートされます。ACPIに生じた問題のトラブルシューティングについては、33.3.4項 「トラブルシューティング」を参照してください。

33.3.1 動作中のACPI

システムのブート時に、カーネルがACPI BIOSを検出する場合、ACPIが自動的に有効になり、APMが無効になります。旧式のコンピュータでは、ブートパラメータacpi=onを指定しなければならない場合があります。コンピュータは、ACPI 2.0以降をサポートする必要があります。/var/log/boot.msgのカーネルブートメッセージで、ACPIが有効にされていることを確認します。

続いて、複数のモジュールがロードされます。これは、acpidの起動スクリプトによって行われます。これらのモジュールのいずれかに問題が発生すると、対応するモジュールが/etc/sysconfig/powersave/commonでのロードまたはアンロードから除外されます。 システムログ(/var/log/messages)には、モジュールのメッセージが入っているので、どのコンポーネントが検出されたことがわかります。

/proc/acpiには、システム状態に関する情報を提供するファイルや、状態を変更するために使用できるファイルが多数含まれています。一部の機能はまだ開発中であるため動作しません。また、一部の機能はメーカの実装状況に大きく依存するためサポートされていない場合もあります。

すべてのファイル(dsdtおよびfadt)は、コマンドcatで読み取ることができます。一部のファイルでは、echo で設定を変更できます。 たとえば、echoX > ファイル で X に適した値を指定します。これらの値への簡単なアクセス方法には、powersaveコマンドがあります。このコマンドは、Powersaveデーモンおフロントエンドとして機能します。以下で最も重要なファイルについて説明します。

/proc/acpi/info

ACPIに関する一般的な情報

/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)が含まれています。これらは、acpidmpacpidisasm、およびdmdecodeで読み取ることができます。これらのプログラムとマニュアルは、pmtoolsパッケージにあります。たとえば、acpidmp DSDT | acpidisasmなどです。

/proc/acpi/ac_adapter/AC/state

ACアダプタが接続されているかを示します。

/proc/acpi/battery/BAT*/{alarm,info,state}

バッテリ状態についての詳細情報です。充電レベルを読み取るには、infolast full capacitystateremaining capacityを比較します。これをもっと円滑に行うには、33.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_mode

ACPIで制御される冷却化方式を選択します。パッシブ(パフォーマンスは低いが経済的)またはアクティブ(フルパフォーマンス、ファンノイズ)のどちらかを選択できます。

/proc/acpi/thermal_zone/*/trip_points

パッシブ/アクティブ冷却、サスペンション(hot)、またはシャットダウン(critical)など、特定のアクションをトリガする温度を設定します。可能なアクションは、DSDT(デバイス依存)内で定義されます。ACPI仕様で定義されているトリップポイントは、criticalhotpassiveactive1、およびactive2です。実装されていないトリップポイントがあっても、このファイルにはすべてを常にこの順序で入力する必要があります。たとえば、エントリ echo90:0:70:0:0>trip_points は、critical の温度を 90passive の温度を 70 に設定します (温度はすべて摂氏)。

/proc/acpi/thermal_zone/*/polling_frequency

温度が変化してもtemperatureの値が自動的に更新されない場合は、ポーリングモードをここでオンにします。コマンド echo X > /proc/acpi/thermal_zone/*/polling_frequency を使用すると、X 秒ごとに温度の問い合わせが行われます。ポーリングを無効にするには、X=0に設定します。

これらの設定、情報、イベントは、いずれも手動で編集する必要はありません。編集はPowersaveデーモン(powersaved)および各種フロントエンド(powersave、kpowersave、wmpowersaveなど)で実行できます。33.3.3項 「ACPIツール」を参照してください。

33.3.2 CPUパフォーマンスの制御

CPUには、3つの省電力方法があります。コンピュータの動作モードによっては、この3つの方法を併用することもできます。また、省電力とは、システムの温度上昇が少なく、ファンが頻繁にアクティブにならないことを意味します。

周波数と電圧の調節

PowerNow!Speedstepは、AMD社とIntel社が使用するこのテクノロジの名称です。ただし、このテクノロジは他のメーカのプロセッサにも適用されます。CPUのクロック周波数とそのコア電圧が同時に低下し、段階的な省エネよりも大きな効果が得られます。つまり、周波数が半分になると(半分のパフォーマンス)、消費電力も半分以下になります。このテクノロジは、APMまたはACPIには依存していません。CPU周波数制御には、カーネル自体か、またはユーザスペースアプリケーションを使用した2つのアプローチがあります。従って、/sys/devices/system/cpu/cpu*/cpufreq/で設定できる各種カーネルガバナがあります。

ユーザスペースガバナ

ユーザスペースガバナが設定されている場合、カーネルは、通常、デーモンなどのユーザスペースアプリケーションにCPU周波数制御を譲渡します。SUSE Linuxでは、このデーモンは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では、これらのテクノロジはpowersaveデーモンで制御されます。この設定については、33.5項 「powersaveパッケージ」を参照してください。

33.3.3 ACPIツール

総合的と呼べるACPIユーティリティには、バッテリ充電レベルや温度などの情報を表示するだけのツール(acpi、klaptopdaemon、wmacpimonなど)、/proc/acpi内の構造へのアクセスを容易にするツール、変化の監視を補助するツール(akpi、acpiw、gtkacpiw)、BIOS内のACPIテーブルを編集するためのツール(パッケージ pmtools)などが含まれています。

33.3.4 トラブルシューティング

問題を2つに大別できます。1つはカーネルのACPIコードに、未検出のバグが存在する可能性があることです。この場合は、いずれ修正プログラムがダウンロードできるようになります。ただし、問題の多くはBIOSが原因になっています。また、場合によっては、他の広く普及しているオペレーティングシステムにACPIを実装した場合にエラーが起きないよう、BIOSにおけるACPIの指定を故意に変えていることがあります。ACPIに実装すると重大なエラーを生じるハードウェアコンポーネントは、ブラックリストに記録され、これらのコンポーネントに対してLinuxカーネルがACPIを使用しないようにします。

問題に遭遇したときに最初に実行することは、BIOSの更新です。コンピュータがまったくブートしない場合、次のブートパラメータは有用です。

pci=noacpi

PCIデバイスの設定にACPIを使用しません。

acpi=oldboot

単純なリソース設定のみを実行します。ACPIを他の目的には使用しません。

acpi=off

ACPIを無効にします。

[Warning]ACPIなしに起動できない場合

一部の新型のコンピュータは(特に、SMPシステムとAMD64システム)、ハードウェアを正しく設定するためにACPIが必要です。これらのコンピュータでACPIを無効にすると、問題が生じます。

システムのブートメッセージを調べてみましょう。そのためには、ブート後にコマンドdmesg | grep -2i acpiを使用します(または、問題の原因がACPIだとは限らないので、すべてのメッセージを調べます)。ACPIテーブルの解析中に問題が発生した場合は、最も重要なテーブル(DSDT)を改良版に置き換えます。この場合、BIOSで障害のあるDSDTが無視されます。処理手順については、33.5.4項 「トラブルシューティング」を参照してください。

カーネルの設定には、ACPIデバッグメッセージを有効にするスイッチがあります。ACPIデバッグを有効にした状態でカーネルをコンパイルし、インストールすると、詳細な情報を表示するエラーのエキスパート検索がサポートできるようになります。

BIOSまたはハードウェアに問題がある場合は、常にメーカに連絡することをお勧めします。特に、Linuxに関するサポートを常に提供していないメーカには、問題を通知する必要があります。なぜなら、メーカは、自社の顧客の無視できない数がLinuxを使用しているとわかってやっと、問題を真剣に受け止めるからです。

33.3.4.1 関連情報

ACPIに関する補足資料とヘルプ