Desktop Linux Memo

Suspend to Disk

最終更新:

匿名ユーザー

- view
管理者のみ編集可

Suspend to Disk


Suspend to Diskとは、ウインドウズでいうところの「休止」である。実行中の Linux 環境をそのままハードディスクに記録してからパソコンの電源を落とし、次に電源を入れ直したときにハードディスクから以前の状態を読み込み直して、以前の状態にそのまま復帰するという機能だ。ハードディスクに記録する分、それなりの時間がかかるのがデメリットであるが、Suspend to Memory と違って電気をまったく必要としないがメリットである。

二つの Suspend to Disk


Suspend to Disk はカーネルレベルで実現する必要がある。バージョン2.6以降のkernelならば swsusp という名前の機能が標準で実装されている。他にも、2.4のころから softwre suspend を実装していたプロジェクトとして有名な Suspend2というものもある。

カーネルに標準で実装されているという意味で、前者の方が楽である。しかし、後者の Suspend2 にはイメージの圧縮という機能があるとか、スワップファイル(パーティションじゃない)を使えるといったいくつかのメリットがあり、それらに魅力を感じる環境の人は Suspend2 を使う方がいいだろう。

私は長らく Suspend2 の方を好んで使っていたが、最近ではカーネル標準の swsusp でも機能的には満足できるようになってきたため、手間が少くて済む swsusp を使うようになった。ここではカーネル標準の swsups の使い方を簡単にまとめておく。

準備


swsups はカーネル2.6から実装された機能である。まずは 2.6 系のカーネルを準備する必要がある。また、Suspend する際に使用するハードディスク領域としてはlinuxのスワップパーティションを使う。そのためメモリ容量よりも大きなスワップパーティションが必要となる。

最近はスワップパーティションを作らないとか、作ってもすごく小さくするようなケースも増えているようなので、スワップの確保が一番難しいところだろうか。もしもスワップ領域を準備できないようならば、Suspend2 を使うしかないだろう。

カーネルコンパイル


カーネルの設定


cd /usr/src/linux
make menuconfig

としてカーネル設定に入る。Power management option -> Software Suspend を On にする。Default resume partiotinとしてスワップパーティションを指定する。たとえば /dev/sda3 などとする。

もちろん、その他の項目も適切に設定しておく。

コンパイル


コンパイル、インストールもいつものようにすればいい。適当にどっかの文章を読めばいいけど、ま、こんな感じだ。

make all && make modules_install
make install

/boot 以下に新しいカーネルのイメージがインストールされているはずだ。

grub の設定


/etc/grub/grub.conf を適宜編集する。スワップパーティションを適切に設定してからカーネルコンパイルをしたのならば、新に何かを指定する必要はない。

swsusp の実行


まずは新しいカーネルでLinuxを起動し直す。そして、下記コマンドを実行する。

echo -n disk /sys/power/state

これでメモリイメージがハードディスク(スワップパーティション)にダンプされ、電源が落ちるはずだ。

次に同じカーネルからLinuxを起動し直せば、スワップパーティションからメモリイメージを読み直して、前回の状況が回復するはずである。

acpi の設定


swsuspを実行するのに、毎回コマンドを実行するのも億劫なものだ。ウインドウズのように電源ボタンを押したら自動で swsusp が動くようにしたい。そのためには acpid を使う。
emerge acpid
起動はいつものように
/etc/init.d/acpid start
でよい。標準のサービスとするために
rc-update add acpid default
も実行しておくとよいだろう。

acpid を起動しておくと、電源ボタンが押されると /etc/acpi/events/default というファイルが評価される。そして結果として /etc/acpi/default.sh が呼び出されることになる。したがって、電源ボタンを押したときの処理は /etc/acpi/default.shに記述すればよい。

#!/bin/sh
# Default acpi script that takes an entry for all actions

set $*

group=${1/\/*/}
action=${1/*\//}

case "$group" in
   button)
       case "$action" in
           power)
               # hibernation by swsusp
               echo -n disk > /sys/power/state
               ;;
           *)  logger "ACPI action $action is not defined"
               ;;
       esac
       ;;

   *)
       logger "ACPI group $group / action $action is not  defined"
                ;;
esac

まぁ、こんな感じだ。ときとして module をアンロードしておかないと swsups がうまくいかない場合があるので、その場合はここで modprobe を適当に実行したりすればいい。
目安箱バナー