電源管理/サスペンドとハイバネート

提供: ArchWiki
2015年10月21日 (水) 19:53時点におけるKusakata (トーク | 投稿記録)による版
ナビゲーションに移動 検索に移動

関連記事

現在サスペンドには3つの手法が存在します: suspend to RAM (通常はサスペンドとだけ呼ばれます)、suspend to disk (通常はハイバネートと呼ばれます)、そして hybrid suspend (suspend to both とも呼ばれます):

  • Suspend to RAM は RAM を除くマシンのほとんど全てのパーツの電源を切ります。RAM への電源はマシンの状態を保存するために必要です。電力を多く節約できるので、ラップトップでは、バッテリーでコンピュータが稼働していてフタが閉じられた時 (もしくはユーザーが長い間操作しなかった時) は自動的にこのモードに移行するのが得策でしょう。
  • Suspend to disk はマシンの状態をスワップ領域に保存してマシンの電源を完全にオフにします。マシンに電源を入れた時、状態が復元されます。それまでは、電力消費量はゼロです。
  • Suspend to both はマシンの状態をスワップ領域に保存しますが、マシンの電源を切りません。代わりに、通常の suspend to RAM を呼び出します。これによって、バッテリーを使いきっても、システムを RAM から復帰することが可能です。バッテリーが枯渇した時は、システムはディスクから復帰し、RAM からの復帰に比べて時間がかかりますが、システムの状態が失われることはありません。

基本的な機能を提供する低レベルなインターフェイス (バックエンド) が複数存在し、問題のあるハードウェアドライバ・カーネルモジュール (例: ビデオカードの再初期化) を扱う機能を提供する高レベルなインターフェイスもいくつかあります。

低レベルインターフェイス

これらのインターフェイスは直接使うこともできますが、通常は高レベルインターフェイスを使ってサスペンド・ハイバネートを行うとよいでしょう。低レベルなインターフェイスを直接使うと、サスペンドの前や後に行うフック処理を全て実行する高レベルインターフェイスよりもかなり早くサスペンドが可能です。ただしフックはハードウェアクロックの設定や、ワイヤレスの復旧などを正しく処理することができます。

カーネル (swsusp)

直球の方法はカーネル内のソフトウェアサスペンドコード (swsusp) にサスペンド状態に入るよう直接伝えることです。実際の方法と状態はハードウェアサポートのレベルによります。最近のカーネルでは、サスペンドにするために /sys/power/state に適切な文字列を書くことが主な方法になっています。

詳しくは カーネルドキュメント を参照してください。

uswsusp

uswsusp ('Userspace Software Suspend') はカーネルの suspend-to-RAM のラッパーで、サスペンドの前と復帰の後にユーザー空間からグラフィックアダプタの操作を行います。

Uswsusp の記事を参照してください。

tuxonice

TuxOnIce はサスペンド・ハイバネートのカーネル実装のフォークで、デフォルトの実装を改善するカーネルパッチを提供しています。これを使うためにはカスタムカーネルが必要です。

TuxOnIce の記事を参照してください。

高レベルインターフェイス

ノート: これらのパッケージではサスペンド・ハイバネートを行うためのバイナリ・スクリプトを提供します。実際に電源ボタンやメニュークリック、ラップトップのカバーのイベントなどと結びつけるのは他のツールで行うのが通常です。(ラップトップのカバーが閉じられたり、バッテリーが枯渇するなど)特定の電源イベントで自動的にサスペンド・ハイバネートをするには、Acpid の実行について調べて下さい。

systemd

systemd はサスペンド・ハイバネート・ハイブリッドサスペンドを行うためのネイティブのコマンドを提供しています。詳しくは 電源管理#systemd による電源管理 を見て下さい。

サスペンド・ハイバネートのフックの設定に関する情報は電源管理#スリープフックに載っています。man systemctl, man systemd-sleep, man systemd.special もあわせて参照してください。

pm-utils

pm-utils はバックエンドのサスペンド・ハイバネート機能をカプセル化するシェルスクリプトのセットです。サスペンドの前後に行う設定やプロセスをカスタマイズするための様々なフックも入っています。

pm-utils の記事を参照してください。

Suspend to RAM

Suspend to RAM は何も設定しなくても動作するはずです。

ハイバネーション

