電源管理は特にラップトップ型のコンピュータで重要な機能ですが、それ以外のシステムでも様々な利便性を提供します。現在の全てのコンピュータ (ラップトップやデスクトップ、サーバなど) には ACPI (Advanced Configuration and Power Interface) と呼ばれる電源管理機能が用意されていますが、このような技術にはハードウエア側の対応だけでなく、 BIOS 側のソフトウエアにも対応が必要となります。また、騒音を減らす目的から、 CPU の動作周波数を変更することもできます。
電源管理機能はラップトップ型のコンピュータのみで使用する機能ではなく、デスクトップシステムでも重要な仕組みです。 ACPI の主な機能と用途は下記の通りです:
対応していません。
このモードは、システムの状態を全てメモリ内に書き込んだあと、メモリ以外のシステムをスリープ状態に移行させます。この状態では、コンピュータの消費電力を大幅に削減することができます。このような仕組みにより、システムやアプリケーションを起動し直したりすることなく、利用をすぐに再開できるようになります。この機能は、 ACPI の S3
と呼ばれる状態 (ステート) に対応しています。
この操作モードでは、システムの状態を全てハードディスク内に書き込んで、システムの電源を落とします。必要なデータを全て書き込む必要があることから、少なくとも搭載されているメモリ量と同じサイズのスワップパーティションが必要となります。この状態からの復帰には、 30 秒から 90 秒程度の時間が必要となります。復帰処理が終了することで、サスペンド前の状態に戻ることになります。ハードウエアの製造元によっては、 IBM Thinkpad の RediSafe のように、ハイバネーションとサスペンドを組み合わせた動作モードを提供しているものもあります。この機能は、 ACPI の S4
と呼ばれる状態 (ステート) に対応しています。 Linux では、ディスクへのサスペンドは ACPI ではなく、独自のカーネルルーチンを利用して行います。
mkswap
でフォーマットした場合のスワップパーティションの UUID 更新についてmkswap
でのフォーマットは、できる限り避けておくことをお勧めします。
それは、 mkswap
でフォーマットし直してしまうと、スワップパーティションの
UUID が変更されてしまうためです。その代わりに、 YaST を利用してフォーマットし直す
(YaST では、 UUID が変更されても /etc/fstab
を自動的に
更新します) か、 mkswap
コマンド実行後に手作業で
/etc/fstab
を更新してください。
ACPI ではバッテリーの充電状態などの情報をチェックしています。また、特定の充電量を下回った場合に、何らかの動作を行うこともできます。
シャットダウンの実施後、コンピュータの電源が自動的に切られます。これは特に、バッテリーがほとんど空になってしまったような場合に重要な機能となります。
CPU という観点では、省電力は下記の 3 種類の方法で実現することができます: 周波数と電圧の制御 (PowerNow! や Speedstep として知られた制御方法です) のほか、動作速度の調整やスリープモード (C-ステート) への移行などがあります。コンピュータの動作モードによっては、複数の方式を組み合わせて使用することもできます。
ACPI はオペレーティングシステムから個別のハードウエアコンポーネントを設定し、制御することを目指して設計された仕組みです。 ACPI は Power Management Plug and Play (PnP) と Advanced Power Management (APM) の両方の後継となる仕組みで、バッテリーや AC アダプタ、温度や冷却ファン、システムイベント (たとえば 「ラップトップの蓋を閉じた」 イベントや、 「バッテリーの残り容量が少ない」 などのイベント) を配信することができます。
BIOS 側では、個別のコンポーネントやハードウエアへのアクセス方法に関する情報を含むテーブルを提供しています。オペレーティングシステムはこの情報を利用して、割り込みの割り当てやコンポーネントの有効化/無効化などの処理を行います。オペレーティングシステム側では、 BIOS 内に保存されたコマンドを実行することから、その機能は BIOS 側の実装に依存することになります。 ACPI が検出して読み込むテーブルは、 journald 内に記録されます。ジャーナルログメッセージを表示する方法について、詳しくは 第11章 「journalctl
: systemd
ジャーナルへの問い合わせコマンド」 をお読みください。また、 ACPI で発生する様々な問題の解決方法については、 29.2.2項 「トラブルシューティング」 をお読みください。
CPU は下記の 3 種類の方法で、消費電力を削減することができます:
周波数と電圧の制御
クロック周波数の低減 (T-ステート)
プロセッサに対するスリープモードへの移行 (C-ステート)
コンピュータの動作モードによっては、これらの方式を組み合わせて使用することもできます。省電力を実現することによって、システムの発熱を抑えたり、冷却ファンの動作を抑えたりすることにも繋がります。
周波数の制御と動作速度の調整は、プロセッサが処理中の間にのみ影響があります。なぜなら、プロセッサの処理が空いた状態になると、最も省電力の C-ステートが適用されるためです。 CPU の処理が多い場合は、周波数制御を行うことで省電力を実現することができます。ただし、多くの場合、プロセッサに対しては間欠的な負荷になりますので、より低い周波数に設定するため、カーネルが提供するオンデマンドガバナーを利用して動的に制御するのが最適です。
動作速度の調整は最後の手段として使われるべきものです。たとえば、システムの負荷が高いにもかかわらず、バッテリーの動作時間を延ばしたい場合などがそれにあたります。動作速度を低くしすぎると、システムによってはうまく動作しなくなってしまうこともあるほか、それ以上速度に低くできなくなってしまう場合もあります。
より詳しい情報については、 第12章 「電源管理」 をお読みください。
ACPI 関連で発生する問題には、 2 種類のものがあります。 1 つには、カーネル内の ACPI 関連のコードにバグがあって、開発時に見つけられなかったものがあります。この場合は、ダウンロードで解決方法を提供することができます。もう 1 つは BIOS によって引き起こされる問題があります。こちらのほうがより頻繁に発生することになりますが、 ACPI 仕様から外れた実装が BIOS 内に存在していて、これによってオペレーティングシステム側をエラーに導いてしまうものがあります。なお、 ACPI 実装内に深刻なエラーがあるハードウエアコンポーネントが検出されると、 Linux カーネル側でこれらに対する ACPI を使用しないようにするため、ブラックリストを記録することもあります。
ACPI に関して何らかの問題が見つかった場合、最初に試すべきことは BIOS の更新です。コンピュータが起動しないような場合は、下記のいずれかのパラメータを指定することで、問題を回避できる場合もあります:
PCI デバイスを設定する際に ACPI を使用しないようにします。
シンプルなリソース設定のみを実施します。その他の目的では ACPI を使用しないようにします。
ACPI を無効化します。
新しいマシン (特に SMP システムや AMD64 システム) では、ハードウエアを正しく設定するために ACPI が必要となります。これらのシステムで ACPI を無効化すると、逆に問題を引き起こす場合があります。
また、マシンに対して USB や FireWire のデバイスが接続されていると、ハードウエアの認識がうまくいかなくなる場合があります。マシンが起動しない場合は、不要なハードウエアを全て取り外してから、起動をお試しください。
まずはシステムの起動後に dmesg -T
| grep -2i acpi
を実行して、システムの起動メッセージをご確認ください。最も重要なテーブルである ACPI テーブル (DSDT ( Differentiated System Description Table )) を処理する際にエラーが発生した場合は、改善版に置き換えることもできます。この場合は、 BIOS 側に書かれている DSDT が無視されます。詳しい流れについては、 29.4項 「トラブルシューティング」 をお読みください。
カーネル側を設定することで、 ACPI デバッグメッセージを出力するように設定することもできます。 ACPI デバッグ機能をコンパイルしてインストールすることで、詳細な情報が出力されるようになります。
BIOS やハードウエア関連の問題に直面した場合は、まず製造元に連絡してみることをお勧めします。 Linux の場合は十分な支援を受けられない場合もありますが、問題の解決は彼らが行うべきものであるためです。 Linux を利用するユーザがそれなりの規模になれば、製造元も問題に真剣に対応することになるでしょう。
https://tldp.org/HOWTO/ACPI-HOWTO/ (詳細な ACPI HOWTO のほか、 DSDT パッチなども含まれています)
http://www.acpi.info (Advanced Configuration & Power Interface Specification に関する情報)
Linux では、ハードディスクが不要であればスリープ状態に設定することができるほか、より経済的で静かなモードで動作させることもできます。新しいラップトップ機であれば、ハードディスクが不要になると自動的に省電力モードに移行しますので、手作業でハードディスクの電源を切る必要はありません。ただし、最大限に省電力を実現したい場合は、 hdparm
コマンドを利用して試してみることをお勧めします。
このコマンドは、様々なハードディスク設定を変更することができます。 -y
オプションを指定すると、ハードディスクを即時にスタンバイモードに移行するよう指示します。 -Y
を指定すると、スリープモードに移行することもできます。また、 hdparm
-S
X のように実行すると、指定した時間だけハードディスクへのアクセスが行われなくなると、自動的に回転を停止させることもできます。ここでの X は、それぞれ下記のような意味があります: 0
を指定すると、回転を停止せずに動作し続ける意味になります。 1
から 240
までの値を指定すると、その値に 5 [秒] を掛けた時間、 241
から 251
までの値を指定すると、 30 分から 30 分の 11 倍までの時間、アクセスがなくなると回転を停止する意味になります。
ハードディスク内部の省電力オプションは、 -B
オプションで制御することができます。 0
(最も省電力) から 255
(最大の性能) までの値で指定します。設定の硬貨はハードディスクによって異なりますので、一概に測定できるものではないことに注意してください。また、ハードディスクの騒音を抑えたい場合は、 -M
オプションを指定してください。こちらは 128
(最も静音) から 254
(最も高速) までの値を指定することができます。
環境によっては、ハードディスクをスリープ状態に置くのは容易ではないことがあります。 Linux では様々なプロセスがハードディスクを利用するため、頻繁にスリープが解除されることになります。そのため、 Linux がハードディスクにデータを書き込む頻度について、あらかじめ知っておく必要があります。まず全てのデータはメモリ内にバッファされますが、このバッファは pdflush
デーモンが監視しています。特定の時間期限もしくは一定量を超過すると、バッファの内容をハードディスクに書き込みます。バッファサイズは動的に設定され、搭載されているメモリ量とシステムの負荷に依存して決まります。既定では pdflush は 5 秒おきにバッファを確認して、必要であると判断すればハードディスクにデータを書き込みます。このほかにも、下記の設定値が提供されています:
/proc/sys/vm/dirty_writeback_centisecs
pdflush スレッドを起動するまでの時間遅延を設定します (100 分の 1 秒単位) 。
/proc/sys/vm/dirty_expire_centisecs
書き込むべきページが書き込まれるまでの最大の時間間隔を設定します。既定値は 3000
で、 30 秒の意味になります。
/proc/sys/vm/dirty_background_ratio
pdflush が書き込みを行うまでの、書き込むべきページの最大割合を指定します。既定値は 5
% です。
/proc/sys/vm/dirty_ratio
搭載されているメモリ量に対して、この割合以上に書き込むべきページが溜まった場合、書き込みを続ける前にそれらのページを書き込むよう強制する割合を指定します。
pdflush
デーモンの設定を変更すると、データの整合性が失われてしまう危険性があります。
これらのプロセスとは別に、 Btrfs
, Ext3
, Ext4
などのジャーナル機能のあるファイルシステムでは、 pdflush
とは別にメタデータを個別に書き込みます。これによってハードディスクの回転停止が阻害されることがあります。 この問題を回避するため、モバイルデバイス向けの特別なカーネル拡張が開発されています。この拡張を利用するには、 laptop-mode-tools
パッケージをインストールのうえ、/usr/src/linux/Documentation/laptops/laptop-mode.txt
を読んで設定を行ってください。
もう 1 つの重要な要素として、動作中のプログラムの存在にもご注意ください。たとえば有用なエディタでは現在編集中のファイルを定期的に書き込むような処理が存在していたりして、定期的にハードディスクを回転させるようにし向けることができます。ただし、このような機能を無効化してしまうと、何らかの不具合が発生した場合に編集中のファイルを取り戻せなくなってしまうリスクが発生します。
また、これに関連して、メールデーモンである postfix には POSTFIX_LAPTOP
という変数が用意されています。この値を yes
にすると、ハードディスクへのアクセスを大きく減らすことができます。
openSUSE Leap では、これらの技術は laptop-mode-tools
が制御します。
全てのエラーメッセージや警告などは、システムのジャーナル内に保存されます。ジャーナルへの問い合わせは journalctl
コマンドを使用します (詳しくは 第11章 「journalctl
: systemd
ジャーナルへの問い合わせコマンド」 をお読みください) 。下記の章では、最もよく発生する問題を説明しています。
まずはカーネルのソースコードを参照して、お使いのプロセッサに対応しているかどうかをご確認ください。また、 CPU の周波数を制御するには、特別なカーネルモジュールやモジュールオプションが必要となる場合もあります。 kernel-source
パッケージをインストールしていれば、 /usr/src/linux/Documentation/cpu-freq/*
内に情報が用意されています。