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

提供: ArchWiki
2016年10月25日 (火) 00:27時点における168 (トーク | 投稿記録)による版 (誤字修正など)
ナビゲーションに移動 検索に移動

関連記事

現在サスペンドには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 による電源管理 を見て下さい。これは Arch Linux で使われているデフォルトのインターフェースです。

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

pm-utils

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

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

ハイバネーション

ハイバネーションを使うには、スワップパーティションかファイルを作成する必要があります。resume= カーネルパラメータを使ってスワップを指定する必要がなります。これはブートローダを通して設定されます。initramfs も必要になります。これによりカーネルは初期ユーザー空間の指定したスワップからの復帰を試みます。これら3つのステップは以下で詳細に述べます。

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

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

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

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

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

カーネルパラメータ resume=swap_partition を使う必要があります。swap_partition にはスワップパーティションのカーネル名か、スワップパーティションの UUID を使うことができます。例:

  • resume=/dev/sda1
  • resume=UUID=4209c845-f495-4c43-8a03-5363dd433153
  • resume=/dev/mapper/archVolumeGroup-archLogicVolume -- LVM を使う場合の例

resume パラメータで使われる命名法は通常 root パラメータで使われるものと同じにしてください。

設定は使用しているブートローダーによって異なります。詳しくはカーネルパラメータを参照してください。

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

警告: Btrfs はスワップファイルをサポートしていません。この警告に従わない場合、ファイルシステムが破損するおそれがあります。ループデバイスを経由してマウントしているときに Btrfs でスワップファイルを使うと、スワップパフォーマンスが著しく低下してしまいます。

スワップパーティションの代わりにスワップファイルを使うには追加のカーネルパラメータ 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 の値は 2つのピリオドが付いている 最初の 38912 です。

swap_file_offset の値は swap-offset swap_file でも取得することができます。swap-offset バイナリは uswsusp-gitAUR パッケージに含まれています。

ノート:
  • カーネルパラメータ resume にはスワップファイル自体ではなく、スワップファイルが含まれているパーティションのデバイスを記入する必要があることに注意してください。パラメータ resume_offset は resume デバイスのどこからスワップファイルがあるかを示しています。これらを有効化するためには、最初のハイバネーションの前に再起動が必要です。
  • uswsusp を使う場合、キー resume deviceresume offset を使って /etc/suspend.conf にこれら2つのパラメータを記述してください。この場合再起動は必要ありません。
ヒント: RAM 利用の拡大ではなく単にハイバネートを可能にしたい場合は、スワップファイルの スワップ#Swappiness を減らすこともできます。

initramfs の設定

  • initramfsbase フックを使っている場合 (Arch ではデフォルトで使っています)、/etc/mkinitcpio.confresume フックを追加する必要があります。ラベルか UUID に関わらずスワップパーティションは udev デバイスノードとともに参照されるので、resume フックは必ず udev の後に続けて下さい。次の例はデフォルトのフック設定から始まっています:
HOOKS="base udev resume autodetect modconf block filesystems keyboard fsck"
これらの変更を有効化するために initramfs の再生成を忘れずに行ってください。
ノート: [LVM] を使っているユーザーは resumelvm2 の次に追加してください。
  • systemd のフックで initramfs を使う場合は既に復帰機構が提供されているので、さらにフックを追加する必要はありません。

トラブルシューティング

ACPI_OS_NAME

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

VAIO ユーザー

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

Suspend/hibernate doesn't work, or not consistently

There have been many reports about the screen going black without easily viewable errors or the ability to do anything when going into and coming back from suspend and/or hibernate. These problems have been seen on both laptops and desktops. This is not an official solution, but switching to an older kernel, especially the LTS-kernel, will probably fix this.

Sometimes the screen goes black due to device initialization from within the initramfs. Removing any modules you might have in Mkinitcpio#MODULES and rebuilding the initramfs, can possibly solve this issue, specially graphics drivers for early KMS. Initializing such devices before resuming can cause inconsistencies that prevents the system resuming from hibernation. This does not affect resuming from RAM. Also, check this article for the best practices to debug suspend/hibernate issues.

Wake-on-LAN

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

Instantaneous wakeups from suspend

For some Intel Haswell systems with the LynxPoint and LynxPoint-LP chipset, instantaneous wakeups after suspend are reported. They are linked to erroneous BIOS ACPI implementations and how the xhci_hcd module interprets it during boot. As a work-around reported affected systems are added to a blacklist (named XHCI_SPURIOUS_WAKEUP) by the kernel case-by-case.[1]

Instantaneous resume may happen, for example, if a USB device is plugged during suspend and ACPI wakeup triggers are enabled. A viable work-around for such a system, if it is not on the blacklist yet, is to disable the wakeup triggers. An example to disable wakeup through USB is described as follows.[2]

To view the current configuration:

$ cat /proc/acpi/wakeup
Device  S-state   Status   Sysfs node
...
EHC1      S3    *enabled  pci:0000:00:1d.0
EHC2      S3    *enabled  pci:0000:00:1a.0
XHC       S3    *enabled  pci:0000:00:14.0
...

The relevant devices are EHC1, EHC1 and XHC (for USB 3.0). To toggle their state you have to echo the device name to the file as root.

# echo EHC1 > /proc/acpi/wakeup
# echo EHC2 > /proc/acpi/wakeup
# echo XHC > /proc/acpi/wakeup

This should result in suspension working again. However, this settings are only temporary and would have to be set at every reboot. To automate this take a look at systemd#Writing unit files. See BBS thread for a possible solution and more information.