第23章 電源管理

目次

23.1. 省電力機能
23.2. Advanced Configuration and Power Interface (ACPI)
23.3. ハードディスクの休止
23.4. トラブルシューティング
23.5. さらなる情報

電源管理は特にラップトップ型のコンピュータでは重要な機能ですが、他のコンピュータで あっても便利な仕組みです。その電源管理技術の 1 つである ACPI (Advanced Configuration and Power Interface) は、新しい製品であれば全てのもの (ラップトップ、デスクトップ、 サーバ) に搭載されています。電源管理技術には適切なハードウエア構成と BIOS ルーチンが 必要ですが、ほとんどのラップトップと多くの新しいデスクトップやサーバに搭載されて います。また電源管理技術では、 CPU の周波数を制御することで省電力を実現したり、 動作音を低減したりすることもできます。

23.1. 省電力機能

省電力の機能はラップトップ型コンピュータのモバイル使用に限らず、デスクトップシステム においても効果を発揮します。 ACPI での主な機能と用途は下記の通りです:

スタンバイ

未対応です。

サスペンド (メモリへの)

このモードでは、システム全体の状態を RAM に書き込みます。その後、 RAM を 除く全てのシステムはスリープ状態に入ります。この状態により、システム全体の 消費電力をとても抑えることができます。この状態の利点は数秒程度でスリープ 前の作業を再開できるという点にあり、アプリケーションの起動や再起動が不要 です。この機能は ACPI の S3 ステートと呼ばれる機能に 対応しています。この状態のサポートは現在開発中の段階で、ハードウエア側に 大きく依存した作りになっています。

ハイバネーション (ディスクへのサスペンド)

このモードでは、システム全体の状態がハードディスクに書き込まれ、システムの 電源が落とされます。このモードでは、最低でも RAM と同容量のサイズをスワップ パーティションに用意して、システム全体の状態を書き込むことができるように しなければなりません。この状態からの復帰には 30 秒から 90 秒程度の時間が 必要で、この復帰処理が完了すると元の状態に戻すことができます。製造元に よっては、このモードを組み合わせた機能、たとえば IBM Thinkpad では RediSafe と呼ばれるような機能が用意されている場合もあります。この機能は ACPI の S4 ステートと呼ばれる機能に対応しています。 Linux ではディスクへのサスペンドはカーネルルーチンが実施する仕組みに なっており、 ACPI とは別途の実装になっています。

バッテリーモニタ

ACPI はバッテリーの充電状態をチェックし、その情報を提供します。また、 残り容量が限界に達した場合の処理を行なうこともできます。

自動電源 OFF

シャットダウンに続いてコンピュータの電源を切ることができる機能です。これは 特に、バッテリーの容量が完全になくなる前に自動でシャットダウンを行なうような 場合に重要です。

プロセッサの速度制御

CPU については、 3 種類の異なる方法で省電力を実現することができます: 周波数と電圧の制御 (PowerNow!Speedstep として知られているもの), プロセッサに対する減速指定, スリープの指定 (C-ステート) があります。 コンピュータの動作モードによって、これらの方法を組み合わせることもできます。

23.2. Advanced Configuration and Power Interface (ACPI)

ACPI はオペレーティングシステムに対して個別のハードウエアコンポーネントを 設定し制御できるようにした仕組みです。また、 ACPI は Plug and Play (PnP) と Advanced Power Management (APM) に取って代わるもので、バッテリーや AC 電源、温度、冷却ファン、 ノート PC の蓋を閉じた 情報や バッテリーの残り容量が少ない など、システムイベント情報を 配信することができます。

BIOS では、個別のコンポーネントやハードウエアへのアクセス方法に関する情報を 含んだ一覧表を提供しています。オペレーティングシステムは、この情報を利用して 割り込みの割り当てやコンポーネントの有効化/無効化を設定します。 ACPI では オペレーティングシステムが BIOS 内に保存してあるコマンドを実行するため、 ACPI の機能は BIOS の実装に依存することになります。 ACPI が検出したり 読み込んだりすることができる表については、 /var/log/boot.msg にレポートが書き込まれます。 また、 ACPI の問題に対してトラブルシューティングを行なうには、 23.2.2項 「トラブルシューティング」 をお読みください。

23.2.1. CPU 性能の制御

