「電源管理/サスペンドとハイバネート」の版間の差分
(同期) |
(同期) |
||
7行目: | 7行目: | ||
[[zh-hans:Power management/Suspend and hibernate]] |
[[zh-hans:Power management/Suspend and hibernate]] |
||
{{Related articles start}} |
{{Related articles start}} |
||
− | {{Related|Uswsusp}} |
||
{{Related|systemd}} |
{{Related|systemd}} |
||
{{Related|電源管理}} |
{{Related|電源管理}} |
||
21行目: | 20行目: | ||
; Hybrid suspend (ハイブリットスリープとも呼ばれます): サスペンドとハイバネートのハイブリッドです。'''Suspend to both''' と呼ばれることもあります。マシンの状態をスワップ領域に保存しますが、マシンの電源を切りません。代わりに、デフォルトのサスペンドを呼び出します。これによって、バッテリーを使いきっても、システムは即座に復帰できます。バッテリーが枯渇した時は、システムはディスクから復帰し、RAM からの復帰に比べて時間がかかりますが、システムの状態が失われることはありません。 |
; Hybrid suspend (ハイブリットスリープとも呼ばれます): サスペンドとハイバネートのハイブリッドです。'''Suspend to both''' と呼ばれることもあります。マシンの状態をスワップ領域に保存しますが、マシンの電源を切りません。代わりに、デフォルトのサスペンドを呼び出します。これによって、バッテリーを使いきっても、システムは即座に復帰できます。バッテリーが枯渇した時は、システムはディスクから復帰し、RAM からの復帰に比べて時間がかかりますが、システムの状態が失われることはありません。 |
||
− | 基本的な機能を提供 |
+ | カーネルは、基本的な機能を提供しており、問題のあるハードウェアドライバ/カーネルモジュール (例: ビデオカードの再初期化) に対処する機能を提供する高レベルなインターフェイスもいくつかあります。 |
− | == |
+ | == カーネルのインターフェイス (swsusp) == |
− | + | {{Note|カーネルのインターフェイスを直接使用することは可能です (ユーザー空間で追加の処理が無いので高速です) が、[[#高レベルインターフェイス|高レベルインターフェイス]]を使用することが推奨されます。そのようなインターフェイスは、ハードウェアクロックを適切に設定したり、無線ネットワークを回復させたりなどをするための、サスペンド前及び後のフック機構を提供しています。}} |
|
+ | カーネル内のソフトウェアサスペンドコード (swsusp) にサスペンド状態に入るよう直接伝えることは可能です。実際の方法と状態はハードウェアサポートのレベルによります。最近のカーネルでは、サスペンドにするために {{ic|/sys/power/state}} に適切な文字列を書くことが主な方法になっています。 |
||
− | === カーネル (swsusp) === |
||
− | |||
− | 直球の方法はカーネル内のソフトウェアサスペンドコード (swsusp) にサスペンド状態に入るよう直接伝えることです。実際の方法と状態はハードウェアサポートのレベルによります。最近のカーネルでは、サスペンドにするために {{ic|/sys/power/state}} に適切な文字列を書くことが主な方法になっています。 |
||
詳しくは [https://docs.kernel.org/admin-guide/pm/sleep-states.html#basic-sysfs-interfaces-for-system-suspend-and-hibernation カーネルドキュメント] を参照してください。 |
詳しくは [https://docs.kernel.org/admin-guide/pm/sleep-states.html#basic-sysfs-interfaces-for-system-suspend-and-hibernation カーネルドキュメント] を参照してください。 |
||
− | |||
− | === ユーザ空間 (uswsusp) === |
||
− | |||
− | uswsusp ('Userspace Software Suspend') ツールはカーネルの suspend-to-RAM 機構のラッパーを提供します。サスペンドの前と復帰の後にユーザー空間からグラフィックアダプタの操作を行います。 |
||
− | |||
− | {{Note|このプロジェクトは2011年から更新されていません。}} |
||
== 高レベルインターフェイス == |
== 高レベルインターフェイス == |
||
47行目: | 38行目: | ||
[[systemd]] はサスペンド・ハイバネート・ハイブリッドサスペンドを行うためのネイティブのコマンドを提供しています。詳しくは [[電源管理#電源管理]] を見て下さい。これは Arch Linux で使われているデフォルトのインターフェースです。 |
[[systemd]] はサスペンド・ハイバネート・ハイブリッドサスペンドを行うためのネイティブのコマンドを提供しています。詳しくは [[電源管理#電源管理]] を見て下さい。これは Arch Linux で使われているデフォルトのインターフェースです。 |
||
− | サスペンド・ハイバネートのフックの設定に関する情報は[[電源管理#スリープフック]]に載っています。{{ |
+ | サスペンド・ハイバネートのフックの設定に関する情報は[[電源管理#スリープフック]]に載っています。{{man|1|systemctl}}、{{man|8|systemd-sleep}}、{{man|7|systemd.special}} もあわせて参照してください。 |
== サスペンドの方法を変更する == |
== サスペンドの方法を変更する == |
||
80行目: | 71行目: | ||
== ハイバネーション == |
== ハイバネーション == |
||
− | ハイバネー |
+ | ハイバネートを行うには、次のことを行う必要があります: [[スワップ]]パーティションかスワップファイルの作成する。初期ユーザー空間で復帰プロセスを初期化できるようにするために [[#initramfs の設定|initramfs を設定する]]。Initramfs から利用できる方法でスワップ領域の場所を指定する (例えば、{{ic|HibernateLocation}} EFI 変数を [[systemd]] で定義したり、{{ic|1=resume=}} [[カーネルパラメータ]]を設定したり)。これらの3つの手順は以下で詳細に説明されています。 |
{{Note| |
{{Note| |
||
109行目: | 100行目: | ||
:変更を適用するために [[mkinitcpio#イメージ作成とアクティベーション|initramfs の再生成]]を忘れずに行ってください。 |
:変更を適用するために [[mkinitcpio#イメージ作成とアクティベーション|initramfs の再生成]]を忘れずに行ってください。 |
||
+ | :{{Note|スワップ領域にスタックされたストレージ (例えば、[[dm-crypt]]、[[RAID]]、[[LVM]]) を使用している場合は、最後のマッピングされるデバイスが、初期ユーザー空間内及び復帰プロセスの初期化前に利用できるようにする必要があります。つまり、どうすればよいかというと、{{ic|resume}} フックを {{ic|encrypt}} や {{ic|lvm2}} などのフックより後に置く必要があります (そのような環境である場合)。}} |
||
− | :{{Note|[[LVM]] を使っている場合は {{ic|resume}} フックを {{ic|lvm2}} の後に追加してください。}} |
||
* initramfs で {{ic|systemd}} フックを使っている場合は、復帰機構が既に提供されているので、フックを追加する必要はありません。 |
* initramfs で {{ic|systemd}} フックを使っている場合は、復帰機構が既に提供されているので、フックを追加する必要はありません。 |
||
165行目: | 156行目: | ||
* 次のコマンドは {{ic|''swap_device_uuid''}} を特定するのに利用できます: {{ic|1=findmnt -no UUID -T /swapfile}} |
* 次のコマンドは {{ic|''swap_device_uuid''}} を特定するのに利用できます: {{ic|1=findmnt -no UUID -T /swapfile}} |
||
* 次のコマンドは、Btrfs 以外のファイルシステムで {{ic|''swap_file_offset''}} を特定するのに利用できます: {{ic|1=filefrag -v /swapfile {{!}} awk '$1=="0:" {print substr($4, 1, length($4)-2)}'}} |
* 次のコマンドは、Btrfs 以外のファイルシステムで {{ic|''swap_file_offset''}} を特定するのに利用できます: {{ic|1=filefrag -v /swapfile {{!}} awk '$1=="0:" {print substr($4, 1, length($4)-2)}'}} |
||
− | * {{ic|''swap_file_offset''}} の値は {{ic|swap-offset ''swap_file''}} を実行することによっても得られます。 ''swap-offset'' バイナリは [[uswsusp]] ツールのセットで提供されています。 もしこの方法を利用するならば、これら2つのパラメータは {{ic|/etc/suspend.conf}} 内で {{ic|resume device}} と {{ic|resume offset}} というキーで渡されなければなりません。この場合、再起動は必要ありません。 |
||
}} |
}} |
||
173行目: | 163行目: | ||
{{Tip|スワップファイルを作成する目的が、仮想メモリの拡張ではなくハイバネートがしたいだけの場合、スワップファイルの [[スワップ#Swappiness|Swappiness]] を減らすとよいでしょう。}} |
{{Tip|スワップファイルを作成する目的が、仮想メモリの拡張ではなくハイバネートがしたいだけの場合、スワップファイルの [[スワップ#Swappiness|Swappiness]] を減らすとよいでしょう。}} |
||
+ | |||
+ | ==== ハイバネート用のスワップファイルを zram で保持する ==== |
||
+ | |||
+ | RAM 圧縮 (zram) でのハイバーネートの問題は、複数のスワップ領域を同時に保持することで解決できます。[[Systemd]] は、ハイバネートをトリガーする前に zram ブロックデバイスを常に無視するので、特に設定せずに両方の領域 (スワップファイルと zram) を保持できるはずです。 |
||
+ | |||
+ | [[#スワップファイルにハイバネーション|スワップファイル]]を設定し、[[zram]] ページの指示に従って、zram に'''高いスワップ優先度''' (例えば {{ic|1=pri=100}}) を割り当ててください。 |
||
+ | |||
+ | {{Note| |
||
+ | * ハイバネート用のオンデマンドのスワップユニットは作成しないでください。これは公式にはサポートされていません。Systemd の issue [https://github.com/systemd/systemd/issues/16708 #16708] と [https://github.com/systemd/systemd/issues/30083 #30083] を参照してください。 |
||
+ | * カーネルは無名 (anonymous) ページの回収とスワップを行います。スワップ領域を利用しないと、メモリ使用効率の悪化につながる可能性があります。ユーザーは、{{ic|memory.low}} によって特定のアプリケーションにおけるメモリ回収の優先度を管理することができます (これは[[コントロールグループ]]で調整可能です)。全体として、この方が [[swappiness]] パラメータを設定するよりも効率的です。 |
||
+ | * 詳細は[https://www.kernel.org/doc/gorman/html/understand/understand014.html カーネルドキュメントの Swap Management 章]と [https://chrisdown.name/2018/01/02/in-defence-of-swap.html Chris Down の - In defence of swap: common misconceptions] (Hiroaki Nakamura による日本語訳: [https://chrisdown.name/ja/2018/01/02/in-defence-of-swap.html スワップの弁護:よくある誤解を解く]) を参照してください。 |
||
+ | }} |
||
==== thinly-provisioned LVM ボリュームへのハイバネーション ==== |
==== thinly-provisioned LVM ボリュームへのハイバネーション ==== |
||
277行目: | 279行目: | ||
[[#ハイバネートした時にシステムの電源が落ちない]] で説明したように {{ic|1=HibernateMode=shutdown}} を設定することで、この問題を永久に解決できます。すでにシステムから締め出されてしまっている場合、システムを4回再起動 (毎回、エラーが表示されるまで待ってください) してみることで、一部の BIOS 上では通常のブート手順を強制することができます。 |
[[#ハイバネートした時にシステムの電源が落ちない]] で説明したように {{ic|1=HibernateMode=shutdown}} を設定することで、この問題を永久に解決できます。すでにシステムから締め出されてしまっている場合、システムを4回再起動 (毎回、エラーが表示されるまで待ってください) してみることで、一部の BIOS 上では通常のブート手順を強制することができます。 |
||
− | {{TranslationStatus|Power management/Suspend and hibernate|2024-01- |
+ | {{TranslationStatus|Power management/Suspend and hibernate|2024-01-11|796574}} |
2024年1月11日 (木) 17:19時点における版
関連記事
サスペンドの複数の方法を利用できます。とりわけ:
- Suspend to idle
- Intel は S0ix と呼んでおり、Microsoft は Modern Standby (以前は "Connected Standby") と呼んでいます。Linux カーネルでは S2Idle と呼ばれています。サポートされているシステムにおいて S3 スリープ状態の代わりに使用されるように設計されており、同等の節電機能を提供しますが、復帰に掛かる時間が大幅に短縮されます。
- Suspend to RAM (サスペンド、スリープとも呼ばれます)
- ACPI で S3 スリープ状態として定義されています。RAM を除くマシンのほとんど全てのパーツの電源を切ります。RAM への電源はマシンの状態を保存するために必要です。電力を多く節約できるので、ラップトップでは、バッテリーでコンピュータが稼働していてフタが閉じられた時 (もしくはユーザーが長い間操作しなかった時) は自動的にこのモードに移行するのが得策でしょう。
- Suspend to disk (ハイバネートとも呼ばれます)
- ACPI で S4 スリープ状態として定義されています。マシンの状態をスワップ領域に保存してマシンの電源を完全にオフにします。マシンに電源を入れた時、状態が復元されます。それまでは、電力消費量はゼロです。
- Hybrid suspend (ハイブリットスリープとも呼ばれます)
- サスペンドとハイバネートのハイブリッドです。Suspend to both と呼ばれることもあります。マシンの状態をスワップ領域に保存しますが、マシンの電源を切りません。代わりに、デフォルトのサスペンドを呼び出します。これによって、バッテリーを使いきっても、システムは即座に復帰できます。バッテリーが枯渇した時は、システムはディスクから復帰し、RAM からの復帰に比べて時間がかかりますが、システムの状態が失われることはありません。
カーネルは、基本的な機能を提供しており、問題のあるハードウェアドライバ/カーネルモジュール (例: ビデオカードの再初期化) に対処する機能を提供する高レベルなインターフェイスもいくつかあります。
目次
カーネルのインターフェイス (swsusp)
カーネル内のソフトウェアサスペンドコード (swsusp) にサスペンド状態に入るよう直接伝えることは可能です。実際の方法と状態はハードウェアサポートのレベルによります。最近のカーネルでは、サスペンドにするために /sys/power/state
に適切な文字列を書くことが主な方法になっています。
詳しくは カーネルドキュメント を参照してください。
高レベルインターフェイス
これらのパッケージではサスペンド/ハイバネートを行うためのバイナリ/スクリプトを提供します。実際に電源ボタンやメニュークリック、ラップトップのカバーのイベントなどと結びつけるのは他のツールで行うのが通常です。(ラップトップのカバーが閉じられたり、バッテリーが枯渇するなど)特定の電源イベントで自動的にサスペンド/ハイバネートをするには、Acpid の実行について調べて下さい。
systemd
systemd はサスペンド・ハイバネート・ハイブリッドサスペンドを行うためのネイティブのコマンドを提供しています。詳しくは 電源管理#電源管理 を見て下さい。これは Arch Linux で使われているデフォルトのインターフェースです。
サスペンド・ハイバネートのフックの設定に関する情報は電源管理#スリープフックに載っています。systemctl(1)、systemd-sleep(8)、systemd.special(7) もあわせて参照してください。
サスペンドの方法を変更する
S0ix サスペンドが通常の S3 スリープと同じ節電機能を提供しないシステム、あるいは、電力を節約することが復帰を高速化することよりも優先される場合においては、デフォルトのサスペンド方法を変更することが可能です。
以下のコマンドは、ハードウェアによってサポートされていると広告されている全てのサスペンド方法を出力します (現在のサスペンド方法は角括弧に囲まれます[1]):
$ cat /sys/power/mem_sleep
[s2idle] shallow deep
ハードウェアが deep
スリープ状態を広告していない場合、UEFI にそのような設定がないか確認してください。通常、Power や Sleep state などのような項目にあります。S0ix のオプションは Windows 10 や Windows and Linux や S3/Modern standby support という名前です。S3 スリープのオプションは Legacy、Linux、Linux S3、S3 enabled という名前です。設定できない場合、s2idle
を使い続けることもできます、ハイバネート を使うことを検討するか、DSDT テーブルにパッチを当ててみてください (あるいは、パッチ適用済みのバージョンを見つけてください)。
スリープの方法を変更したあと、スリープサイクルを何回かテストして、ハードウェアが S3 スリープで問題を起こさないかテストしてください:
# echo "deep" > /sys/power/mem_sleep
問題が無ければ、mem_sleep_default=deep
カーネルパラメータ を使って変更を永続化できます。
いくつかの逆の状況では、問題のあるファームウェアが s2idle
しかサポートしていないにも関わらず、deep
をサポートしていると広告することがあります。この場合、sleep.conf.d(5) 内で SuspendState
を使うことにより、s2idle
を使うことができます:
/etc/systemd/sleep.conf.d/freeze.conf
[Sleep] SuspendState=freeze
ハイバネーション
ハイバネートを行うには、次のことを行う必要があります: スワップパーティションかスワップファイルの作成する。初期ユーザー空間で復帰プロセスを初期化できるようにするために initramfs を設定する。Initramfs から利用できる方法でスワップ領域の場所を指定する (例えば、HibernateLocation
EFI 変数を systemd で定義したり、resume=
カーネルパラメータを設定したり)。これらの3つの手順は以下で詳細に説明されています。
スワップパーティション(ファイル)のサイズについて
スワップパーティションが RAM より小さかったとしても、ハイバネートが成功する可能性は高いと思われます。image_size
sysfs(5) 疑似ファイルに関する情報は カーネルドキュメントの "image_size" を見てください。
(スワップパーティションを小さくして) /sys/power/image_size
の値を減らしてサスペンドのイメージを出来る限り小さくすることも、値を増やしてハイバネーションを高速化することも可能です。大きな容量の RAM を搭載しているシステムでは、より小さい値にするとハイバネートからの復帰が劇的に速くなることがあります。image_size
の値を再起動後も保持するために systemd#systemd-tmpfiles - 一時ファイル を使うことができます:
/etc/tmpfiles.d/hibernation_image_size.conf
# Path Mode UID GID Age Argument w /sys/power/image_size - - - - 0
サスペンドイメージは複数のスワップパーティション/スワップファイルにまたがって保存することができません。イメージのすべての部分が1つのスワップパーティション/スワップファイルに収まらなければなりません。[2]
initramfs の設定
- Busybox ベースの initramfs を使用している場合 (Arch ではデフォルトです)、
/etc/mkinitcpio.conf
にresume
フックを追加する必要があります。ラベルあるいは UUID どちらを使用している場合でもスワップパーティションは udev デバイスノードによって参照されるので、resume
フックは必ずfilesystems
の前に追加してください。デフォルトのフック設定にresume
フックを追加すると以下のようになります:
HOOKS=(base udev autodetect modconf kms keyboard keymap consolefont block filesystems resume fsck)
- 変更を適用するために initramfs の再生成を忘れずに行ってください。
- initramfs で
systemd
フックを使っている場合は、復帰機構が既に提供されているので、フックを追加する必要はありません。
必要なカーネルパラメータ
カーネルパラメータ resume=swap_device
を使う必要があります。永続的なブロックデバイスの命名を swap_device
に使用することができます。例:
resume=/dev/sda1
resume=UUID=4209c845-f495-4c43-8a03-5363dd433153
resume=/dev/mapper/archVolumeGroup-archLogicVolume
-- スワップが LVM 論理ボリュームにある場合
カーネルパラメータは再起動後に有効となります。すぐにハイバネートできるようにするには、lsblk を使ってボリュームのメジャーデバイスナンバーとマイナーデバイスナンバーを手に入れて、/sys/power/resume
に major:minor
という形式で書き込んでください。スワップファイルを使用している場合は、追加で /sys/power/resume_offset
に resume オフセットを書き込んでください。[3]
例えば、スワップデバイスが 8:3
の場合:
# echo 8:3 > /sys/power/resume
スワップファイルにハイバネートする場合で、スワップファイルがボリューム 8:2
にあり、オフセットが 38912
の場合:
# echo 8:2 > /sys/power/resume # echo 38912 > /sys/power/resume_offset
スワップファイルにハイバネーション
スワップファイルを使うには、カーネルパラメータ resume=UUID=swap_device_uuid
と resume_offset=swap_file_offset
の両方を設定する必要があります。カーネルのドキュメントを参照してください。
swap_device
は、スワップファイルの存在するボリュームであり、root パラメータと同じ形式に従います。
Btrfs 以外のファイルシステムでは、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
であり、カーネルパラメータは resume_offset=38912
となります。
Btrfs の場合、filefrag ツールは使わないでください。filefrag から得られる "physical" オフセットの値は、ディスク上の実際の物理オフセットとは異なるからです。複数のデバイスをサポートするために、仮想的なディスクアドレス空間が存在するのです。[4] 代わりに、btrfs-inspect-internal(8) コマンドを使ってください。例えば:
# btrfs inspect-internal map-swapfile -r /swap/swapfile
198122980
この例では、swap_file_offset
は 198122980
であり、カーネルパラメータは resume_offset=198122980
となります。
ハイバネート用のスワップファイルを zram で保持する
RAM 圧縮 (zram) でのハイバーネートの問題は、複数のスワップ領域を同時に保持することで解決できます。Systemd は、ハイバネートをトリガーする前に zram ブロックデバイスを常に無視するので、特に設定せずに両方の領域 (スワップファイルと zram) を保持できるはずです。
スワップファイルを設定し、zram ページの指示に従って、zram に高いスワップ優先度 (例えば pri=100
) を割り当ててください。
thinly-provisioned LVM ボリュームへのハイバネーション
thinly-provisioned LVM されたボリュームへの休止状態は可能ですが、ボリュームが完全に割り当てられていることを確認する必要があります。そうしないと、再開に失敗します。FS#50703 を見てください。
LVM ボリュームをゼロで埋めるだけで、 LVM ボリュームを完全に割り当てることができます。 例えば:
# dd if=/dev/zero of=/dev/vg0/swap bs=1M status=progress
ボリュームが完全に割り当てられていることを確認するには、次を使用できます:
# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert swap vg0 Vwi-aot--- 10.00g pool 100
完全に割り当てられたボリュームは、100%のデータ使用量であると表示されます。
Intel Rapid Start Technology (IRST)
Intel Rapid Start Technology とは、ハイバネートするためのハードウェア上の方法で、あらかじめ設定された時間の後やバッテリー状態に基づいてスリープからハイバネートに移行できるようにします。IRSTは、オペレーティングシステムのレベルではなくファームウェアによって行われるので、通常のハイバネートよりも速く信頼性が高いはずです。一般的に、IRST はファームウェアで有効化する必要があり、またファームウェアで、サスペンド/バッテリイベント後にハイバネートをトリガーするまでの時間を設定できます。しかし、一部のデバイスは IRST をファームウェアでサポートしていますが、Intel の Windows ドライバからでしか設定できません。そのような場合には、以下で説明している intel-rst カーネルモジュールで Linux でもイベントを設定できるはずです。
Intel Rapid Start Technology (IRST) が有効の場合、deep sleep からの再開には "S3から再開するよりも数秒長くなりますが、ハイバネートから再開するよりもはるかに高速です"。
Intel ベースのシステムの多くは、 IRST のファームウェアをサポートしていますが、(HDD ではなく) SSD 上に特別なパーティションを必要とします。 Windows の OEM 展開では、Arch Linux インストールプロセス中に (SSD 全体を消去して再パーティションするのではなく) 保持できる IRST パーティションがすでに存在している場合があります。システムの RAM と同じサイズの未フォーマットパーティションとして表示されます。
ドライブ全体を消去してパーティションを切り直すつもりなら (あるいはすでにそうしてしまっているなら) IRST パーティションも再作成しなければなりません。これを行うには、システムの RAM と同じサイズの空のパーティションを作成し、そのパーティションの種類が GPT パーティションの場合は GUID D3BFE2DE-3DAF-11DF-BA40-E3A556D89593
に、 MBR パーティションの場合は ID 0x84
に設定します。また、システムのファームウェア設定で IRST のサポートを有効にする必要がある場合もあります。
IRST ハイバネートにかかる時間 (つまり、"RAMの内容全体を特殊なパーティションに" コピーする時間) は、システムの RAM サイズと SSD 速度によって異なり、20~60秒かかります。システムによっては、プロセスの完了を(点滅を止めるなどして) LED インジケータで示す場合があります。
Linux カーネルで IRST ハイバネートイベントを設定するには、CONFIG_INTEL_RST
オプションでカーネルに組み込むか、カーネルモジュールとして利用可能である必要があります。modprobe intel_rst
を実行してモジュールをロードすれば、/sys/bus/acpi/drivers/intel_rapid_start/*/
にファイル wakeup_events
と wakeup_time
が生成されるはずです。これらを用いて、さらなる設定を行うことができます。このモジュールは簡潔にドキュメント化されています。詳細は drivers/platform/x86/intel/rst.c を見てください。
Intel Rapid Start Technology に関する情報は、general Q&A と user guides も見てください。
トラブルシューティング
ACPI_OS_NAME
DSDT table を動作するように設定することができます。DSDT の記事を参照してください。
サスペンド/ハイバネートが動作しない、あるいはたまに動作しなくなる
ハイバネートやサスペンドから復帰した時に画面が真っ暗になって、明確なエラーは表示されず、何もできなくなるという報告が多数存在します。これらの問題は、ノートパソコンとデスクトップの両方で確認されています。公式の解決方法ではありませんが、古いカーネル、特に LTS カーネルに切り替えることで問題が解決することがあります。
ハードウェアの watchdog タイマーを使用している場合に問題が起こることもあります (デフォルトで無効化されています、systemd-system.conf(5) § OPTIONS の RuntimeWatchdogSec=
を見てください)。バグのある watchdog タイマーにより、システムがハイバネートイメージの作成を終える前に、コンピュータがリセットされることがあります。
時々、initramfs 内からのデバイスの初期化によって黒画面が発生することがあります。Mkinitcpio#MODULES 内にあるモジュールを削除し、kms
フックを削除し、initramfs を再ビルドすると、この問題を解決できる可能性があります (特に、KMS の早期開始が設定されたグラフィックスドライバの場合)。復帰前にそのようなデバイスを初期化すると、整合性がなくなり、システムのハイバネートからの復帰を妨げてしまう可能性があります。これは RAM からの復帰には影響しません。また、ブログ記事 best practices to debug suspend issues も確認してください。
ATI ビデオドライバから新しい AMDGPU ドライバに移行すると、ハイバネートと復帰のプロセスを成功させることができる可能性があります。
NVIDIA ユーザは、nvidiafb
モジュールをブラックリスト化すると、問題が解決するかもしれません。[6]
Intel CPU を搭載していて、タッチパッドのために intel_lpss_pci
をロードするノート PC では、復帰時にカーネルパニックを引き起こすことがあります(この時、caps lock が点滅する) [7]。このモジュールは、以下のように initramfs に追加する必要があります:
/etc/mkinitcpio.conf
MODULES=(... intel_lpss_pci ...)
そして、initramfs を再生成してください。
Wake-on-LAN
Wake-on-LAN が有効になっている場合、コンピュータがハイバネート状態になっていてもネットワークインターフェイスカードによって電力が消費されます。
サスペンドからすぐに復帰する
電源管理/復帰トリガー#サスペンドからすぐに復帰する を見てください。
AMD CPU 上で Linux カーネル 6.1 以上を使用している場合、これはカーネル内の S3 関連の制御ポリシーの問題が原因である可能性もあります。一時的な解決策は、関連する i2c デバイスの復帰をオフにすることです。関連する i2c デバイスは以下のコマンドで見つけられます:
$ ls /sys/bus/i2c/devices/*/power/wakeup
デバイス名の形式は i2c-ELAN0679:00
や i2c-MSFT0001:00
であるはずです。次に、以下のコマンドでサスペンドに移行できるかテストします:
# echo disabled > /sys/bus/i2c/devices/device_name/power/wakeup # systemctl suspend
これでうまく行くならば、udev ルールを追加することで、この設定を永続化できます:
/etc/udev/rules.d/99-avoid-i2c-wakeup.rules
KERNEL=="device_name", SUBSYSTEM=="i2c", ATTR{power/wakeup}="disabled"
ハイバネートした時にシステムの電源が落ちない
システムをハイバネートした時には、(状態をディスク上に保存したあとに)システムの電源が落ちるはずです。時々、ハイバネートした後も電源 LED が光り続けることがあります。これが起こる場合、sleep.conf.d(5) で HibernateMode
を shutdown
に設定すると問題が解決するかもしれません。
/etc/systemd/sleep.conf.d/hibernatemode.conf
[Sleep] HibernateMode=shutdown
上記の設定により、その他の設定が正しく行われていれば、systemctl hibernate
を実行するとマシンがシャットダウンし、状態をディスクに保存します。
ハイバネート後に起動するとオペレーティングシステムが見つからない (または、間違った OS が起動する)
これは、ブートディスクが外部ディスクである場合に起こる可能性があります。BIOS/ファームウェアの制限が原因であるようです。ハイバネーションは外部 (あるいは別の) ディスク上の OS から行われたが、BIOS/ファームウェアは内部ディスクから起動を試みてしまっているのです。
#ハイバネートした時にシステムの電源が落ちない で説明したように HibernateMode=shutdown
を設定することで、この問題を永久に解決できます。すでにシステムから締め出されてしまっている場合、システムを4回再起動 (毎回、エラーが表示されるまで待ってください) してみることで、一部の BIOS 上では通常のブート手順を強制することができます。