トップ | GentooJPについて | GentooJPの歩き方 | 各種ドキュメント


電力管理ガイド

  電力管理はラップトップのようなモバイルシステムのバッテリー駆動時間を延ばす鍵です。 このガイドではラップトップで電源管理を設定する方法を記述します。




Contents:
Author : Dennis Nienhüser
翻訳 : 小林弘樹


Updated October 10, 2004




1.初めに

なぜ電力管理? 

ここ数年、ラップトップバッテリーの容量と寿命は非常に向上しました。 それにもかかわらず、近代的なプロセッサは、より古いものよりはるかに多くのエネルギーを消費します。 そして、それぞれのラップトップ世代はエネルギーに飢えているより多くの装置を取り入れています。 それが電力管理がこれまで以上に重要である理由です。 バッテリー駆動時間を増加させるということは、必ずしも別のバッテリーを買うことを意味するというわけではありません。 賢い電力管理ポリシーを適用すれば多くを達成できます。

簡単なあらまし 

このガイドではラップトップの電力管理を説明していると言うことに注意してください。 いくらかの章はサーバにも適用できるかもしれませんが、その他は適用できず障害を引き起こすことさえもあるでしょう。 もしあなたが何をしているのか本当に知らないのならこのガイドの何もかもをサーバに適用しないでください。

このガイドはかなり長いので、ここでは方針を探す手だてとなる短いあらましを説明します。

必要条件の章では以下の装置の個々の部分のどれかが働く前に満たされるべきであるいくつかの必要条件に関して話します。 これはユーザが所有するBIOS設定、カーネル構成、およびいくつかの簡素化を含んでいます。 その後の3つの章では、通常ほとんどのエネルギーを消費する装置(プロセッサ、ディスプレイ、ハードディスク)に焦点を合わせます。 それぞれは別々に設定できます。 CPU電力管理では、性能を落とし過ぎることなく、エネルギーの最大値を抑えるためにプロセッサの周波数を調整する方法を示します。 あなたのハードドライブがしばしば不必要に働くのを防ぐ、いくつかの異なったトリックがディスク電力管理(良い副作用として騒音レベルの減少)で示されます。 その他のデバイスの電力管理では、(かなり実験的な)スリープ状態についての記述がある一方で、デバイスセクションの最後でWireless LANとUSBに関するいくつかの注意点があります。 最後に、トラブルシューティングは一般的な落とし穴を記載します。

それぞれの部品の電力量 

ほとんど全ての部品が異なった状態で動作することができます。いくつか挙げるとするなら、その状態はオフ、スリープ、アイドル、アクティブがあり、それぞれエネルギー消費量が異なります。 大部分はLCDディスプレイ、CPU、チップセット、そしてハードドライブで消費されています。 しばしばこれらはBIOSでOSとは独立した電力管理が有効にできます。しかし、さまざまな状況に合わせたOSでの賢い設定により、より良い性能を達成することができます。

2.必要条件

まず何をするべきか 

個々の装置の電力管理に関する詳細を意識する前に、確かに必要条件が満たされているか確認してください。 BIOS設定を制御した後に、いくつかのカーネルオプションを有効にします。 これらは、要するにACPIと、スリープ状態とCPU周波数調整です。 節電はたいてい性能の損失か待ち時間の増加をもたらすので、バッテリーで作動するときだけ、それらを有効にするべきです。 それには新しいランレベルであるbatteryが役に立ちます。

BIOS部分 

まずBIOSの電力管理設定を見てみましょう。 最も良いのはBIOSとOSのポリシーを組み合わせることですが、さしあたってBIOS部分の多くを無効にするのがよいでしょう。 これはあなたのポリシーを妨げないようにするためです。 全てを終えた後にもう一度BIOSの設定を確認することを忘れないでください。

カーネルの設定 

カーネルのACPI (高度設定と電力インターフェース)サポートは未だ作業が進行中です。 最近のカーネルを使うことはそれを最大限に活用できることを意味しています。

カーネルの設定で、少なくともこれらのオプションを有効にします:

