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

提供: ArchWiki
ナビゲーションに移動 検索に移動
(AshMyzk がページ「サスペンドとハイバネート」を「電源管理/サスペンドとハイバネート」に移動しました: 英語版と同じに)
(同期)
18行目: 18行目:
 
; Suspend to RAM (サスペンド、スリープとも呼ばれます): ACPI で '''S3''' スリープ状態として定義されています。RAM を除くマシンのほとんど全てのパーツの電源を切ります。RAM への電源はマシンの状態を保存するために必要です。電力を多く節約できるので、ラップトップでは、バッテリーでコンピュータが稼働していてフタが閉じられた時 (もしくはユーザーが長い間操作しなかった時) は自動的にこのモードに移行するのが得策でしょう。
 
; Suspend to RAM (サスペンド、スリープとも呼ばれます): ACPI で '''S3''' スリープ状態として定義されています。RAM を除くマシンのほとんど全てのパーツの電源を切ります。RAM への電源はマシンの状態を保存するために必要です。電力を多く節約できるので、ラップトップでは、バッテリーでコンピュータが稼働していてフタが閉じられた時 (もしくはユーザーが長い間操作しなかった時) は自動的にこのモードに移行するのが得策でしょう。
 
; Suspend to disk (ハイバネートとも呼ばれます): ACPI で '''S4''' スリープ状態として定義されています。マシンの状態を[[スワップ|スワップ領域]]に保存してマシンの電源を完全にオフにします。マシンに電源を入れた時、状態が復元されます。それまでは、電力消費量は[[Wikipedia:Standby power|ゼロ]]です。
 
; Suspend to disk (ハイバネートとも呼ばれます): ACPI で '''S4''' スリープ状態として定義されています。マシンの状態を[[スワップ|スワップ領域]]に保存してマシンの電源を完全にオフにします。マシンに電源を入れた時、状態が復元されます。それまでは、電力消費量は[[Wikipedia:Standby power|ゼロ]]です。
; Suspend to both: サスペンドとハイバネートのハイブリッドです。'''ハイブリッドサスペンド''' と呼ばれることもあります。マシンの状態をスワップ領域に保存しますが、マシンの電源を切りません。代わりに、デフォルトのサスペンドを呼び出します。これによって、バッテリーを使いきっても、システムは即座に復帰できます。バッテリーが枯渇した時は、システムはディスクから復帰し、RAM からの復帰に比べて時間がかかりますが、システムの状態が失われることはありません。
+
; Hybrid suspend: サスペンドとハイバネートのハイブリッドです。'''Suspend to both''' と呼ばれることもあります。マシンの状態をスワップ領域に保存しますが、マシンの電源を切りません。代わりに、デフォルトのサスペンドを呼び出します。これによって、バッテリーを使いきっても、システムは即座に復帰できます。バッテリーが枯渇した時は、システムはディスクから復帰し、RAM からの復帰に比べて時間がかかりますが、システムの状態が失われることはありません。
   
 
基本的な機能を提供する低レベルなインターフェイス (バックエンド) が複数存在し、問題のあるハードウェアドライバ/カーネルモジュール (例: ビデオカードの再初期化) を扱う機能を提供する高レベルなインターフェイスもいくつかあります。
 
基本的な機能を提供する低レベルなインターフェイス (バックエンド) が複数存在し、問題のあるハードウェアドライバ/カーネルモジュール (例: ビデオカードの再初期化) を扱う機能を提供する高レベルなインターフェイスもいくつかあります。
34行目: 34行目:
 
=== ユーザ空間 (uswsusp) ===
 
=== ユーザ空間 (uswsusp) ===
   
uswsusp ('Userspace Software Suspend') はカーネルの suspend-to-RAM のラッパーで、サスペンドの前と復帰の後にユーザー空間からグラフィックアダプタの操作を行います。
+
uswsusp ('Userspace Software Suspend') ツールはカーネルの suspend-to-RAM 機構のラッパーを提供します。サスペンドの前と復帰の後にユーザー空間からグラフィックアダプタの操作を行います。
 
[[Uswsusp]] の記事を参照してください。
 
   
 
== 高レベルインターフェイス ==
 
== 高レベルインターフェイス ==
62行目: 60行目:
 
ハードウェアが {{ic|deep}} スリープ状態を広告していない場合、UEFI にそのような設定がないか確認してください。通常、''Power'' や ''Sleep state'' などのような項目にあります。S0ix のオプションは ''Windows 10'' や ''Windows and Linux'' や ''S3/Modern standby support'' という名前です。S3 スリープのオプションは ''Legacy''、''Linux''、''Linux S3''、''S3 enabled'' という名前です。設定できない場合、{{ic|s2idle}} を使い続けることもできます、[[ハイバネート]] を使うことを検討するか、[[DSDT]] テーブルにパッチを当ててみてください (あるいは、パッチ適用済みのバージョンを見つけてください)。
 
ハードウェアが {{ic|deep}} スリープ状態を広告していない場合、UEFI にそのような設定がないか確認してください。通常、''Power'' や ''Sleep state'' などのような項目にあります。S0ix のオプションは ''Windows 10'' や ''Windows and Linux'' や ''S3/Modern standby support'' という名前です。S3 スリープのオプションは ''Legacy''、''Linux''、''Linux S3''、''S3 enabled'' という名前です。設定できない場合、{{ic|s2idle}} を使い続けることもできます、[[ハイバネート]] を使うことを検討するか、[[DSDT]] テーブルにパッチを当ててみてください (あるいは、パッチ適用済みのバージョンを見つけてください)。
   