ハイバネーションを使うには、スワップパーティションかスワップファイルを作成する必要があります。詳しくはスワップを見て下さい。

スワップパーティション(ファイル)のサイズについて

スワップパーティションが RAM より小さかったとしても、ハイバネートが成功する可能性は高いと思われます。カーネルドキュメント によると:

/sys/power/image_size は suspend-to-disk によって作成されるイメージのサイズを制御します。イメージサイズの上限として使われる負ではない整数 (バイト) を示す文字列で書くことが出来ます。suspend-to-disk はイメージサイズがその数字を超えないように出来る限りのことをします。ただし、それが無理だということがわかったら、とにかく出来る限り小さいイメージを使ってサスペンドを試みます。特に、このファイルに "0" と書かれていた場合、サスペンドのイメージは目一杯小さくなります。このファイルを読むと現在のイメージのサイズ制限が表示され、デフォルトでは利用可能な RAM の2/5に設定されています。

(スワップパーティションを小さくして) /sys/power/image_size の値を減らしてサスペンドのイメージを出来る限り小さくすることも、値を増やしてハイバネーションを高速化することも可能です。

必要なカーネルパラメータ

カーネルパラメータ resume=<swap_partition> を使う必要があります。<swap_partition> にはスワップパーティションのカーネル名 (/dev/sda1) か、スワップパーティションの UUID を使うことができます。詳しくはブートローダ別の例があるカーネルパラメータを参照してください。

例えば、GRUB2 ならば GRUB_CMDLINE_LINUX_DEFAULT 変数が使えます:

/etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="resume=/dev/sda1"

または UUID を使う場合:

/etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="resume=/dev/disk/by-uuid/4209c845-f495-4c43-8a03-5363dd433153"

後で grub-mkconfig -o /boot/grub/grub.cfg を実行することを忘れないで下さい。

ヒント: As an alternative, for GRUB2 you may try this solution from debian wiki, which automatically adds your first swap partition to resume= parameter to all found linux entries.

スワップファイルにハイバネーション

スワップパーティションの代わりにスワップファイルを使うには追加のカーネルパラメータ resume_offset=<Swap File Offset> が必要です。

<Swap File Offset> の値は filefrag -v <Swap File> を実行することで取得できます。テーブル形式で出力され、必要な値は physical_offset カラムの一番上の段にあります。例えば:

# filefrag -v /swapfile
Filesystem type is: ef53
File size of /swapfile is 4294967296 (1048576 blocks of 4096 bytes)
 ext:     logical_offset:        physical_offset: length:   expected: flags:
   0:        0..       0:      38912..     38912:      1:            
   1:        1..   22527:      38913..     61439:  22527:             unwritten
   2:    22528..   53247:     899072..    929791:  30720:      61440: unwritten
...

この例では <Swap File Offset> の値は 38912 です。

ヒント: <Swap File Offset> の値は swap-offset <Swap File> でも取得することができます。swap-offset バイナリは uswsusp-gitAUR パッケージに含まれています。
ノート:
  • カーネルパラメータ resume にはスワップファイル自体ではなく、スワップファイルが含まれているパーティションのデバイスを記入する必要があることに注意してください。パラメータ resume_offset は resume デバイスのどこからスワップファイルがあるかを示しています。
  • uswsusp を使う場合、キー resume deviceresume offset を使って /etc/suspend.conf にこれら2つのパラメータを記述してください。

initial ramdisk を再生成

initramfs を使っている場合 (Arch ではデフォルトで使っています)、mkinitcpio の設定にある HOOKS に resume フックを追加する必要があります:

/etc/mkinitcpio.conf
# resume must be placed after block and lvm2, but before filesystems
HOOKS="... block lvm2 resume filesystems ..."

最後に、initrd イメージを再生成して変更を適用してください:

# mkinitcpio -p linux
ノート: カスタムカーネルを使っているのならば、-p オプションの値は必要に応じて変えて下さい。

トラブルシューティング

ACPI_OS_NAME

DSDT table を動作するように設定することができます。DSDT の記事を参照してください。

VAIO ユーザー

acpi_sleep=nonvs カーネルフラグをブートローダに追加してください、これで OK です!

Wake-on-LAN

Wake-on-LAN が有効になっている場合、コンピュータがハイバネート状態になっていてもネットワークインターフェイスカードによって電力が消費されます。