LinuxノートPCのサスペンドとハイバネーション

柔軟な使い方ができることから、デスクトップPCよりノートPCを好む人が多い。その中には、GNU/LinuxのようなオープンソースのOSに入れ換えても、サスペンド機能など、独占的OSにあった機能をそのまま使いたいと思っている人もいるだろう。一部のディストリビューションでは何もしなくてもこうした機能が使えるが、例によって、その仕組みを知っておけば、何か問題が起きて修復が必要になった場合などに思いがけず役に立つことがあるはずだ。LinuxのノートPCで、サスペンドおよびハイバネーション(休止状態モード)の機能がどのように実現されるのかを見てみよう。

最近のノートPCのほとんどは、電源管理にAdvanced Configuration & Power Interface(ACPI)を使っているので、まずはこれに注目する。Linux向けのACPI(ACPI4Linux)は常に開発が進められており、最新の機能をすべて利用するには比較的新しいカーネル(2.6.15以降のもの)が必要だ。

サスペンド機能

ACPIのS3ステート ― Suspend-to-RAMとも呼ばれる ― では、RAMを除いてシステム内のすべてのデバイスが低消費電力の状態になる。メモリに記憶された内容を維持するためにわずかに電力を消費するが、復帰時には、メモリに記憶された情報を呼び戻すことで、すべてのアプリケーションがただちに元の状態に戻る。

使っているノートPCとカーネルがSuspend-to-RAMに対応しているかどうかは、cat /sys/power/state を実行すればわかる。対応していれば、mem という結果が返ってくるはずだ。結果がそれ以外の場合は、grep ACPI_SLEEP KERNEL_CONFIG を実行して、カーネル内にACPI_SLEEPサポートが構築されているかどうかを確認するとよい。なお、 KERNEL_CONFIG の部分は、実際のカーネル設定ファイルで置き換えること。デフォルトでは、/usr/src/linux-`uname -r`/.config または /boot/config-`uname -r` になっている。

カーネルがACPIのスリープ状態をサポートしているのに、先ほどのcatコマンドの結果がmemでない場合は、ノートPCがサスペンド機能に対応していないか(この場合は、ACPI4Linuxプロジェクトに届け出るとよい)、ノートPCがACPIを使用していないか、のどちらかである。

後者の場合、心配は無用だ。おそらく、そのノートPCはAdvanced Power Management(APM)をサポートしているので、代わりにLinux APM Daemon(apmd)をインストールすればよい。このパッケージは、ほぼすべてのディストリビューションで利用できる。apmdのインストール後は、apm -z の実行によってノートPCのサスペンドが可能だが、APMに対応したノートPCではハイバネーションも有効なので、以降の記述にも目を通してほしい。

ACPIを使用したノートPCをサスペンドするには、rootで echo -n mem > /sys/power/state を実行する。しかし、復帰しても画面に何も表示されないので、この問題を解決して、実際のサスペンド処理を実行するシェルスクリプトを書くとしよう。以下に示す行を/usr/local/sbin/suspend.shというファイルにコピーする。各コマンドの説明については、コメント(#で始まる行)を参照していただきたい。

#!/bin/sh

# discover video card's ID
ID=`lspci | grep VGA | awk '{ print $1 }' | sed -e 's@0000:@@' -e 's@:@/@'`

# securely create a temporary file
TMP_FILE=`mktemp /var/tmp/video_state.XXXXXX`
trap 'rm -f $TMP_FILE' 0 1 15

# switch to virtual terminal 1 to avoid graphics
# corruption in X
chvt 1

# write all unwritten data (just in case)
sync

# dump current data from the video card to the
# temporary file
cat /proc/bus/pci/$ID > $TMP_FILE

# suspend
echo -n mem > /sys/power/state

# restore video card data from the temporary file
# on resume
cat $TMP_FILE > /proc/bus/pci/$ID

# switch back to virtual terminal 7 (running X)
chvt 7

# remove temporary file
rm -f $TMP_FILE

このスクリプトは、Gentooのシステムで動作確認済みだ。すべてのディストリビューションとノートPCの機種で正常に動作するとは限らないが、十分参考になるだろう。

また、Xサーバの設定ファイル(/etc/X11/xorg.conf または /etc/X11/XF86Config-4)のビデオカードのセクションに、Option "VBERestore" "true" を追加する必要がある。追加後のセクションは次のようになる。

Section "Device"
        Identifier      "intel_855gm"
        Driver          "i810"
        BusID           "PCI:0:2:0"
        Option          "VBERestore"    "true"
EndSection

あとは、suspend.shスクリプトを実行形式に(chmod +x /usr/local/sbin/suspend.sh)して実行するだけだ。サスペンド状態から復帰するには、ノートPCの機種にも寄るが、Fnキーまたは電源ボタンを押す。

サスペンド状態に入る前や復帰した後に、たとえば、ネットワークインタフェースのオン/オフやデーモンの再起動のためのコマンドを自動的に実行することもできる。そうするには、echo -n memの前後に、該当するスクリプトを追加すればよい。

ハイバネーション機能

ACPIのS4ステート、Suspend-to-diskとも呼ばれるハイバネーション機能は、Suspend-to-RAMと同様の働きをするが、現状のデータのすべてをハードディスクに格納する点が異なる。この状態ではまったく電力が消費されないため、大幅な電力の節約になる。また、データを一切失うことなくバッテリを取り外すこともできる。

Linuxでハイバネーション機能を利用するには、3つの方法がある。カーネルの一部であるswsusp、ユーザ空間で実行されるがまだ実用化されていないuswsusp、各方面で利用され、宣伝どおりに機能しているSoftware Suspend(suspend2)だ。こちらのページでは、各実装の比較が行われている。

Software Suspendの唯一の問題は、まだLinuxカーネルには含まれていないため、手作業でパッチを当て、カーネルをコンパイルする必要があることだ。Gentooユーザの場合は、suspend2のソースパッケージを用いることになる。このパッケージは、基本的に、Gentooのパフォーマンス強化およびsuspend2の各パッチを適用したカーネルである。その他のディストリビューションの場合は、まず、最新の安定版カーネルと、該当するsuspend2用のパッチをダウンロードする。続いて、以下のようにして、このカーネルおよびパッチの各tarballを展開し、パッチを適用する。

cd /usr/src
wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.15.tar.bz2 \
  http://www.suspend2.net/downloads/all/suspend2-2.2-rc16-for-2.6.15.tar.bz2
tar jxvpf linux-2.6.15.tar.bz2; tar jxvpf suspend2-2.2-rc16-for-2.6.15.tar.bz2
cd linux-2.6.15
../suspend2-2.2-rc16-for-2.6.15/apply

ただし、実際のファイル名は、最新バージョンに合わせて変更が必要になるかもしれない。

通常どおりにカーネルの設定を行ったら、Power management options (ACPI, APM) ---> Suspend2 ---> Swap WriterDefault resume device nameタブにスワップパーティションも追加) および Cryptographic options ---> LZF compression algorithmのオプション(モジュールではない)が組み込まれていることを確認する。

