# Suspend and Hibernate (日本語)

関連記事

- Uswsusp
- TuxOnIce
- systemd
- pm-utils
- Suspending to RAM with hibernate-script
- Suspending to Disk with hibernate-script

現在サスペンドには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 の記事を参照してください。

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

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

### systemd

systemd はサスペンド・ハイバネート・ハイブリッドサスペンドを行うためのネイティブのコマンドを提供しています。詳しくは Power Management (日本語)#systemd による電源管理 を見て下さい。

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

### pm-utils

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

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

## Suspend to RAM

Suspend to RAM は何も設定しなくても動作するはずです。

## ハイバネーション

ハイバネーションを使うには、スワップパーティションかスワップファイルを作成する必要があります。詳しくは Swap (日本語) を見て下さい。

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

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

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

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

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

カーネルパラメータ `resume=<swap_partition>` を使う必要があります。`<swap_partition>` にはスワップパーティションのカーネル名 (`/dev/sda1`) か、スワップパーティションの UUID を使うことができます。詳しくはブートローダ別の例がある Kernel parameters (日本語) を参照してください。

例えば、GRUB2 ならば `GRUB_CMDLINE_LINUX_DEFAULT` 変数が使えます:

    /etc/default/grub

    GRUB_CMDLINE_LINUX_DEFAULT="resume=/dev/sda1"

または UUID を使う場合:

    /etc/default/grub

    GRUB_CMDLINE_LINUX_DEFAULT="resume=PARTUUID=4209c845-f495-4c43-8a03-5363dd433153"

後で `grub-mkconfig -o /boot/grub/grub.cfg` を実行することを忘れないで下さい。

Tip: As an alternative, for GRUB2 you may try this solution from debian wiki, which automatically adds your first swap partition to `resume=` parameter to all found linux entries.

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

スワップパーティションの代わりにスワップファイルを使うには追加のカーネルパラメータ `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>` の値は `38912` です。

Tip: `<Swap File Offset>` の値は `swap-offset <Swap File>` でも取得することができます。swap-offset バイナリは uswsusp-git パッケージに含まれています。
Note:

- カーネルパラメータ `resume` にはスワップファイル自体ではなく、スワップファイルが含まれているパーティションのデバイスを記入する必要があることに注意してください。パラメータ `resume_offset` は resume デバイスのどこからスワップファイルがあるかを示しています。
- uswsusp を使う場合、キー `resume device` と `resume offset` を使って `/etc/suspend.conf` にこれら2つのパラメータを記述してください。

### initial ramdisk を再生成

initramfs を使っている場合 (Arch ではデフォルトで使っています)、mkinitcpio の設定にある HOOKS に `resume` フックを追加する必要があります:

    /etc/mkinitcpio.conf

    # resume must be placed after block and lvm2, but before filesystems
    HOOKS="... block lvm2 resume filesystems ..."

最後に、initrd イメージを再生成して変更を適用してください:

    # mkinitcpio -p linux

Note: カスタムカーネルを使っているのならば、`-p` オプションの値は必要に応じて変えて下さい。

## トラブルシューティング

### ACPI_OS_NAME

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

### VAIO ユーザー

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

Category:

- Power management (日本語)