{{Note|最後の解決策、近い将来問題が発生する可能性があります。(Windows を同梱しているシステムではデフォルトで "Modern standby" を使うよう推奨されているため) メーカーは ACPI S3 状態のバグの修正を停止しています。メーカーが自発的にそれを広告していない場合、おそらく、S3 状態は何らかの形で壊れています。}}
+
{{Note|最後の解決策は将来的に問題が発生する可能性があります。Windows を同梱しているシステムではデフォルトで "Modern standby" を使うよう推奨されているためメーカーは ACPI S3 状態のバグの修正を停止しています。メーカーが自発的にそれを広告していない場合、おそらく、S3 状態は何らかの形で壊れています。}}
   
 
スリープの方法を変更したあと、スリープサイクルを何回かテストして、ハードウェアが S3 スリープで問題を起こさないかテストしてください:
 
スリープの方法を変更したあと、スリープサイクルを何回かテストして、ハードウェアが S3 スリープで問題を起こさないかテストしてください:
70行目: 68行目:
 
問題が無ければ、{{ic|1=mem_sleep_default=deep}} [[カーネルパラメータ]] を使って変更を永続化できます。
 
問題が無ければ、{{ic|1=mem_sleep_default=deep}} [[カーネルパラメータ]] を使って変更を永続化できます。
   