“Swap Writer”を選んだ場合、suspend2はすべてのデータをスワップ領域に書き込むため、RAM容量の少なくとも2倍のスワップ領域を確保しておく。また、”File Writer”を選び、ハードディスク上のファイルにサスペンドデータを保存することもできる。しかし、セットアップの容易さから、私はスワップを使うやり方を取っている。コンパイルとインストールが済んだら、リブートする。

次に、ハイバネーション用スクリプト(Debianには、hibernateとしてパッケージ化されている)をインストールする必要がある。利用可能なパッケージがディストリビューションに用意されていない場合は、suspend2のWebページから最新版をダウンロードし、展開して、install.shスクリプトを実行する。続いて、設定ファイル /etc/hibernate/hibernate.conf を開いて必要に応じてオプションを調整(詳細については、hibernate.confのmanページを参照)した後、hibernate を実行する。復帰するには、電源ボタンを押せばよい。

suspend2のインストールと設定については、こちらのHOWTOに詳細が説明されている。

ハイバネーションの自動化

ノートPCでサスペンドまたはハイバネーションを行うのにスクリプトを実行するのは非常に不便なので、ちょっとした自動化をはかるとしよう。ノートPCを閉じるとサスペンド機能が、電源ボタンを押すとハイバネーション機能が働くように設定することができる。

そのためには、ACPIデーモンacpidをインストールする必要がある。大半のディストリビューションでパッケージが入手でき、ソースからのコンパイルも簡単で make && make install とすればよい。インストール終了後に自動的に起動した場合は、いったんデーモンを停止させる。続いて、mv /etc/acpi /etc/acpi.orig を実行してデフォルトの設定ディレクトリのバックアップをとり、mkdir -p /etc/acpi/{events,actions} とすることで、イベントおよびアクションのための2つのサブディレクトリを持つACPI用ディレクトリを作成する。さらに、ノートPCのふたと電源ボタンのそれぞれのアクションとイベントを処理するファイルを以下のように作成する。

/etc/acpi/events/lid

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

/etc/acpi/events/pwrbtn

event=button[ /]power
action=/etc/acpi/actions/pwrbtn.sh

/etc/acpi/actions/lid.sh

#!/bin/sh
/usr/local/sbin/suspend.sh

/etc/acpi/actions/pwrbtn.sh

#!/bin/sh
hibernate

最初の2つのファイルは、それぞれ、ふたが閉じられたときと電源ボタンが押されたときに、該当するアクションのファイル呼び出しをデーモンに指示するものだ。残り2つのアクションファイルについては、chmod +x /etc/acpi/actions/*として、実行形式にしておくこと。これで、ふたを閉じればノートPCはサスペンド状態に入るようになる。もちろん、lid.shとpwrbtn.shに手を加えて、サスペンドやハイバネーション以外の任意のコマンドを実行させることもできる。

まとめ

ほとんどのメーカは、ACPIの実装に独自仕様の拡張機能を追加する傾向があるので、ノートPCでサスペンドおよびハイバネーションの機能を実行するには、追加の手順が必要になることがある。場合によっては、カーネルモジュールをアンロードしたり、カーネルに追加パッチをあてる必要があるかもしれない。ノートPCの機種は多岐にわたるため、ここで具体的なアドバイスを提供するのは困難である。

参考になるリソースとしては、TuxMobil Linuxのインストールに関する調査がある。ここには、ほとんどのノートPCについてLinuxのインストール報告が寄せられており、自分のノートPCに関する報告を送ることも可能だ。

NewsForge.com 原文