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


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