「電源管理/サスペンドとハイバネート」の版間の差分
(同期 (一部未翻訳)) |
細 (誤字修正など) |
||
59行目: | 59行目: | ||
== ハイバネーション == |
== ハイバネーション == |
||
− | ハイバネーションを使うには、[[スワップ]]パーティションかファイルを作成する必要があります。{{ic|1=resume=}} カーネルパラメータを使ってスワップを指定する必要 |
+ | ハイバネーションを使うには、[[スワップ]]パーティションかファイルを作成する必要があります。{{ic|1=resume=}} カーネルパラメータを使ってスワップを指定する必要がなります。これはブートローダを通して設定されます。[[#initramfs の設定|initramfs]] も必要になります。これによりカーネルは初期ユーザー空間の指定したスワップからの復帰を試みます。これら3つのステップは以下で詳細に述べます。 |
=== スワップパーティション(ファイル)のサイズについて === |
=== スワップパーティション(ファイル)のサイズについて === |
||
103行目: | 103行目: | ||
{{Note| |
{{Note| |
||
− | * カーネルパラメータ {{ic|resume}} にはスワップファイル自体ではなく、スワップファイルが含まれているパーティションのデバイスを記入する必要があることに注意してください。パラメータ {{ic|resume_offset}} は resume デバイスのどこからスワップファイルがあるかを示しています。これらを有効化するために最初のハイバネーションの前に再起動が必要です。 |
+ | * カーネルパラメータ {{ic|resume}} にはスワップファイル自体ではなく、スワップファイルが含まれているパーティションのデバイスを記入する必要があることに注意してください。パラメータ {{ic|resume_offset}} は resume デバイスのどこからスワップファイルがあるかを示しています。これらを有効化するためには、最初のハイバネーションの前に再起動が必要です。 |
* [[uswsusp]] を使う場合、キー {{ic|resume device}} と {{ic|resume offset}} を使って {{ic|/etc/suspend.conf}} にこれら2つのパラメータを記述してください。この場合再起動は必要ありません。 |
* [[uswsusp]] を使う場合、キー {{ic|resume device}} と {{ic|resume offset}} を使って {{ic|/etc/suspend.conf}} にこれら2つのパラメータを記述してください。この場合再起動は必要ありません。 |
||
}} |
}} |
2016年10月25日 (火) 00:27時点における版
現在サスペンドには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 の記事を参照してください。
高レベルインターフェイス
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
パラメータで使われるものと同じにしてください。
設定は使用しているブートローダーによって異なります。詳しくはカーネルパラメータを参照してください。
スワップファイルにハイバネーション
スワップパーティションの代わりにスワップファイルを使うには追加のカーネルパラメータ 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 パッケージに含まれています。
initramfs の設定
- initramfs で
base
フックを使っている場合 (Arch ではデフォルトで使っています)、/etc/mkinitcpio.conf
にresume
フックを追加する必要があります。ラベルか UUID に関わらずスワップパーティションは udev デバイスノードとともに参照されるので、resume
フックは必ずudev
の後に続けて下さい。次の例はデフォルトのフック設定から始まっています:
HOOKS="base udev resume autodetect modconf block filesystems keyboard fsck"
- これらの変更を有効化するために initramfs の再生成を忘れずに行ってください。
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.