CPU の省電力制御には 3 種類の方法があります:

  • 周波数と電圧の調整

  • クロック周波数の低減 (T-ステート)

  • プロセッサに対するスリープ状態への移行 (C-ステート)

コンピュータの動作モードにも依存しますが、これらの方法は組み合わせて使用する ことができます。また、省電力によってシステムの発熱を抑え、頻繁に冷却ファンが 動作したりしないようにする効果もあります。

周波数の制御と減速は、プロセッサが何も作業を行なっていない場合には最も経済的な C-ステートが適用されるため、何らかの作業を行なっている場合にのみ効果があります。 CPU が何らかの作業を行なっている場合は、省電力の実現にあたっては周波数の制御が お勧めです。プロセッサに対しては間欠的な負荷が与えられることがしばしばあるため、 周波数を下げることができるという仕組みです。通常、動的な周波数制御はオンデマンド の制御方法でカーネルが行なうのがベストです。

周波数の減速は、高い負荷にもかかわらずバッテリーの動作時間を延ばしたい場合などの 最終手段として利用すべきものです。しかしながら、システムによっては減速時に滑らか に動作しないこともあります。また、 CPU の減速は CPU が遅すぎる場合には意味を なさなくなります。

より詳しい情報については、 第11章 電源管理 (↑システム分析とチューニングガイド) をお読みください。

23.2.2. トラブルシューティング

電源管理周りの問題としては、 2 種類のものが考えられます。 1 つはカーネル側の ACPI コードにバグが存在していて、正しく認識されない問題です。この場合、解決 方法をダウンロードとして提供することができます。また、場合によっては BIOS 側 の原因で発生する場合もあります。また、他のよく使われているオペレーティング システムでエラーが発生しないようにするため、わざと BIOS 側の実装を ACPI 仕様から 逸脱させてエラーを回避している場合もあります。それ以外にも、 ACPI 実装に深刻な エラーが存在するようなハードウエアコンポーネントは、 Linux カーネル側で ブラックリストとして ACPI が動作しないようにもしています。

問題を発見したときに最初にやるべきことは、 BIOS を新しいものに更新することです。 それでも全く起動できない場合は、下記の起動パラメータを設定することで回避できる 場合があります:

pci=noacpi

PCI デバイスの設定について ACPI を使用しないようにします。

acpi=ht

シンプルなリソース設定だけを行ない、その他の目的では ACPI を 使用しないようにします。

acpi=off

ACPI を無効に設定します。

[Warning]ACPI 無しでの起動問題

新しいマシン (特にマルチプロセッサシステムや AMD 64 システム) によっては、 ハードウエアを正しく設定するのに ACPI が必要である場合があります。 このような場合は、 ACPI を無効に設定すると何らかの問題が発生します。

また、 USB や FireWire のハードウエアが接続されているマシンでは、マシン側が 混乱してうまく起動しない場合があります。うまく起動できない場合は、不要な ハードウエアを全て取り外してから再度起動を行なってみてください。

起動後は、 dmesg | grep -2i acpi コマンドを利用して起動メッセージを確認してください。 ACPI 以外の原因で発生して いる場合も考えられますので、メッセージ全てを確認してもかまいません。 ACPI テーブルを処理する際にエラーが発生した場合は、最も重要な DSDT (Differentiated System Description Table) テーブルを 改善版に置き換えることができます。これを行なうことで、問題のある BIOS 側の DSDT を無視することができます。手順については 23.4.1項 「ハードウエア側で ACPI が有効化されているのにうまく動作しない場合」 をお読みください。

カーネルの設定では、 ACPI デバッグメッセージを有効化するためのスイッチが存在 しています。カーネル側の ACPI デバッグ機能がコンパイルされていてインストール されている場合は、知識のあるユーザがエラーの原因を探るための情報を得ることが できます。

BIOS やハードウエアの問題に直面した場合は、製造元に尋ねるのがお勧めです。 特に製造元が Linux に対する支援を提供しない場合は、彼らにその問題点を提示して 解決してもらう必要があります。製造元は、 Linux を使用するユーザがある程度の 数以上存在すれば、その問題を深刻なものとしてとらえることでしょう。

23.2.2.1. さらなる情報

23.3. ハードディスクの休止

