28 June 2008

CentOS 5.2でのスリープ実現

CentOS 5.2 (Kernel 2.6)のシャットダウン ダイアログに、「サスペンド(スリープ)」のボタンが無い。 そのかわり、メインメニューに「サスペンド」メニューがあるが、復帰後に画面が表示されない不具合がある。

20080628-shutdown-dlg.png
シャットダウン ダイアログ

20080628-suspend-btn.png
メインメニューのサスペンド

電源管理 pm-utils を用いた方法

メインメニューの「サスペンド」メニューも、この方法に入る。

コマンドラインでサスペンド(スリープ)させて、うまく復帰できるオプションを見つけ出す。今回利用しているマシンでは、--quirk-vbemode-restore オプションを付けると、画面が復帰することがわかった。 (オプションを付けなくても、CTRL + ALT + F7 を押すと画面復帰するので、単にビデオ出力ICの設定が戻っていないだけだと判断が付く。


[root@localhost ~]# pm-suspend --quirk-vbemode-restore

オプションの一覧は、pm-suspendコマンド (これはシンボリックリンクで、実は pm-action というスクリプトファイルが呼ばれている)を読めばわかる。

/usr/lib/pm-utils/bin/pm-action

--quirk-dpms-on)
export DISPLAY_QUIRK_DPMS_ON="true"
export QUIRKOPTS="true" ;;
--quirk-dpms-suspend)
export DISPLAY_QUIRK_DPMS_SUSPEND="true"
export QUIRKOPTS="true" ;;
--quirk-radeon-off)
export DISPLAY_QUIRK_RADEON_OFF="true"
export QUIRKOPTS="true" ;;
--quirk-s3-bios)
export DISPLAY_QUIRK_S3_BIOS="true"
export QUIRKOPTS="true" ;;
--quirk-s3-mode)
export DISPLAY_QUIRK_S3_MODE="true"
export QUIRKOPTS="true" ;;
--quirk-vbe-post)
export DISPLAY_QUIRK_VBE_POST="true"
export QUIRKOPTS="true" ;;
--quirk-vbemode-restore)
export DISPLAY_QUIRK_VBEMODE_RESTORE="true"
export QUIRKOPTS="true" ;;
--quirk-vbestate-restore)
export DISPLAY_QUIRK_VBESTATE_RESTORE="true"
export QUIRKOPTS="true" ;;

--quirk-vga-mode3)
export DISPLAY_QUIRK_VGA_MODE_3="true"
export QUIRKOPTS="true" ;;
--quirk-none)
export QUIRKOPTS="true" ;;
--quirk-old)
export FROM_HAL="true"
export AUTO_QUIRK="true"
export QUIRKOPTS="true" ;;
--from-hal)
export FROM_HAL="true" ;;

うまくサスペンドするようになれば、自動的に必要なオプションが付加されるように、設定ファイルにオプションを書き加える。 ここで、 suspend.cfg というファイル名としているが、ディレクトリ内の全てのファイルを実行してくれるので、ファイル名は何でもよい。

/etc/pm/config.d/suspend.cfg

#!/bin/sh
# for X video resume
export DISPLAY_QUIRK_VBEMODE_RESTORE="true"
export QUIRKOPTS="true"

設定スクリプトに実行許可属性をあたえる


[root@localhost ~]# chmod +x /etc/pm/config.d/suspend.cfg

ここまでの設定で、画面は戻るようになったが、CPUクロックの自動調整がうまくいかなくなっていたので、復帰後にそのあたりを修正するスクリプトを作成する。 (リジューム時に、cpuspeedサービスを再起動する)

/etc/pm/sleep.d/resume-cpuspeed.cfg

#!/bin/bash

. /usr/lib/pm-utils/functions

case "$1" in
hibernate|suspend)
;;
thaw|resume)
/etc/rc.d/init.d/cpuspeed restart
;;
*)
;;
esac

exit $?

従来の方法

まず、システムがサスペンドに対応しているか確認


[root@localhost ~]# cat /sys/power/state
mem disk

mem : Suspend-to-RAM (ACPIのS3)
disk : Suspend-to-disk (ACPIのS4)

「mem」という記述があれば、スリープが可能なため、次のコマンドで無理矢理スリープさせることができる


[root@localhost ~]# echo -n mem > /sys/power/state

このコマンドでのスリープから復帰後に、ネットワークのDNS解決ができなくなる不具合があるので、DNS解決しなくても表示できるwebページなどを表示するなどしたら、ネットワークが復帰する。(ドライバのバグか? サスペンド前に ifdown eth0 をして、復帰後に ifup eth0 をしても解決にはならない)


さらに、メインメニューの「サスペンド」ボタンを押せないように、削除する。 システムツール − 設定エディタを起動して、次のように設定。(設定エディタはあらかじめ yum install gconf-editor でインストールしておく)

20080628-gconf.png


スリープ復帰後にDNS参照できない問題を、とりあえず回避するための方法

/home/menu_sleep.sh   このスクリプトを、メニューに登録

#!/bin/sh
sudo /home/core_sleep.sh

/home/core_sleep.sh   実際にスリープを行う一連の処理

#!/bin/sh

# ネットワークデバイスの停止
/etc/rc.d/init.d/iptables stop
/etc/rc.d/init.d/network stop

# スリープに入る
echo -n mem > /sys/power/state

# ネットワークデバイスの再開
/etc/rc.d/init.d/network start
/etc/rc.d/init.d/iptables start

# DNS参照復旧のため、ダミーのダウンロードを行います
cd /tmp
wget http://203.178.137.175/pub/Linux/centos/4.6/extras/i386/RPMS/libxfcegui4-4.2.3-3.c4.i386.rpm
wget http://203.178.137.175/pub/Linux/centos/4.6/extras/i386/RPMS/libxfcegui4-4.2.3-3.c4.i386.rpm
wget http://203.178.137.175/pub/Linux/centos/4.6/extras/i386/RPMS/libxfcegui4-4.2.3-3.c4.i386.rpm

さらに、sudoを可能にするため許可指定を行う

/etc/sudoers

# スリープ メニューを、一般ユーザ(wheelグループ所属)にも開放する
%wheel ALL=/home/core_sleep.sh

# スリープ メニューを、一般ユーザ(特定ユーザ)にも開放する
UserName ALL=/home/core_sleep.sh


もっと他のよい方法あれば教えてください…