「電源管理/サスペンドとハイバネート」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(同期 (一部未翻訳))
47行目: 47行目:
 
=== systemd ===
 
=== systemd ===
   
[[systemd]] はサスペンド・ハイバネート・ハイブリッドサスペンドを行うためのネイティブのコマンドを提供しています。詳しくは [[電源管理#systemd による電源管理]] を見て下さい。
+
[[systemd]] はサスペンド・ハイバネート・ハイブリッドサスペンドを行うためのネイティブのコマンドを提供しています。詳しくは [[電源管理#systemd による電源管理]] を見て下さい。これは Arch Linux で使われているデフォルトのインターフェースです
   
 
サスペンド・ハイバネートのフックの設定に関する情報は[[電源管理#スリープフック]]に載っています。{{ic|man systemctl}}, {{ic|man systemd-sleep}}, {{ic|man systemd.special}} もあわせて参照してください。
 
サスペンド・ハイバネートのフックの設定に関する情報は[[電源管理#スリープフック]]に載っています。{{ic|man systemctl}}, {{ic|man systemd-sleep}}, {{ic|man systemd.special}} もあわせて参照してください。
56行目: 56行目:
   
 
[[pm-utils]] の記事を参照してください。
 
[[pm-utils]] の記事を参照してください。
 
== Suspend to RAM ==
 
 
Suspend to RAM は何も設定しなくても動作するはずです。
 
   
 
== ハイバネーション ==
 
== ハイバネーション ==
   
ハイバネーションを使うには、スワップパーティションかスワップファイルを作成する必要があります。詳しくは[[スワップ]]見てさい
+
ハイバネーションを使うには、[[スワップ]]パーティションかファイルを作成する必要があります。{{ic|1=resume=}} カーネルパラメータを使ってスワップを指定する必要になります。これブートローダを通して設定されます。[[#initramfs の設定|initramfs]] も必要になります。これによりカーネルは初期ユーザー空間の指定したスワップからの復帰試みます。これら3つのステップは以で詳細に述べます
   
 
=== スワップパーティション(ファイル)のサイズについて ===
 
=== スワップパーティション(ファイル)のサイズについて ===
75行目: 71行目:
 
=== 必要なカーネルパラメータ ===
 
=== 必要なカーネルパラメータ ===
   
カーネルパラメータ {{ic|1=resume=<swap_partition>}} を使う必要があります。{{ic|<swap_partition>}} にはスワップパーティションのカーネル名 ({{ic|/dev/sda1}}) か、スワップパーティションの [[UUID]] を使うことができます。詳しくはブートローダ別のがある[[カーネルパラメータ]]を参照してください。
+
カーネルパラメータ {{ic|1=resume=''swap_partition''}} を使う必要があります。{{ic|''swap_partition''}} にはスワップパーティションのカーネル名か、スワップパーティションの [[UUID]] を使うことができます。例:
   
  +
* {{ic|1=resume=/dev/sda1}}
例えば、GRUB2 ならば {{ic|GRUB_CMDLINE_LINUX_DEFAULT}} 変数が使えます:
 
  +
* {{ic|1=resume=UUID=4209c845-f495-4c43-8a03-5363dd433153}}
  +
* {{ic|1=resume=/dev/mapper/archVolumeGroup-archLogicVolume}} -- LVM を使う場合の例
   
  +
{{ic|resume}} パラメータで使われる命名法は通常 {{ic|root}} パラメータで使われるものと同じにしてください。
{{hc|/etc/default/grub|2=GRUB_CMDLINE_LINUX_DEFAULT="resume=/dev/sda1"}}
 
   
  +
設定は使用している[[ブートローダー]]によって異なります。詳しくは[[カーネルパラメータ]]を参照してください。
または UUID を使う場合:
 
 
{{hc|/etc/default/grub|2=GRUB_CMDLINE_LINUX_DEFAULT="resume=/dev/disk/by-uuid/4209c845-f495-4c43-8a03-5363dd433153"}}
 
 
後で {{ic|grub-mkconfig -o /boot/grub/grub.cfg}} を実行することを忘れないで下さい。
 
 
{{Tip|As an alternative, for GRUB2 you may try this solution from [http://wiki.debian.org/Grub#Configuring_grub_v2 debian wiki], which automatically adds your first swap partition to {{ic|1=resume=}} parameter to all found linux entries.}}
 
   
 
==== スワップファイルにハイバネーション ====
 
==== スワップファイルにハイバネーション ====
   
  +
{{Warning|[[Btrfs#スワップファイル|Btrfs]] はスワップファイルをサポートしていません。この警告に従わない場合、ファイルシステムが破損するおそれがあります。ループデバイスを経由してマウントしているときに Btrfs でスワップファイルを使うと、スワップパフォーマンスが著しく低下してしまいます。}}
スワップパーティションの代わりにスワップファイルを使うには追加のカーネルパラメータ {{ic|1=resume_offset=<Swap File Offset>}} が必要です。
 
   
  +
スワップパーティションの代わりにスワップファイルを使うには追加のカーネルパラメータ {{ic|1=resume_offset=''swap_file_offset''}} が必要です。
{{ic|<Swap File Offset>}} の値は {{ic|filefrag -v <Swap File>}} を実行することで取得できます。テーブル形式で出力され、必要な値は {{ic|physical_offset}} カラムの一番上の段にあります。例えば:
 
  +
  +
{{ic|''swap_file_offset''}} の値は {{ic|filefrag -v ''swap_file''}} を実行することで取得できます。テーブル形式で出力され、必要な値は {{ic|physical_offset}} カラムの一番上の段にあります。例えば:
 
{{hc|# filefrag -v /swapfile|<nowiki>
 
{{hc|# filefrag -v /swapfile|<nowiki>
 
Filesystem type is: ef53
 
Filesystem type is: ef53
104行目: 98行目:
 
</nowiki>}}
 
</nowiki>}}
   
この例では {{ic|<Swap File Offset>}} の値は {{ic|38912}} です。
+
この例では {{ic|''swap_file_offset''}} の値は 2つのピリオドが付いている 最初の {{ic|38912}} です。
   
{{Tip|{{ic|<Swap File Offset>}} の値は {{ic|swap-offset <Swap File>}} でも取得することができます。''swap-offset'' バイナリは {{AUR|uswsusp-git}} パッケージに含まれています。}}
+
{{ic|''swap_file_offset''}} の値は {{ic|swap-offset ''swap_file''}} でも取得することができます。''swap-offset'' バイナリは {{AUR|uswsusp-git}} パッケージに含まれています。
   
 
{{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つのパラメータを記述してください。この場合再起動は必要ありません
 
}}
 
}}
   
  +
{{Tip|RAM 利用の拡大ではなく単にハイバネートを可能にしたい場合は、スワップファイルの [[スワップ#Swappiness]] を減らすこともできます。}}
=== initial ramdisk を再生成 ===
 
   
  +
=== initramfs の設定 ===
initramfs を使っている場合 (Arch ではデフォルトで使っています)、[[mkinitcpio]] の設定にある HOOKS に {{ic|resume}} フックを追加する必要があります:
 
   
  +
* [[initramfs]] で {{ic|base}} フックを使っている場合 (Arch ではデフォルトで使っています)、{{ic|/etc/mkinitcpio.conf}} に {{ic|resume}} フックを追加する必要があります。ラベルか UUID に関わらずスワップパーティションは udev デバイスノードとともに参照されるので、{{ic|resume}} フックは必ず {{ic|udev}} の後に続けて下さい。次の例はデフォルトのフック設定から始まっています:
{{hc|/etc/mkinitcpio.conf|2=
 
# resume must be placed after block and lvm2, but before filesystems
 
HOOKS="... block lvm2 '''resume''' filesystems ..."
 
}}
 
   
  +
:{{bc|1=HOOKS="base udev '''resume''' autodetect modconf block filesystems keyboard fsck"}}
最後に、initrd イメージを再生成して変更を適用してください:
 
   
  +
:これらの変更を有効化するために [[mkinitcpio#イメージ作成とアクティベーション|initramfs の再生成]]を忘れずに行ってください。
# mkinitcpio -p linux
 
   
{{Note|カスタムカーネルを使っているのならば、{{ic|-p}} オプション値は必要応じて変えさい。}}
+
:{{Note|[LVM] を使っているユーザーは {{ic|resume}} を {{ic|lvm2}} の追加しください。}}
  +
  +
* {{ic|systemd}} のフックで initramfs を使う場合は既に復帰機構が提供されているので、さらにフックを追加する必要はありません。
   
 
== トラブルシューティング ==
 
== トラブルシューティング ==
137行目: 130行目:
   
 
{{ic|1=acpi_sleep=nonvs}} カーネルフラグをブートローダに追加してください、これで OK です!
 
{{ic|1=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 [[en2:Mkinitcpio#MODULES|Mkinitcpio#MODULES]] and rebuilding the initramfs, can possibly solve this issue, specially graphics drivers for [[en2:Kernel_mode_setting#Early_KMS_start|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 [https://01.org/blogs/rzhang/2015/best-practice-debug-linux-suspend/hibernate-issues article] for the best practices to debug suspend/hibernate issues.
   
 
=== Wake-on-LAN ===
 
=== Wake-on-LAN ===
   
 
[[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 {{ic|xhci_hcd}} module interprets it during boot. As a work-around reported affected systems are added to a blacklist (named {{ic|XHCI_SPURIOUS_WAKEUP}}) by the kernel case-by-case.[https://bugzilla.kernel.org/show_bug.cgi?id=66171#c6]
  +
  +
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.[https://bbs.archlinux.org/viewtopic.php?pid=1575617]
  +
  +
To view the current configuration:
  +
  +
{{hc|$ 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 {{ic|EHC1}}, {{ic|EHC1}} and {{ic|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 [[en2:systemd#Writing unit files|systemd#Writing unit files]]. See [https://bbs.archlinux.org/viewtopic.php?pid=1575617#p1575617 BBS thread] for a possible solution and more information.

2016年10月25日 (火) 00:19時点における版

関連記事

現在サスペンドには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.