Code listing 2.1: 電力管理の最小カーネル設定(Kernel 2.6)
Power Management Options --->
  [*] Power Management Support
  [ ] Software Suspend
  [ ] Suspend-to-Disk Support

  ACPI( Advanced Configuration and Power Interface ) Support --->
    [*] ACPI Support
    [ ]   Sleep States
    <M>   AC Adapter
    <M>   Battery
    <M>   Button
    <M>   Fan
    <M>   Processor
    <M>     Thermal Zone
    < >   ASUS/Medion Laptop Extras
    < >   Toshiba Laptop Extras
    [ ]   Debug Statements
    
  CPU Frequency Scaling --->
    [*] CPU Frequency scaling
          Default CPUFreq governor (userspace)
    <*>   'performance' governor
    <*>   'powersave' governor
    <*>   CPU frequency table helpers
    <M> ACPI Processor P-States driver
    <*> CPUFreq driver for your processor

ソフトウェアサスペンド、ディスクサスペンド、スリープ状態(以下を参照)を有効にするかはあなた自身で決めてください。 ASUS、Medion、Toshibaのラップトップを持っているなら適当な部分を有効にしてください。

カーネルをコンパイルし、正しいモジュールが起動時に読み込まれるようにし、新しいACPIが有効なカーネルで起動します。 次にemerge sys-apps/acpidを実行してacpiデーモンを入手します。 これはACからバッテリーに切り替えたりふたを閉じたりと言った出来事を知らせる物です。 buttonモジュールをカーネル内部にコンパイルしなかった場合には、そのモジュールがロードされていることを確認してください。また、acpidを/etc/init.d/acpid startで起動させてください。 rc-update add acpid defaultを実行して起動時に読み込まれるようにします。 すぐにどのようにして使われるか分かるでしょう。

Code listing 2.2: acpidのインストール
# emerge sys-apps/acpid
# modprobe button
# /etc/init.d/acpid start
# rc-update add acpid default

"battery"ランレベルの作成 

デフォルトポリシーは電力管理がバッテリーで実行中の時にのみ有効になります。 ACとバッテリーを切り替えるためには、電力管理の全てのスクリプトの起動と停止を受け持つbatteryランレベルを作成します。

Note: 他のランレベルを持つのは好きでないならこの章を飛ばしても差し支え有りません。 しかし、この章を飛ばすと設定は少し難しくなるでしょう。 次の章ではbatteryランレベルが存在すると仮定しているからです。

Code listing 2.3: batteryランレベルの作成
# cd /etc/runlevels
# cp -a default battery

これでお終いです。 新しいランレベルであるbatterydefaultの様に含まれますが、未だお互いを自動的に切り替える方法がありません。 それを変更しましょう。

ACPIイベントに反応する 

典型的なACPIイベントはふたを閉じたり、電源供給源の変更、そしてスリープボタンを押したと言うことでしょう。 カーネルに認識される各々のacpiイベントは/etc/acpi/default.shと呼ばれるacpidに取得されます。 これはランレベルの切り替えをサポートする基本的な修正です。

Code listing 2.4: acpidを用いた、イベント駆動でのランレベル切替え
#!/bin/sh

set $*

