KDE4でハイブリッドスリープを使う | 大学院生のLinuxノート

大学院生のLinuxノート

Linuxについての覚書ノートです。
> Linux環境
* PC : Panasonic Let'snote W8
* OS : ArchLinux (32bit) & Windows XP Professional
* CPU:Core 2 Duo SU9400/1.4GHz/2コア
* メモリ : 2GB + 2GB(増設)
* HDD:140GB

僕はLet'snote W8にArchLinuxを入れて、デスクトップ環境としてKDE4を入れて使っているのですが、どうにも現段階(2013/09/04現在)では省電力設定としてハイブリッドスリープに対応していないみたいです。
ハイブリッドスリープはサスペンドとハイバネーションを併せて実行するみたいな省電力設定で、Macだとセーフスリープとか呼ばれてます。
バッテリー残量が十分にあるときにはサスペンド(データはRAM上に保持)し、バッテリー残量がなくなったらハイバネーション(データをHDDに退避)するので、省電力状態からの復帰が早く、かつ途中でバッテリーが切れてしまっても次回起動時にHDDからデータを読みだして復元できるので、データ消失のリスクが無いという実用的な省電力機能です。

でも、KDE4にはどこをどう見てもそんな設定はない。

ここ(https://bugs.kde.org/show_bug.cgi?id=293699)の人は「KDEは自動でハイブリッドスリープができるかどうかをサスペンド実行時にチェックしてる」って言ってるみたいだけど、自分の環境ではサスペンドから自動的にハイブリッドスリープに切り替わらない。

ここ(https://bugs.kde.org/show_bug.cgi?id=302968)の人はKDEをハイブリッドスリープに対応させるためのパッチをつくってくれたみたいだけれど、パッチを適用するのが手間がかかる(ソースを編集した上で、KDE LibsやKDE Workspaceを自分でコンパイルして、パッケージをインストールしないといけない)のと、KDEのバージョンが若干古くなってるみたいで最新版のKDE(4.11)だと存在しないファイルがあったりして適用できないので使えない。

ここ(http://tanitsutakahisa.wordpress.com/2013/03/07/2021/)の人はKDEの電源管理を無効にしてしまって/etc/systemd/logind.confから直接電源管理をできるようにしたみたい。
デスクトップPCだとこれでもいいかなと思うんだけど、ノートPCだとKDEのディスプレイの輝度調節やバッテリー残量による電力管理はかなり有用だからKDEの電源管理はできる限り保持したい。


...ってな状態でウェブを見ても全然KDEの電源管理でハイブリッドスリープをしているところがない状態で、途方に暮れていましたが...

よくよく考えてみたら、ありました!ハイブリッドスリープを有効にする方法が!
要は、「KDEを編集する」方法ではなく、「Linuxを誤魔化す」方法を考えればいいんです。
KDEから見ればサスペンドをしているように見えても、実際にLinuxが行う処理がハイブリッドスリープになればいいわけです。
というわけで、Linuxのサスペンドコマンドをハイブリッドスリープに置き換えてしまって、サスペンド実行時にハイブリッドスリープが実行されるように変更してしまいましょう。
第一、最近のPCで意図的にハイブリッドスリープじゃなくてサスペンドを使うような状況ってありますかね?ハイバネーションはバッテリーの残量を気にする人だったら使うような気がするんですけど、サスペンドは流石に...
HDDにスワップ領域すら作りたくないっていう人はサスペンドを意図的に使いたいのかもしれないですけど。基本的に大半の人はスワップ領域を作るくらいのHDDの容量には困っていないでしょうからサスペンドを使いたいっていう人は少ないはず。

というわけで、Linuxを誤魔化しましょう!
ターミナルを開いて、まずはsuを使ってroot権限になっておきましょう。以下のコマンドを実行してください。
su
<パスワード>

cd /usr/lib/systemd/system

mv systemd-suspend.service systemd-suspend.service.backup

cp systemd-hybrid-sleep.service systemd-suspend.service

reboot

サスペンドを提供するサービスが/usr/lib/systemd/systemディレクトリの中にある、systemd-suspend.serviceです。これをsystemd-suspend.service.backupという名前に変えてしまいましょう。このファイルは念の為にバックアップとしてこのまま残しておきます。
また、ハイブリッドスリープはsystems-hybrid-sleep.serviceという名前のサービスで提供されていますので、これをsystemd-suspend.serviceという名前でコピーしてしまって保存してしまいましょう。Linuxからはサービスの名前でコマンドが実行されるはずなので、これでサスペンドを要求された場合には代わりにハイブリッドスリープのサービスが実行されるようになるはずです。
最後に、再起動をしてサービスを再読込させれば操作完了です。
KDEのサスペンドからLinuxがハイブリッドスリープをするようになったと思います。

p.s.
ArchLinuxの場合は、インストールしただけの状態ではハイバネーション機能が有効になっていないので、ハイバネーションを有効にしておかないとハイブリッドスリープも失敗してしまいます。
このページ(https://wiki.archlinux.org/index.php/Suspend_and_Hibernate)を参考にして先にハイバネーションの設定をしておいてください。英語のページですけど。
ちなみに僕は、

/etc/default/grub
GRUB_CMDLINE_LINUX="resume=/dev/sda1"
grub-mkconfig -o /boot/grub/grub.cfg

と、

/etc/mkinitcpio.conf
# resume must be placed after block and lvm2, but before filesystems
HOOKS="... block lvm2 resume filesystems ..."
mkinitcpio -p linux

のところだけ書き換えて有効にしたらハイバネーションできるようになりましたよ。


以上、誰かのお役に立てれば。
それではまた。