いくつかの逆の状況では、問題のあるファームウェアが{{ic|s2idle}} しかサポートしていないにも関わらず、{{ic|deep}} をサポートしていると広告することがあります。この場合、{{man|5|sleep.conf.d}} 内で {{ic|SuspendState}} を使うことにより、{{ic|s2idle}} を使うことができます:
+
いくつかの逆の状況では、問題のあるファームウェアが {{ic|s2idle}} しかサポートしていないにも関わらず、{{ic|deep}} をサポートしていると広告することがあります。この場合、{{man|5|sleep.conf.d}} 内で {{ic|SuspendState}} を使うことにより、{{ic|s2idle}} を使うことができます:
   
 
{{hc|/etc/systemd/sleep.conf.d/freeze.conf|2=
 
{{hc|/etc/systemd/sleep.conf.d/freeze.conf|2=
79行目: 77行目:
 
== ハイバネーション ==
 
== ハイバネーション ==
   
ハイバネーションを使には、[[スワップ]]パーティションかスワップファイルを作成する必要があります。そ{{ic|1=resume=}} カーネルパラメータを使ってスワップを指定してください。カーネルパラメータはブートローダ設定ます。[[#initramfs の設定|initramfs の設定]]も必要になりす。設定によってカーネル初期ユーザ空間でされたスワップからの復帰を試みま。以下ではスワップの作成・カーネルパラメータの設定initramfs 設定いて詳細に説明ます。
+
ハイバネーションを使用するには、[[スワップ]]パーティションかスワップファイルを作成し{{ic|1=resume=}} カーネルパラメータでそのスワップを指定しなければなりません (カーネルパラメータはブートローダによって設定されます)。また、カーネル初期ユーザ空間でスワップからの復帰を行うようにるために、[[#initramfs の設定|initramfs 設定]]する必要があります。これら 3 の手順は以下で詳細に説明されています。
   
 
{{Note|
 
{{Note|
 
* [[ディスク暗号化]]を利用する場合は[[Dm-crypt/スワップの暗号化#suspend-to-disk を使用する]]を見てください。
 
* [[ディスク暗号化]]を利用する場合は[[Dm-crypt/スワップの暗号化#suspend-to-disk を使用する]]を見てください。
 
* {{Pkg|linux-hardened}}はハイバネーションをサポートしていません。詳しくは{{Bug|63648}}を見てください。
 
* {{Pkg|linux-hardened}}はハイバネーションをサポートしていません。詳しくは{{Bug|63648}}を見てください。
  +
* zram 上のスワップへのハイバネートはサポートされていません。たとえ zram が永久記憶装置上のバッキングデバイスを使うように設定されていたとしてもです。''logind'' は、zram 上のスワップ領域へハイバネートしようとする試みから保護します。
 
}}
 
}}
   
132行目: 131行目:
 
==== スワップファイルにハイバネーション ====
 
==== スワップファイルにハイバネーション ====
   
  +
[[スワップファイル]]を使うには、[[カーネルパラメータ]] {{ic|1=resume=UUID=''swap_device_uuid''}} と {{ic|1=resume_offset=''swap_file_offset''}} の両方を設定する必要があります。[https://docs.kernel.org/power/swsusp-and-swap-files.html カーネルのドキュメント]を参照してください。
{{Note|[[Btrfs]] については、[[#Btrfs 上のスワップファイルへのハイバネーション]] を見てください。}}
 
   
  +
{{ic|''swap_device''}} は、スワップファイルの存在するボリュームであり、[[永続的なブロックデバイスの命名#カーネルパラメータ|root パラメータ]]と同じ形式に従います。
[[スワップ#手動設定|スワップファイル]] を使用するには {{ic|1=resume=UUID=''swap_device_uuid''}} だけでなく、{{ic|1=resume_offset=''swap_file_offset''}} [[カーネルパラメータ]]も設定する必要があります。[https://docs.kernel.org/power/swsusp-and-swap-files.html カーネルのドキュメント]を見てください。
 
   
{{ic|''swap_device''}} はスワップファイルが存在するボリュームで、[[永続的なブロックデバイスの命名#カーネルパラメータ|root パラメータ]]と同じ形式に従います。{{ic|''swap_file_offset''}} の値は {{ic|filefrag -v ''swap_file''}} を実行することでできます。テーブル形式で出力され、必要な値は {{ic|physical_offset}} カラム一番上にあります。例えば:
+
Btrfs 以外のファイルシステムで、{{ic|''swap_file_offset''}} の値は {{ic|filefrag -v ''swap_file''}} を実行することで得られます。このコマンドは表を出力します。必要な値は {{ic|physical_offset}} 最初にあります。
  +
  +
例えば:
   
 
{{hc|# filefrag -v /swapfile|
 
{{hc|# filefrag -v /swapfile|
148行目: 149行目:
 
}}
 
}}
   
この例では {{ic|''swap_file_offset''}} の値は2つのピリオドが付いている最初の {{ic|38912}} です。
+
この例では{{ic|''swap_file_offset''}} の値は2つのピリオドが付いている最初の {{ic|38912}} であり、カーネルパラメータは {{ic|1=resume_offset=38912}} となります。
  +
  +
[[Btrfs]] の場合、''filefrag'' ツールは使わないでください。''filefrag'' から得られる "physical" オフセットの値は、ディスク上の実際の物理オフセットとは異なるからです。複数のデバイスをサポートするために、仮想的なディスクアドレス空間が存在するのです。[https://bugzilla.kernel.org/show_bug.cgi?id=202803] 代わりに、{{man|8|btrfs-inspect-internal}} コマンドを使ってください。例えば:
  +
  +
{{hc|# btrfs inspect-internal map-swapfile -r /swap/swapfile|
  +
198122980
  +
}}
  +
  +
この例では、{{ic|''swap_file_offset''}} は {{ic|198122980}} であり、カーネルパラメータは {{ic|1=resume_offset=198122980}} となります。
   
 
{{Tip|
 
{{Tip|
 
* 次のコマンドは {{ic|''swap_device_uuid''}} を特定するのに利用できます: {{ic|1=findmnt -no UUID -T /swapfile}}
 
* 次のコマンドは {{ic|''swap_device_uuid''}} を特定するのに利用できます: {{ic|1=findmnt -no UUID -T /swapfile}}
* 次のコマンドは {{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}} というキーで渡されなければなりません。この場合、再起動は必要ありません。
 
* {{ic|''swap_file_offset''}} の値は {{ic|swap-offset ''swap_file''}} を実行することによっても得られます。 ''swap-offset'' バイナリは [[uswsusp]] ツールのセットで提供されています。 もしこの方法を利用するならば、これら2つのパラメータは {{ic|/etc/suspend.conf}} 内で {{ic|resume device}} と {{ic|resume offset}} というキーで渡されなければなりません。この場合、再起動は必要ありません。
 
}}
 
}}
161行目: 170行目:
   
 
{{Tip|スワップファイルを作成する目的が、仮想メモリの拡張ではなくハイバネートがしたいだけの場合、スワップファイルの [[スワップ#Swappiness|Swappiness]] を減らすとよいでしょう。}}
 
{{Tip|スワップファイルを作成する目的が、仮想メモリの拡張ではなくハイバネートがしたいだけの場合、スワップファイルの [[スワップ#Swappiness|Swappiness]] を減らすとよいでしょう。}}
 
==== Btrfs 上のスワップファイルへのハイバネーション ====
 
 
[[Btrfs]] では filefrag ツールを使用しないでください。filefrag から取得する "物理" オフセットは、ディスク上の実際の物理オフセットではありません。複数のデバイスをサポートするために、仮想ディスクのアドレス空間があるのです。[https://bugzilla.kernel.org/show_bug.cgi?id=202803]
 
 
{{Pkg|btrfs-progs}} 6.1 では、ハイバネーションのために使用されるスワップファイルとそのオフセット値をチェックするためのコマンドが提供されています。{{man|8|btrfs-inspect-internal}} を参照してください。
 
 
{{hc|# btrfs inspect-internal map-swapfile -r ''path/to/swapfile''|198122980}}
 
   
 
==== thinly-provisioned LVM ボリュームへのハイバネーション ====
 
==== thinly-provisioned LVM ボリュームへのハイバネーション ====
180行目: 181行目:
 
ボリュームが完全に割り当てられていることを確認するには、次を使用できます:
 
ボリュームが完全に割り当てられていることを確認するには、次を使用できます:
   
{{hc|# lvs|
+
{{hc|# lvs|
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
+
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
swap vg0 Vwi-aot--- 10.00g pool 100
+
swap vg0 Vwi-aot--- 10.00g pool 100
 
}}
 
}}
   
191行目: 192行目:
 
== Intel Rapid Start Technology (IRST) ==
 
== Intel Rapid Start Technology (IRST) ==
   
Intel Rapid Start Technology とは、ハイバネートするためのハードウェア上の方法で、あらかじめ設定された時間やバッテリー状態のあとにスリープからハイバネートに移行できるようにします。IRSTは、オペレーティングシステムのレベルではなくファームウェアによって行われるので、通常のハイバネートよりも速く信頼性が高いはずです。一般的に、IRST はファームウェアで有効化する必要があり、またファームウェアで、サスペンド/バッテリイベント後にハイバネートをトリガーするまでの時間を設定できます。しかし、一部のデバイスは IRST をファームウェアでサポートしていますが、Intel の Windows ドライバからでしか設定できません。そのような場合には、以下で説明している intel-rst カーネルモジュールで Linux でもイベントを設定できるはずです。
+
Intel Rapid Start Technology とは、ハイバネートするためのハードウェア上の方法で、あらかじめ設定された時間の後やバッテリー状態に基づいてスリープからハイバネートに移行できるようにします。IRSTは、オペレーティングシステムのレベルではなくファームウェアによって行われるので、通常のハイバネートよりも速く信頼性が高いはずです。一般的に、IRST はファームウェアで有効化する必要があり、またファームウェアで、サスペンド/バッテリイベント後にハイバネートをトリガーするまでの時間を設定できます。しかし、一部のデバイスは IRST をファームウェアでサポートしていますが、Intel の Windows ドライバからでしか設定できません。そのような場合には、以下で説明している intel-rst カーネルモジュールで Linux でもイベントを設定できるはずです。
   
 
Intel Rapid Start Technology (IRST) が有効の場合、deep sleep からの再開には "[https://mjg59.dreamwidth.org/26022.html S3から再開するよりも数秒長くなりますが、ハイバネートから再開するよりもはるかに高速です]"。
 
Intel Rapid Start Technology (IRST) が有効の場合、deep sleep からの再開には "[https://mjg59.dreamwidth.org/26022.html S3から再開するよりも数秒長くなりますが、ハイバネートから再開するよりもはるかに高速です]"。
199行目: 200行目:
 
{{Warning|Intel Rapid Start パーティションは暗号化されていません。「Intel は、あなたがソフトウェアベースのディスク暗号化を使用している場合、Intel Rapid Start Technology を無効化することを推奨します。」[https://www.intel.com/content/www/us/en/support/articles/000024080/technologies.html]}}
 
{{Warning|Intel Rapid Start パーティションは暗号化されていません。「Intel は、あなたがソフトウェアベースのディスク暗号化を使用している場合、Intel Rapid Start Technology を無効化することを推奨します。」[https://www.intel.com/content/www/us/en/support/articles/000024080/technologies.html]}}
   
しかし、ドライブ全体を消去してパーティションを切り直すつもりなら (あるいはすでにそうしてしまっているなら) IRST パーティションも再作成しなければなりません。これを行うには、システムの RAM と同じサイズの空のパーティションを作成し、そのパーティションの種類が GPT パーティションの場合は [[Wikipedia:GUID Partition Table#Partition type GUIDs|GUID]] {{ic|D3BFE2DE-3DAF-11DF-BA40-E3A556D89593}} に、 MBR パーティションの場合は [https://en.wikipedia.org/wiki/Partition_type ID] {{ic|0x84}} に設定します。また、システムのファームウェア設定で IRST のサポートを有効にする必要がある場合もあります。
+
ドライブ全体を消去してパーティションを切り直すつもりなら (あるいはすでにそうしてしまっているなら) IRST パーティションも再作成しなければなりません。これを行うには、システムの RAM と同じサイズの空のパーティションを作成し、そのパーティションの種類が GPT パーティションの場合は [[Wikipedia:GUID Partition Table#Partition type GUIDs|GUID]] {{ic|D3BFE2DE-3DAF-11DF-BA40-E3A556D89593}} に、 MBR パーティションの場合は [https://en.wikipedia.org/wiki/Partition_type ID] {{ic|0x84}} に設定します。また、システムのファームウェア設定で IRST のサポートを有効にする必要がある場合もあります。
   
 
{{Tip|(サスペンド後に)IRST が開始されるまでの時間は、システムのファームウェア設定で調整できます。}}
 
{{Tip|(サスペンド後に)IRST が開始されるまでの時間は、システムのファームウェア設定で調整できます。}}
205行目: 206行目:
 
IRST ハイバネートにかかる時間 (つまり、"RAMの内容全体を特殊なパーティションに" コピーする時間) は、システムの RAM サイズと SSD 速度によって異なり、20~60秒かかります。システムによっては、プロセスの完了を(点滅を止めるなどして) LED インジケータで示す場合があります。
 
IRST ハイバネートにかかる時間 (つまり、"RAMの内容全体を特殊なパーティションに" コピーする時間) は、システムの RAM サイズと SSD 速度によって異なり、20~60秒かかります。システムによっては、プロセスの完了を(点滅を止めるなどして) LED インジケータで示す場合があります。
   
Linux で IRST ハイバネートイベントを設定するには、{{ic|1=CONFIG_INTEL_RST=y}} を設定するか、モジュールに設定されているならば intel-rst モジュールがロードされる必要があります。{{ic|modprobe intel_rst}} を実行してモジュールをロードすれば、例えば {{ic|/sys/bus/acpi/drivers/intel_rapid_start/*/wakeup_events}} などのようにファイル wakeup_events と wakeup_time が生成されるはずです。これらを用いて、さらなる設定を行うことができます。このモジュールは簡潔にドキュメント化されています。詳細は [https://github.com/torvalds/linux/blob/143a6252e1b8ab424b4b293512a97cca7295c182/drivers/platform/x86/intel/rst.c drivers/platform/x86/intel/rst.c] を見てください。
+
Linux カーネルで IRST ハイバネートイベントを設定するには、{{ic|CONFIG_INTEL_RST}} オプションでカーネルに組み込むか、ルモジュールとし利用可能である必要があります。{{ic|modprobe intel_rst}} を実行してモジュールをロードすれば、{{ic|/sys/bus/acpi/drivers/intel_rapid_start/*/}} にファイル {{ic|wakeup_events}}{{ic|wakeup_time}} が生成されるはずです。これらを用いて、さらなる設定を行うことができます。このモジュールは簡潔にドキュメント化されています。詳細は [https://github.com/torvalds/linux/blob/143a6252e1b8ab424b4b293512a97cca7295c182/drivers/platform/x86/intel/rst.c drivers/platform/x86/intel/rst.c] を見てください。
   
 
Intel Rapid Start Technology に関する情報は、[https://www.intel.com/content/www/us/en/support/articles/000024078/technologies.html general Q&A] と [https://www.intel.com/content/www/us/en/support/articles/000005836/boards-and-kits/desktop-boards.html user guides] も見てください。
 
Intel Rapid Start Technology に関する情報は、[https://www.intel.com/content/www/us/en/support/articles/000024078/technologies.html general Q&A] と [https://www.intel.com/content/www/us/en/support/articles/000005836/boards-and-kits/desktop-boards.html user guides] も見てください。
219行目: 220行目:
 
ハイバネートやサスペンドから復帰した時に画面が真っ暗になって、明確なエラーは表示されず、何もできなくなるという報告が多数存在します。これらの問題は、ノートパソコンとデスクトップの両方で確認されています。公式の解決方法ではありませんが、古いカーネル、特に LTS カーネルに切り替えることで問題が解決することがあります。
 
ハイバネートやサスペンドから復帰した時に画面が真っ暗になって、明確なエラーは表示されず、何もできなくなるという報告が多数存在します。これらの問題は、ノートパソコンとデスクトップの両方で確認されています。公式の解決方法ではありませんが、古いカーネル、特に LTS カーネルに切り替えることで問題が解決することがあります。
   
ハードウェアの watchdog タイマーを使用している場合に問題が起こることもあります(デフォルトで無効化されています、{{man|5|systemd-system.conf|OPTIONS}} の {{ic|1=RuntimeWatchdogSec=}} を見てください)。バグを起こした watchdog タイマーにより、システムがハイバネートイメージの作成を終える前に、コンピュータがリセットされることがあります。
+
ハードウェアの watchdog タイマーを使用している場合に問題が起こることもあります (デフォルトで無効化されています、{{man|5|systemd-system.conf|OPTIONS}} の {{ic|1=RuntimeWatchdogSec=}} を見てください)。バグのある watchdog タイマーにより、システムがハイバネートイメージの作成を終える前に、コンピュータがリセットされることがあります。
 
initramfs からのデバイスの初期化によって画面が表示されなくなっていることもあります。[[Mkinitcpio#MODULES]] に追加したモジュールを削除して initramfs を再生成することで問題が解決するかもしれません。特にグラフィックドライバの [[カーネルモード設定#KMS の早期開始|早期 KMS]] は問題を起こしがちです。復帰するまえにデバイスが初期化されると矛盾状態になってシステムがハイバネートから復帰できなくなります。サスペンドからの復帰の場合は関係ありません。サスペンドやハイバネートの問題をデバッグする際のベストプラクティスが [https://01.org/blogs/rzhang/2015/best-practice-debug-linux-suspend/hibernate-issues こちらの記事] に記載されています。
 
   
  +
時々、initramfs 内からのデバイスの初期化によって黒画面が発生することがあります。[[Mkinitcpio#MODULES]] 内にあるモジュールを削除し、{{ic|kms}} フックを削除し、initramfs を再ビルドすると、この問題を解決できる可能性があります (特に、[[カーネルモード設定#KMS の早期開始|KMS の早期開始]]が設定されたグラフィックスドライバの場合)。復帰前にそのようなデバイスを初期化すると、整合性がなくなり、システムのハイバネートからの復帰を妨げてしまう可能性があります。これは RAM からの復帰には影響しません。また、ブログ記事 [https://01.org/blogs/rzhang/2015/best-practice-debug-linux-suspend/hibernate-issues best practices to debug suspend issues] も確認してください。
[[radeon]] ビデオドライバから新しい [[AMDGPU]] ドライバに変更すると、ハイバネートとハイバネートからの復帰のプロセスが成功するかもしれません。
 
   
  +
[[ATI]] ビデオドライバから新しい [[AMDGPU]] ドライバに移行すると、ハイバネートと復帰のプロセスを成功させることができる可能性があります。
Intel グラフィックドライバの場合は、早期 KMS を有効化することにより、真っ暗な画面の問題を解決できることがあります。詳細は [[カーネルモード設定#KMS の早期開始]]を見てください。
 
   
カーネル 4.15.3 にアップグレドした後にサスペンド/ハイバネートからの復帰に失敗し、真っ暗な画面でカーソルが固まる(点滅はしない)ようになることがあります。{{ic|nvidiafb}} モジュールを[[ブラックリスト]]に追加すると解決するかもしれません。[https://bbs.archlinux.org/viewtopic.php?id=234646]
+
[[NVIDIA]] ザは、{{ic|nvidiafb}} モジュールを[[ブラックリスト|ブラックリスト化]]すると、問題が解決するかもしれません。[https://bbs.archlinux.org/viewtopic.php?id=234646]
   
 
Intel CPU を搭載していて、タッチパッドのために {{ic|intel_lpss_pci}} をロードするノート PC では、復帰時にカーネルパニックを引き起こすことがあります(この時、caps lock が点滅する) [https://bbs.archlinux.org/viewtopic.php?id=231881]。このモジュールは、以下のように [[initramfs]] に追加する必要があります:
 
Intel CPU を搭載していて、タッチパッドのために {{ic|intel_lpss_pci}} をロードするノート PC では、復帰時にカーネルパニックを引き起こすことがあります(この時、caps lock が点滅する) [https://bbs.archlinux.org/viewtopic.php?id=231881]。このモジュールは、以下のように [[initramfs]] に追加する必要があります:
   
{{hc|head=/etc/mkinitcpio.conf|output=
+
{{hc|/etc/mkinitcpio.conf|2=
 
MODULES=(... intel_lpss_pci ...)
 
MODULES=(... intel_lpss_pci ...)
 
}}
 
}}
245行目: 244行目:
 
[[電源管理/復帰トリガー#サスペンドからすぐに復帰する]] を見てください。
 
[[電源管理/復帰トリガー#サスペンドからすぐに復帰する]] を見てください。
   
AMD CPU 上で Linux カーネル 6.1 以上を使用している場合、これは[https://gitlab.freedesktop.org/drm/amd/-/issues/2357 カーネル内の s3 関連の制御ポリシーの問題]が原因である可能性もあります。一時的な解決策は、関連する i2c デバイスの復帰をオフにすることです。関連する i2c デバイスは以下のコマンドで見つけられます:
+
AMD CPU 上で Linux カーネル 6.1 以上を使用している場合、これは[https://gitlab.freedesktop.org/drm/amd/-/issues/2357 カーネル内の S3 関連の制御ポリシーの問題]が原因である可能性もあります。一時的な解決策は、関連する i2c デバイスの復帰をオフにすることです。関連する i2c デバイスは以下のコマンドで見つけられます:
   
 
$ ls /sys/bus/i2c/devices/*/power/wakeup
 
$ ls /sys/bus/i2c/devices/*/power/wakeup
275行目: 274行目:
 
[[#ハイバネートした時にシステムの電源が落ちない]] で説明したように {{ic|1=HibernateMode=shutdown}} を設定することで、この問題を永久に解決できます。すでにシステムから締め出されてしまっている場合、システムを4回再起動 (毎回、エラーが表示されるまで待ってください) してみることで、一部の BIOS 上では通常のブート手順を強制することができます。
 
[[#ハイバネートした時にシステムの電源が落ちない]] で説明したように {{ic|1=HibernateMode=shutdown}} を設定することで、この問題を永久に解決できます。すでにシステムから締め出されてしまっている場合、システムを4回再起動 (毎回、エラーが表示されるまで待ってください) してみることで、一部の BIOS 上では通常のブート手順を強制することができます。
   
{{TranslationStatus|Power management/Suspend and hibernate|2023-03-05|769924}}
+
{{TranslationStatus|Power management/Suspend and hibernate|2023-07-03|781739}}

2023年7月3日 (月) 19:58時点における版

関連記事

サスペンドの複数の方法を利用できます。とりわけ:

Suspend to idle
Intel は S0ix と呼んでおり、Microsoft は Modern Standby (以前は "Connected Standby") と呼んでいます。Linux カーネルでは S2Idle と呼ばれています。サポートされているシステムにおいて S3 スリープ状態の代わりに使用されるように設計されており、同等の節電機能を提供しますが、復帰に掛かる時間が大幅に短縮されます。
ヒント: WindowsmacOS はネットワーク活動のためにこの状態のデバイスの復帰をサポートしているので、これらの OS においてこの状態はバッテリーの消耗問題の影響を受けます。一方、Linux のソフトウェアエコシステムは現在この機能を使用しないため、影響を受けないはずです。
Suspend to RAM (サスペンド、スリープとも呼ばれます)
ACPI で S3 スリープ状態として定義されています。RAM を除くマシンのほとんど全てのパーツの電源を切ります。RAM への電源はマシンの状態を保存するために必要です。電力を多く節約できるので、ラップトップでは、バッテリーでコンピュータが稼働していてフタが閉じられた時 (もしくはユーザーが長い間操作しなかった時) は自動的にこのモードに移行するのが得策でしょう。
Suspend to disk (ハイバネートとも呼ばれます)
ACPI で S4 スリープ状態として定義されています。マシンの状態をスワップ領域に保存してマシンの電源を完全にオフにします。マシンに電源を入れた時、状態が復元されます。それまでは、電力消費量はゼロです。
Hybrid suspend
サスペンドとハイバネートのハイブリッドです。Suspend to both と呼ばれることもあります。マシンの状態をスワップ領域に保存しますが、マシンの電源を切りません。代わりに、デフォルトのサスペンドを呼び出します。これによって、バッテリーを使いきっても、システムは即座に復帰できます。バッテリーが枯渇した時は、システムはディスクから復帰し、RAM からの復帰に比べて時間がかかりますが、システムの状態が失われることはありません。

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

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

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

カーネル (swsusp)

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

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

ユーザ空間 (uswsusp)

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

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

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

systemd

systemd はサスペンド・ハイバネート・ハイブリッドサスペンドを行うためのネイティブのコマンドを提供しています。詳しくは 電源管理#systemd による電源管理 を見て下さい。これは Arch Linux で使われているデフォルトのインターフェースです。

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

サスペンドの方法を変更する

S0ix サスペンドが通常の S3 スリープと同じ節電機能を提供しないシステム、あるいは、電力を節約することが復帰を高速化することよりも優先される場合においては、デフォルトのサスペンド方法を変更することが可能です。

ヒント: S0ix は S3 スリープと同等かより高い節電性能を提供するはずです。意図通りに S0ix を機能させることができるかどうかは、次の Intel のブログ投稿を参照してください: How to achieve S0ix states in LinuxLinux S0ix TroubleshootingIdling Efficiently on Linux: A Case Study

まず、以下の例のように、ハードウェアが他のサスペンド法のサポートを広告しているかどうか確認します:

$ cat /sys/power/mem_sleep
[s2idle] shallow deep

ハードウェアが deep スリープ状態を広告していない場合、UEFI にそのような設定がないか確認してください。通常、PowerSleep state などのような項目にあります。S0ix のオプションは Windows 10Windows and LinuxS3/Modern standby support という名前です。S3 スリープのオプションは LegacyLinuxLinux S3S3 enabled という名前です。設定できない場合、s2idle を使い続けることもできます、ハイバネート を使うことを検討するか、DSDT テーブルにパッチを当ててみてください (あるいは、パッチ適用済みのバージョンを見つけてください)。

ノート: 最後の解決策は将来的に問題が発生する可能性があります。Windows を同梱しているシステムではデフォルトで "Modern standby" を使うよう推奨されているため、メーカーは ACPI S3 状態のバグの修正を停止しています。メーカーが自発的にそれを広告していない場合、おそらく、S3 状態は何らかの形で壊れています。

スリープの方法を変更したあと、スリープサイクルを何回かテストして、ハードウェアが 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

ハイバネーション

ハイバネーションを使用するには、スワップパーティションかスワップファイルを作成し、resume= カーネルパラメータでそのスワップを指定しなければなりません (カーネルパラメータはブートローダによって設定されます)。また、カーネルが初期ユーザ空間で特定のスワップからの復帰を行うようにするために、initramfs も設定する必要があります。これら 3 つの手順は以下で詳細に説明されています。

ノート:
  • ディスク暗号化を利用する場合はDm-crypt/スワップの暗号化#suspend-to-disk を使用するを見てください。
  • linux-hardenedはハイバネーションをサポートしていません。詳しくはFS#63648を見てください。
  • zram 上のスワップへのハイバネートはサポートされていません。たとえ zram が永久記憶装置上のバッキングデバイスを使うように設定されていたとしてもです。logind は、zram 上のスワップ領域へハイバネートしようとする試みから保護します。

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

スワップパーティションが 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つのスワップパーティション/スワップファイルに収まらなければなりません。[1]

initramfs の設定

  • initramfsbase フックを使っている場合 (Arch ではデフォルトで使っています)、/etc/mkinitcpio.confresume フックを追加する必要があります。ラベルあるいは UUID どちらを使用している場合でもスワップパーティションは udev デバイスノードによって参照されるので、resume フックは必ず filesystems の前に追加してください。デフォルトのフック設定に resume フックを追加すると以下のようになります:
HOOKS=(base udev autodetect keyboard modconf block filesystems resume fsck)
変更を適用するために initramfs の再生成を忘れずに行ってください。
ノート: LVM を使っている場合は resume フックを lvm2 の後に追加してください。
  • 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/resumemajor:minor という形式で書き込んでください。スワップファイルを使用している場合は、追加で /sys/power/resume_offset に resume オフセットを書き込んでください。[2]

例えば、スワップデバイスが 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_uuidresume_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" オフセットの値は、ディスク上の実際の物理オフセットとは異なるからです。複数のデバイスをサポートするために、仮想的なディスクアドレス空間が存在するのです。[3] 代わりに、btrfs-inspect-internal(8) コマンドを使ってください。例えば:

# btrfs inspect-internal map-swapfile -r /swap/swapfile
198122980

この例では、swap_file_offset198122980 であり、カーネルパラメータは resume_offset=198122980 となります。

ヒント:
  • 次のコマンドは swap_device_uuid を特定するのに利用できます: findmnt -no UUID -T /swapfile
  • 次のコマンドは、Btrfs 以外のファイルシステムで swap_file_offset を特定するのに利用できます: filefrag -v /swapfile | awk '$1=="0:" {print substr($4, 1, length($4)-2)}'
  • swap_file_offset の値は swap-offset swap_file を実行することによっても得られます。 swap-offset バイナリは uswsusp ツールのセットで提供されています。 もしこの方法を利用するならば、これら2つのパラメータは /etc/suspend.conf 内で resume deviceresume offset というキーで渡されなければなりません。この場合、再起動は必要ありません。
ノート:
  • 暗号化コンテナ (LUKS)、 RAID、 LVM のようなスタックブロックデバイスでは、resume パラメータはスワップファイルのあるファイルシステムを含んでいる、アンロックまたはマップされたデバイスを指していなければなりません。
  • スワップファイルが /home/ に存在する場合、systemd-logind はスワップファイルのサイズを正しく判断することができないため、以下のメッセージによりハイバネートを停止します: Failed to hibernate system via logind: Not enough swap space for hibernation。2つの回避策については systemd issue 15354 をご覧ください。
ヒント: スワップファイルを作成する目的が、仮想メモリの拡張ではなくハイバネートがしたいだけの場合、スワップファイルの Swappiness を減らすとよいでしょう。

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%のデータ使用量であると表示されます。

警告: 休止状態に使用される thinly-provisioned されたスワップボリュームで TRIM を使用しないでください。つまり、 /etc/fstabdiscard を使用しないでください。 swapon-d/--discard オプション。 そうしないと、使用済みスペースの割り当てが解除されます。

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 と同じサイズの未フォーマットパーティションとして表示されます。

警告: Intel Rapid Start パーティションは暗号化されていません。「Intel は、あなたがソフトウェアベースのディスク暗号化を使用している場合、Intel Rapid Start Technology を無効化することを推奨します。」[4]

ドライブ全体を消去してパーティションを切り直すつもりなら (あるいはすでにそうしてしまっているなら) IRST パーティションも再作成しなければなりません。これを行うには、システムの RAM と同じサイズの空のパーティションを作成し、そのパーティションの種類が GPT パーティションの場合は GUID D3BFE2DE-3DAF-11DF-BA40-E3A556D89593 に、 MBR パーティションの場合は ID 0x84 に設定します。また、システムのファームウェア設定で IRST のサポートを有効にする必要がある場合もあります。

ヒント: (サスペンド後に)IRST が開始されるまでの時間は、システムのファームウェア設定で調整できます。

IRST ハイバネートにかかる時間 (つまり、"RAMの内容全体を特殊なパーティションに" コピーする時間) は、システムの RAM サイズと SSD 速度によって異なり、20~60秒かかります。システムによっては、プロセスの完了を(点滅を止めるなどして) LED インジケータで示す場合があります。

Linux カーネルで IRST ハイバネートイベントを設定するには、CONFIG_INTEL_RST オプションでカーネルに組み込むか、カーネルモジュールとして利用可能である必要があります。modprobe intel_rst を実行してモジュールをロードすれば、/sys/bus/acpi/drivers/intel_rapid_start/*/ にファイル wakeup_eventswakeup_time が生成されるはずです。これらを用いて、さらなる設定を行うことができます。このモジュールは簡潔にドキュメント化されています。詳細は drivers/platform/x86/intel/rst.c を見てください。

Intel Rapid Start Technology に関する情報は、general Q&Auser guides も見てください。

トラブルシューティング

ACPI_OS_NAME

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

サスペンド/ハイバネートが動作しない、あるいはたまに動作しなくなる

ハイバネートやサスペンドから復帰した時に画面が真っ暗になって、明確なエラーは表示されず、何もできなくなるという報告が多数存在します。これらの問題は、ノートパソコンとデスクトップの両方で確認されています。公式の解決方法ではありませんが、古いカーネル、特に LTS カーネルに切り替えることで問題が解決することがあります。

ハードウェアの watchdog タイマーを使用している場合に問題が起こることもあります (デフォルトで無効化されています、systemd-system.conf(5) § OPTIONSRuntimeWatchdogSec= を見てください)。バグのある watchdog タイマーにより、システムがハイバネートイメージの作成を終える前に、コンピュータがリセットされることがあります。

時々、initramfs 内からのデバイスの初期化によって黒画面が発生することがあります。Mkinitcpio#MODULES 内にあるモジュールを削除し、kms フックを削除し、initramfs を再ビルドすると、この問題を解決できる可能性があります (特に、KMS の早期開始が設定されたグラフィックスドライバの場合)。復帰前にそのようなデバイスを初期化すると、整合性がなくなり、システムのハイバネートからの復帰を妨げてしまう可能性があります。これは RAM からの復帰には影響しません。また、ブログ記事 best practices to debug suspend issues も確認してください。

ATI ビデオドライバから新しい AMDGPU ドライバに移行すると、ハイバネートと復帰のプロセスを成功させることができる可能性があります。

NVIDIA ユーザは、nvidiafb モジュールをブラックリスト化すると、問題が解決するかもしれません。[5]

Intel CPU を搭載していて、タッチパッドのために intel_lpss_pci をロードするノート PC では、復帰時にカーネルパニックを引き起こすことがあります(この時、caps lock が点滅する) [6]。このモジュールは、以下のように 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:00i2c-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)HibernateModeshutdown に設定すると問題が解決するかもしれません。 ​

/etc/systemd/sleep.conf.d/hibernatemode.conf
[Sleep]
HibernateMode=shutdown

​ 上記の設定により、その他の設定が正しく行われていれば、systemctl hibernate を実行するとマシンがシャットダウンし、状態をディスクに保存します。

ハイバネート後に起動するとオペレーティングシステムが見つからない (または、間違った OS が起動する)

これは、ブートディスクが外部ディスクである場合に起こる可能性があります。BIOS/ファームウェアの制限が原因であるようです。ハイバネーションは外部 (あるいは別の) ディスク上の OS から行われたが、BIOS/ファームウェアは内部ディスクから起動を試みてしまっているのです。

#ハイバネートした時にシステムの電源が落ちない で説明したように HibernateMode=shutdown を設定することで、この問題を永久に解決できます。すでにシステムから締め出されてしまっている場合、システムを4回再起動 (毎回、エラーが表示されるまで待ってください) してみることで、一部の BIOS 上では通常のブート手順を強制することができます。

翻訳ステータス: このページは en:Power management/Suspend and hibernate の翻訳バージョンです。最後の翻訳日は 2023-07-03 です。もし英語版に 変更 があれば、翻訳の同期を手伝うことができます。