group=${1/\/*/}
action=${1/*\//}

# ACモードで使うランレベル
RLVL_AC="default"
# バッテリーモードで使うランレベル
RLVL_BATTERY="battery"

# ACの状態を示すファイル。利用前にファイル名を確認
AC_STATE="/proc/acpi/ac_adapter/AC/state"
# この文字はACで実行中を表す
AC_ON="on-line"
# この文字はバッテリーで実行中を表す
AC_OFF="off-line"

function SwitchRunlevel() {
  if [[ "$(grep ${AC_OFF} ${AC_STATE})" != "" && "$(cat /var/lib/init.d/softlevel)" != "${RLVL_BATTERY}" ]]
  then
    logger "Switching to ${RLVL_BATTERY} runlevel"
    /sbin/rc ${RLVL_BATTERY}
  elif [[ "$(grep ${AC_ON} ${AC_STATE})" != "" && "$(cat /var/lib/init.d/softlevel)" != "${RLVL_AC}" ]]
  then
    logger "Switching to ${RLVL_AC} runlevel"
    /sbin/rc ${RLVL_AC}
  fi
}


case "$group" in
  battery)
    case "$action" in
      battery) 
        SwitchRunlevel
        ;;
      *) 
        logger "ACPI group battery / action $action is not defined"
        ;;
    esac
    ;;

  ac_adapter)
    case "$action" in
      ac_adapter)
        SwitchRunlevel
        ;;
      *)
        logger "ACPI group ac_adapter / action $action is not defined"
        ;;
    esac
    ;;
  *)
    logger "ACPI group $group / action $action is not defined"
    ;;
esac

ACプラグを抜き差しして"Switching to AC mode"や"Switching to battery mode"のメッセージが表示されるかsyslogを確認してください。

イベントメカニズムの特性のために、ACまたはバッテリーの状態にかかわらずdefaultランレベルで起動するでしょう。 ブートローダーにsoftlevel=bootを含む別のエントリーを追加できますが、それを選ぶことを忘れてしまうことがありそうです。 良い方法は起動過程の最後でACPIイベントをだまし、/etc/acpi/default.shスクリプトにランレベルの変更が必要か決めさせることです。 お気に入りのエディターで/etc/conf.d/local.startを開き、これらの行を追加します:

Code listing 2.5: local.startを編集し起動時にランレベルを切り替える
# バッテリーで起動中にacpiイベントをだましランレベルを切り替える
/etc/acpi/default.sh "battery/battery"

この様に準備したら個々のデバイスの電力管理ポリシーを有効にしていきます。

3.CPU電力管理

周波数を手動設定 

CPU速度と電力の減少には2つの利点があります。 1つは少ないエネルギー消費で、もう一方がシステムが最高速で動作するほど発熱しないと言うことです。 最も大きな欠点はパフォーマンスが明らかに低下することです。 プロセッサ速度の減少はパフォーマンスと引き替えにエネルギー消費を抑えることになります。

Note: 全てのラップトップが周波数調整をサポートしているわけではありません。 もし確実でないなら、サポートされているかをトラブルシューティングのサポート済みプロセッサリストで確認してください。

ではCPU周波数の変更が動作するかを試してみましょう。 カーネルのインターフェースに慣れるために、まずは手動でスピードの調整をしましょう。 CPU速度を別の物に設定するには以下のようにします。

Code listing 3.1: CPU速度を手動設定
(現在の周波数を取得)
# grep "cpu MHz" /proc/cpuinfo

(サポートされている周波数の一覧。これは失敗するかもしれない。)
# cd /sys/devices/system/cpu/cpu0/cpufreq/
# cat scaling_available_frequencies

(周波数を1 GHz (1000000 KHz)に変更)
# echo -n userspace > scaling_governor
# echo -n 1000000 > scaling_setspeed

(周波数の変更を確認)
# grep "cpu MHz" /proc/cpuinfo

エラーメッセージが表示されたら、このガイドの終わりにあるトラブルシューティングを参照してください。

scaling_max_freqscaling_min_freqを書いて周波数の限界値を定めることもできます。

Note: いくらかのカーネルでは/proc/cpuinfoの更新に関するバグがあります。 これが変更されてないとしても、必ずしもCPUの周波数が変更されていないことを意味しているわけではありません。 もしこれが起きたなら、emerge x86infoを実行し、現在の周波数をx86info -mhzで確認するようにカーネルを更新します。

自動周波数修正 

上記はかなり良いですが、日常生活においては行いがたいです。 システムが適当な周波数を自動で設定するようにする方がよいでしょう。 これを行うためのいくつかのユーザースペースプログラムがあります。 以下のテーブルはどれを使うかを決める手助けとなる簡単な概要です。

名称 利点 欠点
cpudyn ディスクスタンバイもサポート
cpufreq 洗練されたセットアップが利用可能 セットアップが複雑
speedfreq 小さいが強力
便利なクライアント/サーバインターフェース
カーネル2.6シリーズ専用
powernowd SMPをサポート

現在の負荷に応じて周波数を調整することは一見簡単に思えますが、それはそのような単純な作業ではありません。 悪いアルゴリズムは、常に二つの周波数を切替え続けることになったり、不必要に高いレベルに周波数を設定したときにはエネルギーの無駄になったります。

どれを選ぶべきでしょうか?もし何も考えがなければ、まずspeedfreqを試してください。

Code listing 3.2: speedfreqのインストール
# emerge speedfreq
# rc-update add speedfreq battery

speedfreq/etc/conf.d/speedfreqを編集することで設定できます。 例えば、ユーザーがポリシーを変更できるようにしたいなら、SPEEDFREQ_OPTS=""SPEEDFREQ_OPTS="-u"に修正します。 変更が完了したら、デーモンを起動します。

Code listing 3.3: speedfreqを起動
# /etc/init.d/speedfreq start

cpufreqの設定はちょっと複雑です。

Warning: 上記のプログラムを同時に2つ以上起動しないでください。 常時2つの周波数を切り替えるといった混乱を引き起こします。 speedfreqをインストールしたのなら、今はcpufreqを飛ばしてください。

Code listing 3.4: cpufreqdのインストール
# emerge cpufreqd
# rc-update add cpufreqd battery

cpufreqdはデフォルト設定を/etc/cpufreqd.confに置きます。 必要に応じて設定を変更します。 以下の例ではデフォルトの物よりも省電力になります。もちろんパフォーマンスはより低下しますが。

Code listing 3.5: cpufreqd設定ファイルの例
[General]
pidfile=/var/run/cpufreqd.pid
poll_interval=2
pm_type=acpi
# ACPI代替手段(cpufreqd.conf(5)を参照)を有効にするには以下の行のコメントを解除
# acpi_workaround=1
verbosity=4 #(最小のロギングにしたい時には5に設定)

# 完全なパフォーマンス
[Profile]
name=ac
minfreq=600000
maxfreq=1400000
policy=performance

# 最大省電力
[Profile]
name=battery
minfreq=600000
maxfreq=900000
policy=powersave

# 一定の周波数
[Profile]
name=dvd
minfreq=900000
maxfreq=1100000
policy=powersave

# ACで実行中には最高パフォーマンス
[Rule]
name=ac_on
ac=on
profile=ac

# バッテリー状態が大丈夫ならコンパイルをより高速に
[Rule]
name=compiling
ac=off
battery_interval=30-100
programs=emerge,make,gcc,cpp
cpu_interval=0-100
profile=ac

# DVD鑑賞中は低いCPU周波数で
# ゲームなどにも利用可能
[Rule]
name=dvd_watching
ac=off
battery_interval=15-100
programs=xine,mplayer,avidemux,kaffeine,kmplayer
cpu_interval=0-100
profile=dvd

# 上が当てはまらないなら、最大省電力
[Rule]
name=battery_on
ac=off
battery_interval=0-100
cpu_interval=0-100
profile=battery

cpudynpowernowdspeedfreqと同じようにインストールされます。

確認する最後のことは新しいポリシーが良く動作しているかです。 簡単な方法はラップトップで作業をしている時にCPU速度を監視することです。

Code listing 3.6: CPU速度を監視
# watch -n 1 grep "cpu MHz" /proc/cpuinfo

もし/proc/cpuinfoが更新されない(上を参照)なら、以下のようにCPU周波数を監視します。

Code listing 3.7: CPU速度監視の代替手段
# watch -n 1 x86info -mhz

設定に応じて、CPU速度は重い読み込み時には増加し、アクティブでなければ減少するはずです。

4.LCD電力管理

電力消費 No. 1 

図 1.1で見たように、LCDディスプレイは電力の大部分(モバイル用でないCPUでは違うかもしれません)を消費します。 したがって必要でないときにディスプレイの電気を切るだけではなく、可能ならばバックライトを減少させることもとても重要になります。 ほとんどのラップトップではバックライトの明るさを調整できます。

最初に確認することはディスプレイのスタンバイ/サスペンド/オフのタイミングです。 これはあなたのウィンドウマネージャーと深く関わっているので、自分自身で設定できるように説明していきます。 2つの一般的な方法があります: setterm -blank <number-of-minutesM>setterm -powersave on、そしてsetterm -powerdown <number-of-minutesM>でターミナルをオフにできます。 Xorgでは、/etc/X11/xorg.confを以下のように編集します。

Code listing 4.1: Xorgと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ランレベルに置いてください。

5.ディスク電力管理

アイドル時にスリープ 

必要でない時には、ハードディスクをできるだけすぐにスリープさせるようにしましょう。 これを行うには2つの方法があります。 1つめはcpudynがディスク電力管理をサポートしていることです。 /etc/conf.d/cpudynの"Disk Options"セクションをコメント解除します。 1番目のディスクを60秒間アクティブでなければスリープさせるようにするには、以下のように編集します。

Code listing 5.1: cpudynをディスクのスタンバイに使う
################################################
# DISK OPTIONS
# (disabled by default)
################################################

#
# ディスクをスタンバイモードにするまでの時間(秒で)
#

TIMEOUT=60

#
# 回転を落とすディスクを指定 (コンマで区切る)
#

DISKS=/dev/hda

2つめの方法は小さなスクリプトとhdparmを使うことです。 /etc/init.d/pm.hdaをこの様に作成します。

Code listing 5.2: hdparmをディスクのスタンバイに使う
#!/sbin/runscript
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ランレベルに追加します。

Code listing 5.3: 自動ディスクスタンバイ設定
# /sbin/depscan.sh
# rc-update add pm.hda battery

Important: ハードディスクのスリープ/スピンダウンの設定には注意してください。 小さな値に設定するとドライブをすり減らし、保証をなくすでしょう。

アイドルタイムを増やす - laptop-mode 

最近のカーネル(2.6.6以上、最近の2.4の物もしくはパッチを当てたその他)にはいわゆるlaptop-modeが含まれています。 これを有効にすると、呼び出し時や10分後(30秒の代わり)にディスクにダーティーバッファが書かれます。 これはハードディスクがスピンアップに要する時間を最小限にします。

laptop-modeを開始したり停止するには、/etc/init.d/laptop-modeというスクリプトを作成します。 /usr/src/linux/Documentation/laptop-mode.txtの中に含まれているスクリプトを使うことができます。 準備が整ったら、それが呼び出されるようにします。

Code listing 5.4: laptop-modeの自動起動
# rc-update add laptop-mode battery

Warning: もう一度: ハードディスクのスリープ/スピンダウンの設定には注意してください。 小さな値に設定するとドライブをすり減らし、保証をなくすでしょう。 laptop-mode.txtのドキュメントを読むようにしてください。 バッテリーが電力を使い果たし、データがディスクに書かれる前にlaptop-modeを停止するようにしてください。 さもなければ、少なくとも作業の最後10分を失うことになるでしょう。

その他の技 

できるだけ早くディスクをスリープ状態にすること以外に、ディスクアクセスを最小にするのは良い考えです。 頻繁にディスクに書く処理を見ていきましょう。syslogdは良い候補です。 たぶん完全にそれを止めたいと言うわけではないでしょうが、「不要な」もののログを取らないようにするために設定ファイルを変更することができます。 またその結果、ディスクへのトラフィックを引き起こさなくなります。 cupsは定期的にディスクに書くので、それを停止して、必要な時だけ手動で有効にすることも考慮してください。

Code listing 5.5: バッテリーモードではcupsを無効に
# rc-update del cupsd battery

他の方法はバッテリーモードではスワップの利用をやめることです。 swapon/swapoffを切り替える前に、十分なRAMがありスワップがそんなに使われないことを確認してください。 そうしなければ大きな問題が起こるでしょう。

laptop-modeを使いたくなければ、あるディレクトリをtmpfsとしてマウントすることで、ディスクアクセスを最小にすることができます。 書き込みアクセスはディスクではなくメインメモリに保管され、マウント解除時に失われます。 しばしば/tmpをこの様にマウントするのは有用です。 ディスクまたはRAMにマウントされたか否かに関係なく、再起動時にクリアされるので、特別な注意を払う必要はないです。 十分なRAMが搭載されていて/tmpを異常に消費するプログラム(ダウンロードクライアントや圧縮ユーティリティ)がないようにしてください。 これを有効にするには、カーネルがtmpfsをサポートするようにして/etc/fstabをこの様に編集します:

Code listing 5.6: /tmpがより揮発性が高くなるように/etc/fstabを編集
none  /tmp  tmpfs  size=32m  0 0

Warning: サイズパラメータに注意してシステムに合うよう変更してください。 よく分からなければ、これを試さないでください。 これは簡単にパフォーマンスの障害となり得ます。 /var/logをこの様にマウントしたければ、マウント解除時にログファイルをmergeするようにしてください。 これらは絶対必要です。 /var/tmpをこの様にマウントしないでください。 Portageがコンパイルのために使うからです。

6.その他のデバイスの電力管理

無線電力管理 

無線LANカードはかなり多くの電力を消費します。 pm.hdaスクリプトの用に電力管理モードに置きましょう。

Code listing 6.1: 無線LAN電力管理の自動化
#!/sbin/runscript
start() {
  ebegin "Activating Power Management for Wireless LAN"
  iwconfig wlan0 power on power max period 3
  eend $?
}

stop () {
  ebegin "Deactivating Power Management for Wireless LAN"
  iwconfig wlan0 power off
  eend $?
}

スクリプトを開始するとwlan0が電力管理モードに置かれ、トラフィックが3秒間無ければスリープ状態になります。 /etc/init.d/pm.wlan0に保存し、ディスクスクリプトと同じようにbatteryランレベルに追加します。 詳細とオプションはman iwconfigを参照してください。 ドライバーとアクセスポイントがビーコン時間の変更をサポートしているなら、これはより多くの電力を削減する良いきっかけです。

USB電力管理 

電力消費に関してUSB装置に関する2つの問題があります。 まず最初に、USBマウス、デジタルカメラまたはUSBスティックのようなデバイスはプラグに差し込まれている間、電力を消費します。 これは避けることができません(それにもかかわらず、必要とない場合にはそれらを取り除いてください)。 2つめに、プラグを差し込まれたUSBデバイスがあるとき、USBホストコントローラはCPUがC3/4スリープモードに入るのを妨げるように順番にバスに定期的にアクセスします。 この問題の答えがいわゆる「USB選択サスペンド」ですが、それはカーネルでまだ実装されていません。 USB選択サスペンドはデバイスが使用中であるといけないので、バスアクセスを許可するだけです。 それが実装されるまでの次善策は次のような物です。 モジュールとしてUSBサポートと装置をコンパイルし、それらが使用中でない間(例えば、ふたを閉じるとき)、スクリプトでそれらを取り除いてください。

7.スリープ状態: ディスクのスリープ、スタンバイ、サスペンド

概略 

ACPIは異なったスリープ状態を定義します。 最も重要な物は

  • スタンバイとして知られるS1
  • RAMをサスペンドするS3
  • ディスクをサスペンドするS4

これらはシステムが使用中ではない場合にはいつも呼び出されますが、シャットダウンは起動に長い時間がかかるので望ましくありません。

スリープ、スタンバイそしてハイバネーション 

ACPIはこれらスリープ状態を実験的としてサポートしています。 APMスリープ状態はstableの様に見えますが、APMとACPIを一緒には利用できません。

Warning: スリープ状態のサポートはより改良されていますが、それは未だ実験段階です。 swsusp2を入手しRAMをサスペンドするようにした時、警告されました。 これは、たぶん働いていませんが、あなたのデータ/システムを破損するでしょう。

現在、S4のための3つの実装があります。 オリジナルのものがswsuspです。 そして、最も良いインタフェース(bootsplashサポートを含んでいる)を持っていますが、手動のカーネル修正を必要とするswsusp2があります。 最後に、swsuspからフォークしたSuspend-to-Diskがあります。

もし混乱したのなら、機能比較を見てください。 それでも混乱していて何を使っていいか分からなければ、まず最も見込みがあるswsusp2を使ってみてください。

カーネルのこの部分を以下のようにします:

Code listing 7.1: 様々なサスペンドタイプのためのカーネル設定
Power Management Options --->

  (sleep and standby)
  ACPI( Advanced Configuration and Power Interface ) Support --->
    [*] ACPI Support
       [*]   Sleep States

  (swsuspを使ったハイバネーション)
  [*] Software Suspend (EXPERIMENTAL)
  
  (swsusp2を使ったハイバネーション)
  Software Suspend 2
    --- Image Storage (you need at least one writer)
    [*]    Swap Writer
    --- Page Transformers
    [*]    LZF image compression
    (/dev/"your-swap-here")    Default resume device name

  (Suspend-to-Diskを使ったハイバネーション)
  [*] Suspend-to-Disk Suport
  (/dev/"your-swap-here") Default resume partition

適当なオプションを付けてカーネルをコンパイルし、2.4シリーズならcat /proc/acpi/sleepを、2.6ならcat /sys/power/stateを見て何がサポートされているかを確認してください。 後者の場合、standby mem diskが出力されます。 swsuspでは、カーネルパラメータにresume=/dev/"your-swap-here"を追加する必要があります。 イメージの破損により起動しなければ、swsuspではnoresumeを、Suspend-to-Diskではpmdisk=offを、swsusp2ではnoresume2を使います。

システムをスリープ状態にするには以下のようにします。

Code listing 7.2: スリープ状態を有効化
(カーネル2.4シリーズ)
# echo 1 > /proc/acpi/sleep          (スタンバイ)
# echo 3 > /proc/acpi/sleep          (スリープ)

(カーネル2.6シリーズ)
# echo -n standby > /sys/power/state スタンバイ
# echo -n mem > /sys/power/state     スリープ

(swsusp)
# echo 4 > /proc/acpi/sleep          hibernate

(Suspend-to-Disk)
# echo -n disk > /sys/power/state    hibernate

(swsusp2)
# echo > /proc/swsusp/activate

Warning: これを行う前にデータをバックアップしてください。 コマンドを実行する前に、syncを実行し、キャッシュされているデータをディスクに書き込んでください。 まずX外で試し、その後Xを起動させますが、ログインしないでください。

uhciまたは類似するものが原因でカーネルパニックを経験したなら、モジュールとしてUSBサポートをコンパイルして、あなたのラップトップをスリープモードにする前に、モジュールを解除するようにしてください。

上記はswsuspとSuspend-to-Diskの実行(私は動かないと言いましたが)には事足りますが、swsusp2には特別な配慮が必要です。 最初にすることはhttp://softwaresuspend.berlios.de/で提供されるパッチをカーネルに当てることです。 その後、同じページのハイバネーションスクリプトをインストールします。

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

もし何かがおかしければ・・・ 

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: カーネルのバグかもしれません。 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: バッテリーの駆動時間が前よりも悪くなったみたいです。

A: BIOSの設定を確認してください。 もしかするといくつかの設定を再度有効にし忘れたのかもしれません。

Q: バッテリーを充電しましたが、KDEは0%だと報告してすぐに終了してしまいます。

A: バッテリーサポートがカーネル内にコンパイルされているか確認してください。 モジュールとして使っているなら、モジュールを読み込んでください。

Q: Dell Inspiron 51XXを使っていますが何のACPIイベントも起きません。

A: カーネルのバグの様です。これを読んでください。

Q: 新しいバッテリーを買いましたが、数分しか持ちません!何を間違えたのでしょうか?

A: まずバッテリーの製造元が指示する正しい充電方法に従ってください。

Q: 上のは助けになりませんでした。では何をすべきでしょうか?

A: 「新品」として売られているうちのいくらかは実際には中古の物です。以下の通りにしてください。

Code listing 8.1: バッテリー状態の確認
$ grep capacity /proc/acpi/battery/BAT0/info
design capacity:     47520 mWh
last full capacity:  41830 mWh

もし "last full capacity" が設計容量と不思議に異なっていたら、バッテリーが壊れているのかもしれません。 保証を要求してください。

Copyright© 2002-2004 Gentoo Linux Users Group Japan. ご質問、ご意見などはこちらまで。 Email www@gentoo.gr.jp.