Linux では、不要であればハードディスクを完全にスリープ状態に移行させることも できるほか、省電力や静音モードに移行させることもできます。新しいラップトップ であれば、不要な時に自動で省電力や静音のモードに切り替わるため、ハードディスクの 電源を手作業で切ったりする必要はありません。しかしながら、最大限の省電力を実現 したい場合は、 hdparm コマンドを利用する下記の方法を試してみる ことをお勧めします。

このコマンドは様々なハードディスクの設定を行なうことができます。たとえば -y オプションを指定すると、 指定したハードディスクをすぐにスタンバイモードに移行することができます。 また、 -Y オプションではスリープ状態に移行することができます。 それ以外にも、 hdparm -S x コマンドでは、 一定時間の無動作でディスクの回転を止める設定を行なうことができます。 x の値はそれぞれ下記のように設定してください: 0 を設定すると機能を無効にし、常に回転し続けるようになります。 1 から 240 の値を指定すると、それぞれ 5 を掛けた値の秒数を指定したことになります。また、 241 から 251 の値を指定すると、それぞれ 30 分を単位として 1 から 11 倍の 時間を指定したことになります。

ハードディスク内部の省電力オプションを制御するには、 -B オプションを設定します。 0 から 255 までの値を設定し、小さければ小さいほど省電力を設定し、大きければ大きいほど性能を 上げる指定になります。この値は使用するハードディスクに依存するため、具体的に どれだけの省電力になるのかは不明です。ハードディスクの動作音を低くしたい場合は、 -M を設定してください。それぞれ 128 から 254 までの値で設定します。小さい値ほど静かになります。

ハードディスクをスリープ状態に移行させるのは簡単ではありません。 Linux では 様々なプロセスがハードディスクへの書き込みを行なうため、スリープを設定したと しても頻繁にスリープを解除させられる結果になります。そのため、 Linux が ハードディスクに書き込む必要のあるデータをどのように取り扱うのかについては、 知っておくことが重要です。何よりもまず、全てのデータは RAM 内にあるバッファ に保存されます。このバッファは pdflush デーモンが監視し、データが 置かれてから一定の時間が経過するか、もしくは一定量まで使用されると、バッファの 中身がハードディスクに書き込まれます。バッファサイズは動的に変化し、搭載されている メモリ量とシステムの負荷に依存して変動します。既定では pdflush は最大限の 整合性保持のため、短い時間間隔に設定されています。既定では、 5 秒おきに バッファが確認され、ハードディスクにデータが書き込まれます。それぞれ下記の 値で調整することができます:

/proc/sys/vm/dirty_writeback_centisecs

pdflush のスレッドが起動するまでの遅延時間 (1/100 秒単位)

/proc/sys/vm/dirty_expire_centisecs

ディスクに書き込むべきデータについて、メモリ上に待機させる時間を 指定します。既定は 3000 で、 30 秒を意味します。

/proc/sys/vm/dirty_background_ratio

pdflush がディスクに書き込むべきデータをメモリ上に保持する最大 割合を指定します。既定値は 5% です。

/proc/sys/vm/dirty_ratio

メモリ上に存在するディスクに書き込むべきデータと全体メモリ量の比較で、 この値を上回った場合は、そのプロセスに対してバッファへの書き込みを 継続させずにディスクへの書き込みを行なわせるようにします。

[Warning]データの整合性の損傷

pdflush デーモンの設定を変更すると、データの整合性が損なわれることがあります。

これらのプロセスとは別に、 ReiserFS, Ext3, Ext4 などのジャーナリング機能 付きのファイルシステムでは、 pdflush とは独立したメタデータの書き込みを行なう 機能が備わっています。そのため、これらのファイルシステムを利用することによって、 ハードディスクの回転停止が阻害される場合もあります。このような問題を回避する には、モバイルデバイス向けの特別なカーネル拡張を利用する必要があります。詳しくは laptop-mode-tools パッケージを インストールし、 /usr/src/linux/Documentation/laptops/laptop-mode.txt ファイルをお読みください。

また、それ以外にも動作中のプログラムがどのように振る舞うのかについても注意を 払う必要があります。たとえば気の利いたエディタであれば、現在編集中のファイル について、隠しファイルを利用した定期的なバックアップを行なっていたりすることが あります。このような動作があると、ハードディスクが定期的に動き出す結果になって しまいます。データの整合性は犠牲になりますが、省電力を求める際には、 このような機能は無効化しておくのがよいでしょう。

