ここ数年、ラップトップバッテリーの容量と寿命は非常に向上しました。 それにもかかわらず、近代的なプロセッサは、古いものよりはるかに多くのエネルギーを消費します。 そして、それぞれのラップトップ世代はエネルギーに飢えているより多くの装置を取り入れています。 それが電力管理がこれまで以上に重要である理由です。 バッテリー駆動時間を増加させるということは、必ずしも別のバッテリーを買うことを意味するというわけではありません。 賢い電力管理ポリシーを適用すれば多くを達成できます。
このガイドではラップトップの電力管理を説明していると言うことに注意してください。 いくらかの章はサーバにも適用できるかもしれませんが、その他は適用できず障害を引き起こすことさえもあるでしょう。 もしあなたが何をしているのか本当に知らないのならこのガイドの何もかもをサーバに適用しないでください。
このガイドはかなり長いので、ここでは方針を探す手だてとなる短いあらましを説明します。
必要条件の章では以下の装置の個々の部分のどれかが働く前に満たされるべきであるいくつかの必要条件に関して話します。 これはユーザが所有するBIOS設定、カーネル構成、およびいくつかの簡素化を含んでいます。 その後の3つの章では、通常ほとんどのエネルギーを消費する装置(プロセッサ、ディスプレイ、ハードディスク)に焦点を合わせます。 それぞれは別々に設定できます。 CPU電力管理では、性能を落とし過ぎることなく、エネルギーの最大値を抑えるためにプロセッサの周波数を調整する方法を示します。 あなたのハードドライブがしばしば不必要に働くのを防ぐ、いくつかの異なったトリックがディスク電力管理(良い副作用として騒音レベルの減少)で示されます。 その他のデバイスの電力管理では、(かなり実験的な)スリープ状態についての記述がある一方で、デバイスセクションの最後でWireless LANとUSBに関するいくつかの注意点があります。 最後に、トラブルシューティングは一般的な落とし穴を記載します。
図 1.1: それぞれの部品の電力量 |
![]() |
ほとんど全ての部品が異なった状態で動作することができます。いくつか挙げるとするなら、その状態はオフ、スリープ、アイドル、アクティブがあり、それぞれエネルギー消費量が異なります。 大部分はLCDディスプレイ、CPU、チップセット、そしてハードドライブで消費されています。 しばしばこれらはBIOSでOSとは独立した電力管理が有効にできます。しかし、さまざまな状況に合わせたOSでの賢い設定により、より良い性能を達成することができます。
個々の装置のパワーマネージメント機能を意識した詳細について議論する前に、確かに必要条件が満たされているか確認してください。 BIOS設定を制御した後に、いくつかのカーネルオプションを有効にします。 これらは、要するにACPIと、スリープ状態とCPU周波数調整です。 節電はたいてい性能の損失か待ち時間の増加をもたらすので、バッテリーで作動するときだけ、それらを有効にするべきです。 それには新しいランレベルであるbatteryが役に立ちます。
まずBIOSの電力管理設定を見てみましょう。 最も良いのはBIOSとOSのポリシーを組み合わせることですが、さしあたってBIOS部分の多くを無効にするのがよいでしょう。 これはあなたのポリシーを妨げないようにするためです。 全てを終えた後にもう一度BIOSの設定を確認することを忘れないでください。
/etc/make.confでacpi USEフラグが設定されているかを確認してください。 あなたのシステムに関係すると思われる他のUSEフラグには、apm、lm_sensors、nforce2、nvidia、pmuがあります。 詳しくは/usr/portage/profiles/use*.descを参照してください。 これらのフラグの1つを設定し忘れたのなら、emergeの--newuseフラグを使って影響するパッケージを再コンパイルすることが出来ます。 man 1 emergeを参照してください。
カーネルのACPI (高度設定と電力インターフェース)サポートは未だ作業が進行中です。 最近のカーネルを使うことはそれを最大限に活用できることを意味しています。
Portageには異なるカーネルソースが存在します。 gentoo-sourcesもしくはsuspend2-sourcesの使用を推奨します。 後者はSoftware Suspend 2のパッチを含んでいます。 詳しくはスリープ状態に関する章を参照してください。 カーネルを設定する際には、少なくともこれらのオプションを有効にします。
コード表示 2.1: 電力管理の最小カーネル設定(Kernel 2.6) |
Power Management Options --->
[*] Power Management Support
[ ] Software Suspend
ACPI( Advanced Configuration and Power Interface ) Support --->
[*] ACPI Support
[ ] Sleep States
[ ] /proc/acpi/sleep (deprecated)
[*] AC Adapter
[*] Battery
<M> Button
<M> Video
[ ] Generic Hotkey
<M> Fan
<M> Processor
<M> Thermal Zone
< > ASUS/Medion Laptop Extras
< > IBM ThinkPad Laptop Extras
< > Toshiba Laptop Extras
(0) Disable ACPI for systems before Jan 1st this year
[ ] Debug Statements
[*] Power Management Timer Support
< > ACPI0004,PNP0A05 and PNP0A06 Container Driver (EXPERIMENTAL)
CPU Frequency Scaling --->
[*] CPU Frequency scaling
[ ] Enable CPUfreq debugging
< > CPU frequency translation statistics
[ ] CPU frequency translation statistics details
Default CPUFreq governor (userspace)
<*> 'performance' governor
<*> 'powersave' governor
<*> 'ondemand' cpufreq policy governor
<*> 'conservative' cpufreq governor
<*> CPU frequency table helpers
<M> ACPI Processor P-States driver
<*> CPUFreq driver for your processor
|
ソフトウェアサスペンド、スリープ状態(以下を参照)を有効にするかはあなた自身で決めてください。 ASUS、Medion、IBM Thinkpad、Toshibaのラップトップを持っているなら適当な部分を有効にしてください。
あなたのプロセッサの上でCPU周波数調整を可能にする方法を、カーネルに知らせる必要があります。 それぞれのタイプのCPUには異なったインタフェースがあるので、プロセッサ用の正しいドライバーを選ばなければなりません。 ここで注意してください。 例えば、Pentium MでIntel Pentium 4 clock modulationを有効にすると、システムは不安定になるでしょう。 どれを選べばよいのか分からなければ、カーネルドキュメントを参照してください。
カーネルをコンパイルし、正しいモジュールが起動時に読み込まれるようにし、新しいACPIが有効なカーネルで起動します。 次にemerge sys-power/acpidを実行してacpiデーモンを入手します。 これはACからバッテリーに切り替えたりふたを閉じたりと言った出来事を知らせる物です。 モジュールをカーネル内部にコンパイルしなかった場合には、そのモジュールがロードされていることを確認してください。また、/etc/init.d/acpid startを実行してacpidを起動させてください。 rc-update add acpid defaultを実行して起動時に読み込まれるようにします。 すぐにどのようにして使われるか分かるでしょう。
コード表示 2.2: acpidのインストール |
# emerge sys-power/acpid # /etc/init.d/acpid start # rc-update add acpid default |
デフォルトポリシーは電力管理がバッテリーで実行中の時にのみ有効になります。 ACとバッテリーを切り替えるためには、電力管理の全てのスクリプトの起動と停止を受け持つbatteryランレベルを作成します。
注意: 他のランレベルを持つのは好きでないならこの章を飛ばしても差し支え有りません。 しかし、この章を飛ばすと設定は少し難しくなるでしょう。 次の章ではbatteryランレベルが存在すると仮定しているからです。 |
コード表示 2.3: batteryランレベルの作成 |
# cd /etc/runlevels # cp -a default battery |
これでお終いです。 新しいランレベルであるbatteryはdefaultと同じようにすべてを含みますが、未だお互いを自動的に切り替える方法がありません。 それを変更しましょう。
典型的なACPIイベントはふたを閉じたり、電源供給源の変更、そしてスリープボタンを押したと言うことでしょう。 重要なイベントは、ランレベルを変更する電源の変更です。 小さなスクリプトがこのお世話をします。
まず、電源供給源によってランレベルをdefaultとbatteryのそれぞれに切り替えるスクリプトが必要です。 スクリプトはsys-power/powermgmt-baseが提供するon_ac_powerコマンドを使用します。 システムにパッケージがインストールされているかを確認してください。
コード表示 2.4: powermgt-baseのインストール |
# emerge powermgmt-base
|
これで、シェル上でon_ac_power && echo AC available || echo Running on batteriesを実行することにより、電源供給源を決定することが出来るようになりました。 以下のスクリプトはランレベルの変更を行います。 /etc/acpi/actions/pmg_switch_runlevel.shと言うファイル名で保存します。
コード表示 2.5: /etc/acpi/actions/pmg_switch_runlevel.sh |
#!/bin/bash # ここから設定 RUNLEVEL_AC="default" RUNLEVEL_BATTERY="battery" # 設定ここまで if [ ! -d "/etc/runlevels/${RUNLEVEL_AC}" ] then logger "${0}: Runlevel ${RUNLEVEL_AC} does not exist. Aborting." exit 1 fi if [ ! -d "/etc/runlevels/${RUNLEVEL_BATTERY}" ] then logger "${0}: Runlevel ${RUNLEVEL_BATTERY} does not exist. Aborting." exit 1 fi if on_ac_power then if [[ "$(cat /var/lib/init.d/softlevel)" != "${RUNLEVEL_AC}" ]] then logger "Switching to ${RUNLEVEL_AC} runlevel" /sbin/rc ${RUNLEVEL_AC} fi elif [[ "$(cat /var/lib/init.d/softlevel)" != "${RUNLEVEL_BATTERY}" ]] then logger "Switching to ${RUNLEVEL_BATTERY} runlevel" /sbin/rc ${RUNLEVEL_BATTERY} fi |
スクリプトを実行可能にするためにchmod +x /etc/acpi/actions/pmg_switch_runlevel.shを忘れずに実行してください。 最後に行う必要があることは、電源供給源が変更される度にスクリプトを呼び出すことです。 これは、acpidの助けを借りてACPIイベントをとらえることで行えます。 まず、電源供給源が変更されるときに、どのイベントが作成されるかを知る必要があります。 多くのラップトップではac_adapterとbatteryが呼ばれますが、あなたのでは異なるかもしれません。
コード表示 2.6: 電源供給源変更のACPIイベントを知る |
# tail -f /var/log/acpid | grep "received event"
|
上記のコマンドを実行し、電源ケーブルを抜いてください。 以下のような表示が出力されるでしょう。
コード表示 2.7: 電源供給源変更の出力例 |
[Tue Sep 20 17:39:06 2005] received event "ac_adapter AC 00000080 00000000" [Tue Sep 20 17:39:06 2005] received event "battery BAT0 00000080 00000001" |
重要な部分はreceived eventの後の引用部分です。 これはこれから作成するファイルのイベント行と一致します。 システムが複数のイベントを作成したりいつも同じであってもあわてないでください。 イベントが作成される限りは、ランレベルの変更は動作します。
コード表示 2.8: /etc/acpi/events/pmg_ac_adapter |
# "ac_adapter"をラップトップが作成したイベントに変更します # たとえば、ac_adapter.*はac_adapter AC 00000080 00000000と一致します event=ac_adapter.* action=/etc/acpi/actions/pmg_switch_runlevel.sh %e |
コード表示 2.9: /etc/acpi/events/pmg_battery |
# "battery"をラップトップが作成したイベントに変更します # たとえば、battery.*はbattery BAT0 00000080 00000001と一致します event=battery.* action=/etc/acpi/actions/pmg_switch_runlevel.sh %e |
最後に、変更を認識できるようにacpidを再起動します。
コード表示 2.10: acpidを用いたランレベル切り替えの終了 |
# /etc/init.d/acpid restart
|
ACプラグを抜き差しして"Switching to AC mode"や"Switching to battery mode"のメッセージが表示されるかsyslogを確認してください。 スクリプトが電源を正しく認識できない場合はトラブルシューティングの章を読んでください。
イベントメカニズムの特性のために、ACまたはバッテリーの状態にかかわらずdefaultランレベルで起動するでしょう。 これはACで稼働する際にはよいですが、そうでなければbatteryランレベルで起動したいです。 解決方法の1つはブートローダーにsoftlevel=battery変数を含む別のエントリーを追加することですが、それを選ぶことを忘れてしまうことがありそうです。 良い方法は起動過程の最後でACPIイベントをだまし、pmg_switch_runlevel.shスクリプトにランレベルの変更が必要か決めさせることです。 お気に入りのエディターで/etc/conf.d/local.startを開き、これらの行を追加します。
コード表示 2.11: local.startを編集し起動時にランレベルを調整する |
# バッテリーで起動中にacpiイベントをだましランレベルを切り替える
/etc/acpi/actions/pmg_switch_runlevel.sh "battery/battery"
|
この様に準備したら個々のデバイスの電力管理ポリシーを有効にしていきます。
モバイルプロセッサは異なる周波数で稼働することが出来ます。 電圧の変更も行える物もあります。 多くの場合、CPUは全速力で稼働する必要はなく、速度を抑えることはしばしばパフォーマンスを減少させることなく多くの電力を節約することになります。
CPU周波数調整にはいくつかの専門用語が伴います。 これは簡単な紹介です。
まず、カーネルはプロセッサの周波数を変えることができなければなりません。 CPUfreq processor driverはあなたのCPUでそれを行うコマンドを知っています。 したがって、あなたのカーネルで正しいものを選ぶことが重要です。 これは既に上で行いました。 カーネルはどのように周波数を変更するかを知ったあとで、どの周波数を設定するべきかを知る必要があります。 これはCPUfreq policyとgovernorから成るpolicyによって行われます。 CPUfreq policyは周波数の範囲を定義する2つの番号です。それはつまり、最小と最大周波数のことです。 governorは、最小と最大周波数の間にある有効な周波数のうちどれを選んだらよいかを決めます。 例えば、powersave governorはいつも利用可能な最低周波数を選択し、performance governorは最高の周波数を選択します。 userspace governorは何も決まっていませんが、ユーザ(またはユーザスペースのプログラム)が望むものなら何でも設定できます。 また、この値は/sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeedから読み込まれます。
これは動的な周波数の変更のようではありませんし、事実、それはそうではありません。 しかしながら、様々なアプローチで動的な変更を行うことができます。 例えば、ondemand governorは現在のCPU負荷によって決定します。 同じことがcpudyn、cpufreqd、powernowd、そしてその他たくさんのツールによって行うことができます。 ACPIイベントを、電源に関連した動的周波数変更を有効にするか無効にするかといったことに使用することができます。
CPU速度と電力の減少には2つの利点があります。 1つは少ないエネルギー消費で、もう一方がシステムが最高速で動作するほど発熱しないと言うことです。 最も大きな欠点はパフォーマンスが明らかに低下することです。 プロセッサ速度の減少はパフォーマンスと引き替えにエネルギー消費を抑えることになります。
注意: 全てのラップトップが周波数調整をサポートしているわけではありません。 もし確実でないなら、サポートされているかをトラブルシューティングのサポート済みプロセッサリストで確認してください。 |
ではCPU周波数の変更が動作するかを試してみましょう。 デバッグにとても便利な別のツールをインストールします。 sys-power/cpufrequtilsがそれです。
コード表示 3.1: CPU周波数の確認 |
emerge cpufrequtils cpufreq-info |
以下が出力例です。
コード表示 3.2: cpufreq-infoからの出力例 |
cpufrequtils 0.3: cpufreq-info (C) Dominik Brodowski 2004
Report errors and bugs to linux@brodo.de, please.
analyzing CPU 0:
driver: centrino
CPUs which need to switch frequency at the same time: 0
hardware limits: 600 MHz - 1.40 GHz
available frequency steps: 600 MHz, 800 MHz, 1000 MHz, 1.20 GHz, 1.40 GHz
available cpufreq governors: conservative, ondemand, powersave, userspace, performance
current policy: frequency should be within 924 MHz and 1.40 GHz.
The governor "performance" may decide which speed to use
within this range.
current CPU frequency is 1.40 GHz.
|
ではcpufreq-setで周波数の変更が動作するか確認しましょう。 例えば、cpufreq-set -g ondemandを実行してondemand governorを有効にし、cpufreq-infoで変更を確認します。 期待通りの動作をしなければ、このガイドの最後にあるトラブルシューティングの章で手がかりを見つけられるかもしれません。
上記はかなり良いですが、日常生活においては行いがたいです。 システムが適当な周波数を自動で設定するようにする方がよいでしょう。 これを行うための多くの異なるアプローチがあります。 以下の表は、あなたがそれらの1つを決める助けになる簡単な概観です。 これは大まかに3つのカテゴリーに分類されます。 kernelはカーネルのサポートのみが必要な方法で、daemonはバックグラウンドで動作するプログラム、そしてgraphicalは設定と変更を容易にするGUIを提供するプログラムです。
| 名称 | カテゴリー | 変更の判断 | Kernel governors | Further governors | コメント |
| 'ondemand' governor | Kernel | CPU負荷 | N.A. | N.A. | CPUが高負荷時には最高周波数を選択し、CPUがアイドル時には段階的に速度を落とす。 /sys/devices/system/cpu/cpu0/cpufreq/ondemand/にあるファイルで更に調整する。 governorによる変更や同様の機能が必要なら、ユーザーランドツール(プログラム、スクリプト)が必要。 |
| 'conservative' governor | Kernel | CPU負荷 | N.A. | N.A. | ondemand governorと違い、conversativeはCPUが高負荷時に最高周波数まで一気に行かず、段階的に周波数を上げていきます。 /sys/devices/system/cpu/cpu0/cpufreq/ondemand/にあるファイルで更に調整する。 governorによる変更や同じようなものが必要なら、ユーザーランドツール(プログラム、スクリプト)が必要。 |
| cpudyn | Daemon | CPU負荷 | Performance、powersave | Dynamic | ディスクスタンバイもサポート。ほとんどの場合laptop modeがより良く動作することに注意。 |
| cpufreqd | Daemon | バッテリー状態、CPU負荷、温度、実行中のプログラム、その他 | 全て利用可能 | None | 洗練された(だがやや複雑な)セットアップ。 センサーモニタ(lm_sensors)やNVidiaベースのグラフィックカードメモリとコアとの調和のようなプラグインを使った拡張。 cpufreqdはSMPに対応しており、稼働中でも状況に応じて手動で制御することが可能。 |
| powernowd | Daemon | CPU負荷 | 無し | Passive、sine、aggressive | SMPをサポート。 |
| ncpufreqd | Daemon | 温度 | 無し | Powersave、performance | システム温度により、使用されるgovernorをperformanceとpowersaveの間で切り替える。 熱問題で有名なラップトップにはとても便利。 |
| speedfreq | Daemon | CPU負荷 | 無し | Dynamic、powersave、performance、fixed speed | すばらしいクライアント/サーバのインタフェースを持つことによる設定の簡便さ。2.6カーネルが必要。 メンテされておらず、壊れているためPortageから除去。 まだ使用しているのならcpufreqdへ乗り換えてください。 |
| gtk-cpuspeedy | Graphical | 無し | 無し | 無し | CPU周波数を手動で設定するグラフィカルツールであるGnomeアプリケーション。 これは少しの自動化も提供しません。 |
| klaptopdaemon | Graphical | バッテリー状態 | 全て利用可能 | 無し | KDE専用で、動的周波数調整には'ondemand' governorが必要。 |
現在の負荷に応じて周波数を調整することは一見簡単に思えますが、それはそのような単純な作業ではありません。 悪いアルゴリズムは、常に二つの周波数を切替え続けることになったり、不必要に高いレベルに周波数を設定したときにはエネルギーの無駄になったります。
どれを選ぶべきでしょうか?もし何も考えがなければ、まずcpufreqdを試してください。
コード表示 3.3: cpufreqdのインストール |
# emerge cpufreqd
|
cpufreqdは/etc/cpufreqd.confを編集することで設定できます。 cpufreqdとともにインストールされるデフォルトの物はやや紛らわしいです。 Gentoo開発者であるHenrik Brix Andersen(以下を参照)のものに置き換えることを推奨します。 cpufreqd-2.0.0以降が必要だと言うことに注意してください。 以前のバージョンは設定ファイルに異なる構文を使用します。
コード表示 3.4: /etc/cpufreqd.conf (cpufreqd-2.0.0以降) |
[General] pidfile=/var/run/cpufreqd.pid poll_interval=3 enable_plugins=acpi_ac, acpi_battery enable_remote=1 remote_group=wheel verbosity=5 [/General] [Profile] name=ondemand minfreq=0% maxfreq=100% policy=ondemand [/Profile] [Profile] name=conservative minfreq=0% maxfreq=100% policy=conservative [/Profile] [Profile] name=powersave minfreq=0% maxfreq=100% policy=powersave [/Profile] [Profile] name=performance minfreq=0% maxfreq=100% policy=performance [/Profile] [Rule] name=battery ac=off profile=conservative [/Rule] [Rule] name=battery_low ac=off battery_interval=0-10 profile=powersave [/Rule] [Rule] name=ac ac=on profile=ondemand [/Rule] |
ではcpufreqdデーモンを起動しましょう。 defaultとbatteryランレベルに追加してください。
コード表示 3.5: cpufreqdの起動 |
# rc-update add cpufreqd default battery # rc |
時々、デーモンが選ぶのとは別のポリシーを選択することが望ましいことがあります。 例えば、バッテリー電力が少ないが、ACがすぐに利用可能になると知っているときなどです。 この場合、cpufreqd-set manualでcpufreqdの手動モードを起動し、設定済みのポリシー(cpufreqd-getで表示されます)の1つを選択します。 cpufreqd-set dynamicを実行することで手動モードを終了することが出来ます。
警告: 上記プログラムを同時に複数起動しないでください。 2つの周波数を常時切り替え続けるといった混乱が発生します。 |
確認する最後のことは新しいポリシーが良く動作しているかです。 簡単な方法はラップトップで作業をしている時にCPU速度を監視することです。
コード表示 3.6: CPU速度を監視 |
# watch grep "cpu MHz" /proc/cpuinfo
|
もし/proc/cpuinfoが更新されない(トラブルシューティングを参照)なら、以下のようにCPU周波数を監視します。
コード表示 3.7: CPU速度監視の代替手段 |
# watch x86info -mhz
|
設定に応じて、CPU速度は高負荷時には増加し、アクティブでなければ減少し、もしくは単に同レベルを維持するはずです。 cpufreqdを使用していてcpufreqd.confでverbosityを5以上に設定していれば、何が起こったのかに関する追加情報がsyslogに報告されます。
図 1.1で見たように、LCDディスプレイは電力の大部分(モバイル用でないCPUでは違うかもしれません)を消費します。 したがって必要でないときにディスプレイの電気を切るだけではなく、可能ならばバックライトを減少させることもとても重要になります。 ほとんどのラップトップではバックライトの明るさを調整できます。
最初に確認することはディスプレイのスタンバイ/サスペンド/オフのタイミングです。 これはあなたのウィンドウマネージャーと深く関わっているので、自分自身で設定できるように説明していきます。 2つの一般的な方法があります: setterm -blank <number-of-minutesM>、setterm -powersave on、そしてsetterm -powerdown <number-of-minutesM>でターミナルをオフにできます。 X.orgでは、/etc/X11/xorg.confを以下のように編集します。
コード表示 4.1: X.orgとXFree86でのLCDサスペンド設定 |
Section "ServerLayout" Identifier [...] [...] Option "BlankTime" "5" # 5分後にスクリーンの表示をなくす (Fake) Option "StandbyTime" "10" # 10分後にスクリーンを切る (DPMS) Option "SuspendTime" "20" # 20分後に完全にサスペンドにする Option "OffTime" "30" # 30分後に電気を切る [...] EndSection [...] Section "Monitor" Identifier [...] Option "DPMS" "true" [...] EndSection |
XFree86と/etc/X11/XF86Configでも同じです。
もしかするとより重要なことはバックライトの輝度を落とすことかもしれません。 ツールを使って輝度を落とす設定を行える権限をもっているのなら、batteryモードでバックライトを輝度を落とす小さなスクリプトを書き、batteryランレベルにおいてください。 以下のスクリプトは多くのIBM ThinkpadとToshibaのラップトップで動作します。 カーネルで適切なオプションを有効にしてください(IBM Thinkpadsのみ)。 Toshibaのラップトップでは、app-laptop/acpitoolをインストールし、以下に記されているibm_acpiの設定をとばして下さい。
警告: ibm-acpiでは、明るさの設定のサポートは実験と記されています。 これはハードウェアに直接アクセスするので、システムに甚大な損傷を引き起こすかもしれません。 ibm-acpi websiteを読んでください。 |
明るさレベルを設定するために、ibm_acpiモジュールをexperimental引数をつけて読み込まなければなりません。
コード表示 4.2: ibm_acpiモジュールの自動読み込み |
(実行前に、上記の警告を読んでください!) # echo "options ibm_acpi experimental=1" >> /etc/modules.d/ibm_acpi # /sbin/modules-update # echo ibm_acpi >> /etc/modules.autoload.d/kernel-2.6 # modprobe ibm_acpi |
これは問題なく動作し、モジュールの読み込み後に/proc/acpi/ibm/brightnessと言うファイルが作成されるでしょう。 initスクリプトが電源供給源によって明るさを変更します。
コード表示 4.3: /etc/conf.d/lcd-brightness |
# 利用可能な値は/proc/acpi/ibm/brightnessを見てください # /usr/src/linux/Documentation/ibm-acpi.txtを読んでください # ACモードでの明るさレベルです。デフォルトでは7です。 BRIGHTNESS_AC=7 # バッテリーモードでの明るさレベルです。デフォルトでは4です。 BRIGHTNESS_BATTERY=4 |
コード表示 4.4: /etc/init.d/lcd-brightness |
#!/sbin/runscript
set_brightness() {
if on_ac_power
then
LEVEL=${BRIGHTNESS_AC:-7}
else
LEVEL=${BRIGHTNESS_BATTERY:-4}
fi
if [ -f /proc/acpi/ibm/brightness ]
then
ebegin "Setting LCD brightness"
echo "level ${LEVEL}" > /proc/acpi/ibm/brightness
eend $?
elif [[ -e /usr/bin/acpitool && -n $(acpitool -T | grep "LCD brightness") ]]
then
ebegin "Setting LCD brightness"
acpitool -l $LEVEL >/dev/null || ewarn "Unable to set lcd brightness"
eend $?
else
ewarn "Setting LCD brightness is not supported."
ewarn "For IBM Thinkpads, check that ibm_acpi is loaded into the kernel"
ewarn "For Toshiba laptops, you've got to install app-laptop/acpitool"
fi
}
start() {
set_brightness
}
stop () {
set_brightness
}
|
完了したら、明るさが自動で調整されるように、batteryランレベルへ追加します。
コード表示 4.5: 明るさ自動調節の有効化 |
# chmod +x /etc/init.d/lcd-brightness # rc-update add lcd-brightness battery # rc |
ハードディスクはスリープモードではほとんど電力を消費しません。 そのため、一定時間ハードディスクが使用されていないときにはいつでも、節電機能を有効にすることは意味があります。 これを行うための2つの異なる方法を紹介します。 まず、laptop-modeモードは、いくつかの方法を使って多くの電力を節約しますが、その方法は、書き込み抑制や、最低でも書き込み遅延があります。 欠点は、書き込みの遅延による電力停止やカーネルクラッシュによるデータの消失です。 これを回避したいなら、ハードディスクに頻繁に書き込む処理を無くしてください。 その後、2つめの方法として、hdparmを使ったハードディスクの節電機能を有効にすることが出来ます。
最近のカーネル(2.6.6以上、最近の2.4の物もしくはパッチを当てたその他)にはいわゆるlaptop-modeが含まれています。 これを有効にすると、呼び出し時や10分後(30秒の代わり)にディスクにダーティーバッファが書かれます。 これはハードディスクがスピンアップに要する時間を最小限にします。
コード表示 5.1: laptop-modeの自動起動 |
# emerge laptop-mode-tools
|
laptop-mode-toolsの設定ファイルは/etc/laptop-mode/laptop-mode.confにあります。 豊富なコメントに従い、好みに調整してください。 rc-update add laptop_mode batteryを実行して自動起動します。
1.11以降の最近のバージョンのlaptop-mode-toolsには、lm-profilerという新しいツールが含まれています。 これはシステムのディスク使用率と実行中のネットワークサービスを監視し、不要な物を無効にすることを提案します。 組み込みのランレベルをサポートしているlaptop-mode-toolsを使って無効にする(Gentooの/sbin/rcが実行されることで元に戻りますが)か、defaultやbatteryというランレベルを使用して無効にすることが出来ます(後者を推奨)。
コード表示 5.2: 実行中のlm-profilerからの出力例 |
# lm-profiler Profiling session started. Time remaining: 600 seconds [4296896.602000] amarokapp Time remaining: 599 seconds [4296897.714000] sort [4296897.970000] mv Time remaining: 598 seconds Time remaining: 597 seconds [4296900.482000] reiserfs/0 |
システムを10分間観察した後、lm-profilerは時間内にディスクアクセスを行ったサービスの一覧を表示します。
コード表示 5.3: lm-profilerがいくつかのサービスの無効化を提案 |
Program: "atd" Reason: standard recommendation (program may not be running) Init script: /etc/init.d/atd (GUESSED) Do you want to disable this service in battery mode? [y/N]: n |
上記の例でatdを提案通り無効にするために、rc-update del atd batteryを実行します。 システムの正常動作に必要なサービスを無効にしないよう注意してください。 lm-profilerはいくつか明らかに間違った物を作成する可能性があります。 必要かどうか不確かなサービスを無効にしないで下さい。
laptop-modeを使用したくないのなら、ディスクに頻繁に書き込むサービスを無効にするために特別な措置を執らなければなりません。 例えば、syslogdは良い候補です。 もしかすると完全に終了したくないのかもしれませんが、「不要な」ものが記録されないように設定ファイルを修正することができ、そうすることでディスクトラフィックを減らします。 cupsはディスクに定期的に書き込むので、終了して必要なときにのみ手動で有効にすることを考慮してください。
コード表示 5.4: cupsをバッテリーモードで無効化 |
# rc-update del cupsd battery
|
laptop-mode-toolsのlm-profiler(上記参照)を使って無効にするサービスを探すことも出来ます。 それらすべてを取り除いたら、hdparmの設定に進みます。
2つめの方法は小さなスクリプトとhdparmを使用することです。 laptop-modeを使用しているのならこれをとばしてください。 そうでなければ、/etc/init.d/pmg_hdaを作成します。
コード表示 5.5: ディスクスタンバイにhdparmを使用する |
#!/sbin/runscript
depend() {
after hdparm
}
start() {
ebegin "Activating Power Management for Hard Drives"
hdparm -q -S12 /dev/hda
eend $?
}
stop () {
ebegin "Deactivating Power Management for Hard Drives"
hdparm -q -S253 /dev/hda
eend $?
}
|
オプションについてはman hdparmを見てください。 スクリプトの準備が整ったら、batteryランレベルに追加します。
コード表示 5.6: 自動ディスクスタンバイ設定 |
# chmod +x /etc/init.d/pmg_hda # /sbin/depscan.sh # rc-update add pmg_hda battery |
重要: ハードディスクのスリープ/スピンダウン設定は注意してください。 小さな値に設定すると、ドライブを酷使することで消耗させたり、保証の対象外になったりするかもしれません。 |
他の方法はバッテリーモードではスワップの利用をやめることです。 swapon/swapoffを切り替える前に、十分なRAMがありスワップがそんなに使われないことを確認してください。 そうしなければ大きな問題が起こるでしょう。
laptop-modeを使いたくなければ、あるディレクトリをtmpfsとしてマウントすることで、ディスクアクセスを最小にすることができます。 書き込みアクセスはディスクではなくメインメモリに保管され、マウント解除時に失われます。 しばしば/tmpをこの様にマウントするのは有用です。 ディスクまたはRAMにマウントされたか否かに関係なく、再起動時にクリアされるので、特別な注意を払う必要はないです。 十分なRAMが搭載されていて/tmpを異常に消費するプログラム(ダウンロードクライアントや圧縮ユーティリティ)がないようにしてください。 これを有効にするには、カーネルがtmpfsをサポートするようにして/etc/fstabをこの様に編集します:
コード表示 5.7: /tmpがより揮発性が高くなるように/etc/fstabを編集 |
none /tmp tmpfs size=32m 0 0 |
警告: サイズパラメータに注意してシステムに合うよう変更してください。 よく分からなければ、これを試さないでください。 これは簡単にパフォーマンスの障害となり得ます。 /var/logをこの様にマウントしたければ、マウント解除時にログファイルをmergeするようにしてください。 これらは絶対必要です。 /var/tmpをこの様にマウントしないでください。 Portageがコンパイルのために使うからです。 |
PowerPlay(GPU(グラフィックプロセッサユニット)の動作クロックの動的変更機能)をサポートするATIグラフィックカードを使用している場合、X.orgでこの機能を有効にすることが出来ます。 /etc/X11/xorg.confを開き、DeviceセクションでDynamicClocksを追加(または有効)します。 この機能はいくつかのシステムでクラッシュを引き起こす可能性があると言うことに注意してください。
コード表示 6.1: X.orgでATI PowerPlayサポートを有効にする |
Section "Device" [...] Option "DynamicClocks" "on" EndSection |
無線LANカードはかなり多くの電力を消費します。 pmg_hdaスクリプトの用に電力管理モードに置きましょう。
注意: このスクリプトは無線インタフェースがwlan0であると仮定します。 これを実際のインタフェースに置き換えてください。 |
コード表示 6.2: 無線LAN電力管理の自動化 |
#!/sbin/runscript
start() {
ebegin "Activating Power Management for Wireless LAN"
iwconfig wlan0 power on
eend $?
}
stop () {
ebegin "Deactivating Power Management for Wireless LAN"
iwconfig wlan0 power off
eend $?
}
|
スクリプトを開始するとwlan0で省電力機能が有効になります。 /etc/init.d/pmg_wlan0に保存し、ディスクスクリプトと同じようにbatteryランレベルに追加します。 詳細やwakeupの感覚やタイムアウト設定と言ったオプションはman iwconfigを参照してください。 ドライバーとアクセスポイントがビーコン時間の変更をサポートしているなら、これはより多くの電力を削減する良いきっかけです。
コード表示 6.3: 無線LAN用の電力管理 |
# chmod +x /etc/init.d/pmg_wlan0 # /sbin/depscan.sh # rc-update add pmg_wlan0 battery |
電力消費に関してUSB装置に関する2つの問題があります。 まず最初に、USBマウス、デジタルカメラまたはUSBスティックのようなデバイスはプラグに差し込まれている間、電力を消費します。 これは避けることができません(ですが、必要とない場合にはそれらを取り除いてください)。 2つめに、プラグを差し込まれたUSBデバイスがあるとき、USBホストコントローラはCPUがスリープモードに入るのを妨げるように順番にバスに定期的にアクセスします。 カーネルは、ドライバの呼び出しや/sysにあるpower/stateファイルを通して、USBデバイスのサスペンドを有効にする実験的なオプションを提供します。
コード表示 6.4: カーネルでUSBサスペンドサポートを有効にする |
Device Drivers
USB support
[*] Support for Host-side USB
[*] USB suspend/resume (EXPERIMENTAL)
|
7. スリープ状態: ディスクのスリープ、スタンバイ、サスペンド
ACPIは異なったスリープ状態を定義します。 最も重要な物は
これらはシステムが使用中ではない場合にはいつも呼び出されますが、シャットダウンは起動に長い時間がかかるので望ましくありません。
ACPIはこれらスリープ状態をそれ相応の理由によって実験的としてサポートしています。 APMスリープ状態はより安定していますが、APMとACPIを一緒には利用できません。
コード表示 7.1: 様々なサスペンドタイプのためのカーネル設定 |
Power Management Options --->
[*] Power Management support
ACPI (Advanced Configuration and Power Interface) Support --->
[*] ACPI Support
[*] Sleep States
|
カーネルが適切に設定されたら、サスペンドやスリープモードを有効にするためにhibernate-scriptを使用します。 まずはインストールしましょう。
コード表示 7.2: hibernate-scriptのインストール |
# emerge hibernate-script
|
いくつかの設定を/etc/hibernateで行う必要があります。 初期設定で、パッケージはhibernate.confとram.confという2つの設定ファイルをインストールします。
スリープの設定をするために、/etc/hibernateのram.confを編集します。 UseSysfsPowerState memがすでに正しく設定されていますが、設定ファイルの残りへ進み、システムにあわせて設定しなければなりません。 コメントとオプション名が道しるべとなるでしょう。 ネットワーク上でnfsやsamba共有を使用しているのなら、タイムアウトを避けるために適切なinitスクリプトを終了してください。
準備は良いですか? これがコマンドを実行する前にデータをバックアップしておく最後のチャンスです。 スリープ状態から復帰するために、Fnといった特殊キーを押す必要があるかもしれないと言うことに注意してください。
コード表示 7.3: スリープの呼び出し |
# hibernate-ram
|
これを読み続けているのなら、動作しているようです。 ram.confをstandby.confにコピーし、/usr/sbin/hibernateを指す/usr/sbin/hibernate-standbyというシンボリックリンクを作成することで、スタンバイ(S1)を設定することも出来ます。 S3とS4は、より多くの電力を節約するという、より興味深いスリープ状態です。
この章ではハイバネーションを紹介します。 これは、電源を切る前に実行中のシステムのスナップショットをディスクに保存する物です。 復帰時には、スナップショットが読み込まれ、ハイバネーションを呼び出すまさに直前から作業を行うことが出来ます。
警告: サスペンド中にホットプラグ出来ないハードウェアを交換しないでください。 スナップショットを、作成したカーネル以外のカーネルで読み込もうとしないでください。 ハイバネーションを行う前に、すべてのNFSまたはsambaサーバ/クライアントを終了してください。 |
S4のための2つの実装があります。 オリジナルのものがswsuspです。 そして、より良いインタフェース(fbsplashサポートを含んでいる)を持っているsuspend2があります。 suspend2 Homepageに機能比較があります。 これらはswsuspから分岐したSuspend-to-Disk (pmdisk)で使用されますが、これは統合されました。
suspend2はまだ主流のカーネルに含まれていないので、suspend2.netが提供するパッチをカーネルソースに適用するか、sys-kernel/suspend2-sourcesを使用する必要があります。
カーネルのswuspとsuspend2の部分を以下のようにします。
コード表示 7.4: 様々なサスペンドタイプのためのカーネル設定 |
Power Management Options ---> (swsuspを使ったハイバネーション) [*] Software Suspend (/dev/SWAPをswapパーティションに置き換える) (/dev/SWAP) Default resume partition (suspend2を使ったハイバネーション) Software Suspend 2 --- Image Storage (you need at least one writer) [*] File Writer [*] Swap Writer --- General Options [*] LZF image compression (/dev/SWAPをswapパーティションに置き換える) (swap:/dev/SWAP) Default resume device name [ ] Allow Keep Image Mode |
swsuspの設定はかなり簡単です。 カーネル設定でswapパーティションの場所を設定していなければ、resume=/dev/SWAPという変数で渡すことも出来ます。 イメージの破損により起動が出来なければ、noresumeというカーネル変数を使用します。 hibernate-cleanup initスクリプトは起動中にswsuspイメージを無効にします。
コード表示 7.5: 起動中にswsuspイメージを無効にする |
# rc-update add hibernate-cleanup boot
|
swsuspを使ったハイバネーションを有効にするために、ハイバネーションスクリプトを使用します。 そして、/etc/hibernate/hibernate.confにUseSysfsPowerState diskを設定します。
警告: これを行う前にデータをバックアップしてください。 コマンドを実行する前に、syncを実行し、キャッシュされているデータをディスクに書き込んでください。 まずX外で試し、その後Xを起動させますが、ログインしないでください。 |
uhciまたは類似するものが原因でカーネルパニックを経験したなら、モジュールとしてUSBサポートをコンパイルして、あなたのラップトップをスリープモードにする前に、モジュールを解除するようにしてください。 hibernate.confに、このための設定オプションがあります。
コード表示 7.6: swsuspを使ったハイバネーション |
# nano -w /etc/hibernate.conf (データのバックアップを取ってください) # hibernate |
以下の部分では、サスペンドや復帰中の素晴らしいグラフィカルプログレスバーであるfbsplashのサポートを含んだ、suspend2の設定について説明します。
設定の最初の部分は、swsuspの設定と似ています。 カーネル設定でswapパーティションの場所を設定していなければ、resume2=swap:/dev/SWAPという変数で渡すことも出来ます。 イメージの破損により起動が出来なければ、noresume2という変数を追加します。 hibernate-cleanup initスクリプトは起動中にsuspend2イメージを無効にします。
コード表示 7.7: 起動中にsuspend2イメージを無効にする |
# rc-update add hibernate-cleanup boot
|
では/etc/hibernate/hibernate.confを編集し、suspend2の部分を有効にし、sysfs_power_stateとacpi_sleepの部分をすべてコメントアウトします。 グローバルオプションのfbsplash部分はまだ有効にしないで下さい。
コード表示 7.8: suspend2を使ったハイバネーション |
# nano -w /etc/hibernate.conf (データのバックアップを取ってください) # hibernate |
まだ行っていないのであれば、fbsplashの設定を今行ってください。 ハイバネーション中にfbsplashサポートを有効にするために、sys-apps/suspend2-useruiパッケージが必要です。 それに加え、fbsplash USEフラグを有効にする必要があります。
コード表示 7.9: suspend2-useruiのインストール |
# mkdir -p /etc/portage # echo sys-apps/suspend2-userui fbsplash >> /etc/portage/package.use # emerge suspend2-userui |
ebuildは、使用したいテーマへのシンボリックリンクを作成するよう伝えます。 例えば、livecd-2005.1テーマを使用するには、以下のコマンドを実行します。
コード表示 7.10: ハイバネーション中にlivecd-2005.1テーマを使用する |
# ln -sfn /etc/splash/livecd-2005.1 /etc/splash/suspend2
|
復帰過程の最初の部分で暗い画面にしたくないのなら、initrdイメージにsuspend2ui_fbsplashツールを追加する必要があります。 splash_geninitramfsでinitrdイメージを作成し、/boot/fbsplash-emergence-1024x768と保存したと、仮定すると、以下が行うべき事です。
コード表示 7.11: initrdイメージにsuspend2ui_fbsplashを追加 |
# mount /boot # mkdir ~/initrd.d # cp /boot/fbsplash-emergence-1024x768 ~/initrd.d/ # cd ~/initrd.d # gunzip -c fbsplash-emergence-1024x768 | cpio -idm --quiet -H newc # rm fbsplash-emergence-1024x768 # cp /usr/sbin/suspend2ui_fbsplash sbin/ # find . | cpio --quiet --dereference -o -H newc | gzip -9 > /boot/fbsplash-suspend2-emergence-1024x768 |
その後、suspend2カーネルが/boot/fbsplash-suspend2-emergence-1024x768をinitrdイメージとして使用するように、grub.confやlilo.confを調整します。 すべてが正しく設定されたかを確認するために、予行演習を行うことが出来ます。
コード表示 7.12: fbsplashハイバネーションの試験運用 |
# suspend2ui_fbsplash -t
|
その後、/etc/hibernate/hibernate.confを再び開き、fbsplashオプションを有効にします。 hibernateを実行して楽しんでください。
Q: CPU周波数を変更しようとしましたが、/sys/devices/system/cpu/cpu0/cpufreq/scaling_governorがありませんでした。
A: プロセッサがCPU周波数の調整をサポートしていて、プロセッサ用の正しいCPUFreqドライバーを選ぶようにしてください。 これがcpufreq(カーネル2.6.7)によってサポートされているプロセッサのリストです。ARM Integrator、ARM-SA1100、 ARM-SA1110、AMD Elan - SC400、SC410、AMD mobile K6-2+、AMD mobile K6-3+、AMD mobile Duron、AMD mobile Athlon、AMD Opteron、AMD Athlon 64、Cyrix Media GXm、 同じチップセットのIntel mobile PIIIとIntel mobile PIII-M、Intel Pentium 4、 Intel Xeon、Intel Pentium M (Centrino)、National Semiconductors Geode GX、 Transmeta Crusoe、VIA Cyrix 3 / C3、UltraSPARC-III、SuperH SH-3、SH-4、 "PowerBook"や"iBook2"やACPI 2.0互換システム("ACPI Processor Performance States"がACPI/BIOSインターフェースに存在する場合のみ)の様々なプロセッサ。
Q: 私のラップトップは周波数の調整をサポートしていますが、/sys/devices/system/cpu/cpu0/cpufreq/が空っぽです。
A: ACPI関連のエラーメッセージをdmesg | grep ACPIで見てください。 BIOSの更新を試してください(特にDSDTの破損が報告された場合)。 自分で直すこともできます。(このガイドの範囲外です)
Q: 私のラップトップは周波数の調整をサポートしていますが、/proc/cpuinfoによると速度は全く更新されていません。
A: もしかするとカーネルでsymmetric multiprocessing support(CONFIG_SMP)を有効にしたのかもしれません。 これを無効にすれば動作するでしょう。 古いカーネルにはこれを引き起こすバグがあります。 その場合、emerge x86infoを実行し、指示されたようにカーネルの更新を行ってから、現在の周波数をx86info -mhzで確認します。
Q: CPU周波数の変更はできますが、他のOSほど幅が広くありません。
A: 最小周波数をより下げるために、周波数調整とACPIスロットルを結合すること ができます。 スロットルは大きな省電力を得るわけではなく主に温度管理(ラップトップを涼しく静かにする)に使われると言うことに気をつけてください。 現在のスロット状態はcat /proc/acpi/processor/CPU/throttlingで見ることができ、echo -n "0:x" > /proc/acpi/processor/CPU/limitで変更できます。 xは/proc/acpi/processor/CPU/throttlingに載っているTx状態のうちの1つです。
Q: カーネルを設定している時に、powersave、performance、そしてuserspace governorが表示されましたが、ondemandのものが見つかりません。どこにあるのですか?
A: ondemand governorは最近のカーネルソースにのみ含まれます。更新してみてください。
Q: バッテリーの駆動時間が前よりも悪くなったみたいです。
A: BIOSの設定を確認してください。 もしかするといくつかの設定を再度有効にし忘れたのかもしれません。
Q: バッテリーを充電しましたが、KDEは0%だと報告してすぐに終了してしまいます。
A: バッテリーサポートがカーネル内にコンパイルされているか確認してください。 モジュールとして使っているなら、モジュールを読み込んでください。
Q: システムロガーが以下のような報告を行いました。"logger: ACPI group battery / action battery is not defined"
A: このメッセージは、acpidとともにインストールされる/etc/acpi/default.shスクリプトによって作成されます。 無視してもかまいません。 取り除きたいのなら、以下に示されているように/etc/acpi/default.shの適切な行をコメントアウトすることが出来ます。
コード表示 8.1: 不明なacpiイベントに関する警告を無効化 |
*) # logger "ACPI action $action is not defined"
|
Q: Dell Inspiron 51XXを使っていますが何のACPIイベントも起きません。
A: カーネルのバグの様です。これを読んでください。
Q: xorg.confでDynamicClocksを有効にし、X.orgがクラッシュ/スクリーンが黒いまま/ラップトップが正常終了しません。
A: これはいくつかのシステムで発生します。DynamicClocksを無効にしてください。
Q: suspend2を使いたいのですが、swapパーティションが小さすぎると言われます。リサイズは選択肢にありません。
A: システムに十分な空き容量があるのなら、swapwriterの代わりにfilewriterを使用することが出来ます。 hibernate-scriptはこれに対応しています。 より詳しい情報は/usr/src/linux/Documentation/power/suspend2.txtにあります。
Q: 新しいバッテリーを買いましたが、数分しか持ちません!何を間違えたのでしょうか?
A: まずバッテリーの製造元が指示する正しい充電方法に従ってください。
Q: 上のは助けになりませんでした。では何をすべきでしょうか?
A: 「新品」として売られているうちのいくらかは実際には中古の物です。以下の通りにしてください。
コード表示 8.2: バッテリー状態の確認 |
$ grep capacity /proc/acpi/battery/BAT0/info
design capacity: 47520 mWh
last full capacity: 41830 mWh
|
もし "last full capacity" が設計容量と不思議に異なっていたら、バッテリーが壊れているのかもしれません。 保証を要求してください。
Q: 私の問題は上にはありませんでした。次にどこに行くべきでしょうか。
A: おそれずに私Dennis Nienhüserまで直接連絡してください。 Gentoo Forumsは助けを得るための良い場所です。 IRCが好きなら、irc.freenode.netの#gentoo-laptopチャンネルを試してください。
このドキュメントの内容は Creative Commons - Attribution / Share Alikeライセンスです。