サスペンドとハイバネーション

サスペンドハイバネーションWindowsで言うところのスタンバイ、休止状態は、現在ノートパソコンに限らず便利なものとして使われている。これはLinuxにおいても例外ではなく2.6カーネルでは当然ながらサポートされている。@IT:ACPIで電源管理を行うにはという記事によれば簡単な一行のコマンドを実行するだけでよい。但し、この記事にはずっと放置されている誤りがあるようで、 "/etc/power/state" に書き込んでも無駄で、"/sys/power/state"に書き込まねばならない。しかし、当然ながら、DELL Latitude D400上のFedora 7(2.6.22.9-91.fc7) では何の設定もなしに'Fn + Esc'のホットキーでサスペンドすることは出来ない。そこでいくらかGoogleで調べて、Open Tech Press | LinuxノートPCのサスペンドとハイバネーションという記事を参考に設定を施してみることにした。
まず、サスペンド復帰後に画面が真っ暗になったままになるのを防ぐため、xorg.confのDeviceセクションに'Option "VBERestore" "true"'と追記する。

Section "Device"
	Identifier	"Videocard0"
	Driver		"i810"
	VendorName	"Intel Corporation"
	BoardName	"Intel Corporation 82852/855GM Integrated Graphics Device"
	BusID		"PCI:0:2:0"
	Screen		0
	Option		"VBERestore" "true"
EndSection

次に、キーの押下イベント発生により自動的にサスペンドさせるため、acpidをインストールする。

# yum -y install acpid

ちなみに、この記事執筆時点での最新版は1.0.4-7.fc7のようだ。その後、Linux on Let's note CF-W4:Fnキー+F7でサスペンドを参考に'Fn + Esc'でどのようなイベントが起きるのかを見てみる。

$ acpi_listen
button/sleep SBTN 00000080 00000001

次にノートパソコンを閉じる時に起きるイベントを確認する。

$ acpi_listen
button/lid LID 00000080 00000001
video VID 00000080 00000000
button/lid LID 00000080 00000002

そして、以下のファイルを作成する。

ファイル名: /etc/acpi/events/hibernate.conf

# ACPID config to hibernate the machine.

event=button/sleep.*
action=/etc/acpi/actions/hibernate.sh

ファイル名: /etc/acpi/events/suspend.conf

# ACPID config to suspend the machine.

event=button/lid.*
action=/etc/acpi/actions/suspend.sh

ファイル名: /etc/acpi/actions/hibernate.sh

#!/bin/sh

# Write all unwritten data on the RAM to the disk
sync
sync
sync

# Suspend to RAM
echo -n disk > /sys/power/state

ファイル名: /etc/acpi/actions/suspend.sh

#!/bin/sh

# Write all unwritten data on the RAM to the disk
sync
sync
sync

# Suspend to RAM
echo -n mem > /sys/power/state

# Switch to the first virtual terminal and then to the seventh one
chvt 1
chvt 7

以上のファイルでは、'Fn + Esc'押下時にハイバーネイトし、ノートパソコンを閉じたときにサスペンドするようにしている。また、Open Tech Pressの記事とは異なり、ビデオ関連の設定は問題が無かったので省き、なぜかサスペンドからの復帰後、仮想ターミナル1に切り替え、7に戻ると画面が正常に戻ることを利用して、画面が正常に戻らない問題に対処している。
その後、/etc/acpi/actions以下のファイルに実行権限を付与し、acpidを再起動する。

# chmod u+x /etc/acpi/actions/*.sh
# /etc/init.d/acpid restart

あとは、実際にイベントを発生させ、設定が正しいかどうか検証するだけだ。
これで簡単な操作でハイバネーションサスペンドすることが出来る。今まではターミナルから直接コマンドを叩いていたので、今後は便利に使えそうだ。