また、これに関連してメールデーモンである postfix には、 POSTFIX_LAPTOP という変数が存在しています。この 値を yes に設定すると、ハードディスクに対して頻繁に アクセスしたりしないようになります。

23.4. トラブルシューティング

全てのエラーメッセージと警告は、 /var/log/messages ファイルに書き込まれます。本章ではよく発生する問題について記述しています。

23.4.1. ハードウエア側で ACPI が有効化されているのにうまく動作しない場合

ACPI について何らかの問題に直面した場合は、 dmesg コマンドの 出力から ACPI 固有のメッセージを検索してください。たとえば、 dmesg|grep -i acpi のように実行します。

また、問題を解決するには BIOS の更新が必要となる場合もあります。お使いのラップトップ の製造元 Web ページをご覧になり、 BIOS の更新版がないかどうかをご確認ください。 また、最新の ACPI 仕様に準拠しているかどうかも合わせてご確認ください。 BIOS を 交しかしても問題が解決しない場合は、下記の手順で問題のある BIOS 内の DSDT テーブル を更新してください:

手順23.1 BIOS 内の DSDT テーブルの更新

下記の手順を実行する前に、必要なパッケージがインストールされていることをご確認 ください。 kernel-source, acpica, mkinitrd の各パッケージが必要です。

  1. お使いのシステムに対応した DSDT を、 http://acpi.sourceforge.net/dsdt/index.php から ダウンロードします。ファイルが圧縮されている場合はそれを展開してください。 ファイルの拡張子が .aml (ACPI マシン言語) になっている 場合は手順 3 に移動してください。それ以外の場合は、次の手順を実施してください。

  2. ダウンロードしたテーブルのファイル拡張子が .asl (ACPI ソース言語) である場合は、下記のコマンドでコンパイルを行なってください。

    iasl -sa file.asl
  3. ファイル DSDT.aml を任意の場所 (/etc/DSDT.aml がお勧めです) にコピーします。

  4. /etc/sysconfig/kernel を編集し、 DSDT ファイルの パスを指定します。

  5. あとは mkinitrd コマンドを実行して initrd を作成すれば 完了です。新しいカーネルをインストールした場合は、mkinitrd コマンドを実行すると initrd が作成され、変更済みの DSDT が統合されてシステム起動時に読み込まれるようになります。

23.4.2. CPU の周波数制御がうまく働かない場合

カーネルのソースコードを参照し、お使いのプロセッサに対応しているかどうかを確認 してください。また、 CPU の周波数制御を働かせるためには特別なカーネルモジュールや モジュールオプションが必要になる場合もあります。 kernel-source パッケージがインストール されている場合、これらの情報は /usr/src/linux/Documentation/cpu-freq/* にあります。

23.4.3. サスペンドやスタンバイがうまく働かない場合

ACPI システムでは、誤った DSDT 実装 (BIOS) によってサスペンドやスタンバイに 問題が発生する場合があります。このような場合は、 BIOS を更新してください。

また、システムが不具合のあるモジュールの読み込みを解除する際には、システムが 停止してしまったり、サスペンドのイベントが動作しなかったりする場合があります。 同じようなことは、サスペンドを妨害するサービスを停止する際にも発生する場合が あります。いずれの場合とも、スリープモードへの移行を妨害しているものを調べて ください。ログファイル /var/log/pm-suspend.log には、 何が行なわれているのかを示す情報と、考えられるエラー情報がそれぞれ記載されて います。また、サスペンドやスタンバイに移行する前に読み込みを解除しておきたい モジュールがある場合は、 /usr/lib/pm-utils/defaults ファイル内の SUSPEND_MODULES 変数に設定を行なって ください。

なお、サスペンドとそこからの復帰処理について変更を行なうための方法は、 http://ja.opensuse.org/Pm-utils (日本語) または http://old-en.opensuse.org/Pm-utils (英語) 、および http://ja.opensuse.org/S2ram (日本語) または http://ja.opensuse.org/SDB:Suspend_to_RAM (日本語) をお読みください。

23.5. さらなる情報


openSUSE リファレンス 13.1