「Pm-utils」の版間の差分
Kusakata.bot (トーク | 投稿記録) 細 (文字列「Tips and tricks」を「ヒントとテクニック」に置換) |
Kusakata.bot (トーク | 投稿記録) 細 (文字列「http://superuser.com/」を「https://superuser.com/」に置換) |
||
| 544行目: | 544行目: | ||
*[[Cpufrequtils]] - CPU 周波数スケーリングと CPU 電源スキーム |
*[[Cpufrequtils]] - CPU 周波数スケーリングと CPU 電源スキーム |
||
*[[Acpid]] - ACPI イベントを通知するデーモン |
*[[Acpid]] - ACPI イベントを通知するデーモン |
||
| − | * [ |
+ | * [https://superuser.com/questions/298672/linuxhow-to-hibernate-after-a-period-of-sleep Hibernate after sleep] - An example of a custom pm-utils hook where hibernation is triggered after a period of time in suspension |
2018年2月6日 (火) 23:42時点における版
pm-utils はサスペンドと電源状態を設定するフレームワークです。powersave などのスクリプトなどを置き換えるために作られました。
pm-utils はカーネルのサスペンドと復帰を様々なハックで包み込むシェルスクリプトのコレクションです。サスペンドに対応していないドライバーやサブシステムによるバグを回避するためにハックが必要になります。カスタムフックをディレクトリに配置することで簡単に拡張することができ、システムの管理者がフックを作成するだけでなく、パッケージによってフックがインストールされることもあります。システムのサスペンドや電源状態の変化に特別注意する必要があるパッケージにフックが含まれています。
あまり知られていない機能として Laptop Mode Tools による切り替えを模倣します。
cpupower パッケージと組み合わせて使うことで、ノートパソコン (デスクトップ) のユーザーは完全な電源管理スイートとして利用できます。
目次
- 1 インストール
- 2 基本設定
- 3 高度な設定
- 4 仕組み
- 5 ヒントとテクニック
- 6 トラブルシューティング
- 6.1 セグメンテーション違反
- 6.2 サスペンドから復帰する代わりに再起動する
- 6.3 サスペンドから復帰するとシャットダウンしてしまう
- 6.4 サスペンドから復帰したときに画面が表示されない
- 6.5 VirtualBox の問題
- 6.6 スワップパーティションが存在しないのにハイバネート
- 6.7 サスペンドしようとしたときにカーソルしか表示されない黒画面になる
- 6.8 画面が表示されない問題
- 6.9 64ビットの OS で復帰できない
- 6.10 radeon ドライバーでハイバネートから復帰した時に黒画面になる
- 6.11 ハイバネート時にコンピュータの電源が切れない
- 6.12 サスペンド後にディスプレイの電源が入らない (radeon)
- 7 参照
インストール
公式リポジトリの pm-utilsAUR パッケージをインストールしてください。
root で pm-suspend, pm-suspend-hybrid, pm-hibernate を実行すると手動でサスペンドが行われます。サスペンドスクリプトは /var/log/pm-suspend.log にログを書き出します。
別のサスペンドバックエンドをインストール (任意)
Arch Linux のパッケージでは次のバックエンドに対応するようになっています: kernel, tuxonice, uswsusp。
サスペンドバックエンドは /etc/pm/config.d の SLEEP_MODULE 設定変数で指定することができ、デフォルトでは kernel バックエンドが使われます。別のサスペンドバックエンドを使うには、それぞれ必要なパッケージをインストールしてください。どちらも Arch User Repository からインストールできます:
- uswsusp - uswsusp-gitAUR
- tuxonice - linux-iceAUR[リンク切れ: パッケージが存在しません] / linux-pf
さらに、pm-utilsAUR には独自のビデオ互換データベースが付属しており、/usr/lib/pm-utils/video-quirks/ にインストールされます。
基本設定
スタンバイ/RAM にサスペンド
理想的な状態は、root で pm-suspend を実行することでメモリへのサスペンドが開始され、全ての動作状態が RAM に保存されて、消費電力を抑えるために RAM 以外の部品は全部シャットダウンされることです。また、電源ボタンを押すことでこの状態から復帰できなければなりません。
場合によっては、pm-suspend を実行するとフリーズするなどの問題が発生することがあります。特定のモジュールが正しく動作しないのが原因です。問題を発生させるモジュールがわかっている場合、/etc/pm/config.d/modules の SUSPEND_MODULES に以下のようにモジュールを追加します:
SUSPEND_MODULES="uhci_hd button ehci_hd iwlwifi"
設定に追加されたモジュールはサスペンドが行われる前にアンロードされ、復帰後にリロードされます。
ノートパソコンのフタを閉じた時などの電源イベントによって自動的に pm-suspend を実行するように設定したい場合は、Acpid を参照してください。
ハイバネーション (suspend2disk)
サスペンドとハイバネート#ハイバネーションの指示に従ってハイバネーションを設定してください。
もしくは、kernel バックエンドを使わない場合、Uswsusp#設定 や TuxOnIce#ブートローダーの設定 を見て下さい。
通常ユーザーでサスペンド/ハイバネート
root パスワードを入力することなくサスペンドする方法は3つあります: Udev を使用する方法、UPower を使用する方法、visudo でユーザーに適当な権限を与える方法です。
ユーザーに権限を与える方法
pm-utilsAUR スクリプトは root で実行する必要があるため、sudo を使うことで root パスワードを入力しないで通常ユーザーでスクリプトを使えるようにすることができます。そうするには、root で visudo を使って /etc/sudoers ファイルを編集してください。詳しくは、sudo を参照。
以下の行を追加してください。username はあなたのユーザー名に置き換えて、保存してから visudo を終了します:
username ALL = NOPASSWD: /usr/sbin/pm-hibernate username ALL = NOPASSWD: /usr/sbin/pm-suspend
もしくは、グループを使うこともできます。以下の行を使って下さい。group は置き換えて下さい:
%group ALL = NOPASSWD: /usr/sbin/pm-hibernate %group ALL = NOPASSWD: /usr/sbin/pm-suspend
上記の設定によって、パスワードを入力しなくても以下のコマンドを実行することでスクリプトが実行できます:
$ sudo pm-hibernate
もしくは:
$ sudo pm-suspend
また、ユーザーを power グループに追加して、アプレットなどを使用してサスペンドできるようにします。グループに追加していないと、GNOME のシャットダウンアプレットなどでサスペンドしようとしたときに、耳障りなビープ音が三回鳴って画面がロックされます。ユーザーをグループに追加するには:
# gpasswd -a username power
これでデスクトップ環境の電源管理ツールを使って、ノートパソコンのフタが閉じられたとき、あるいはバッテリーの残量が少なくなったときに、自動的にサスペンドやハイバネートをすることができるようになります。
省電力機能
pm-utils ではシステムが AC アダプタに接続しているかどうかに合わせてコマンドを実行することができます。スクリプトを /etc/pm/power.d/ フォルダの中に作成してください。スクリプトの例は crunchbang フォーラム に存在します。AC 状態の変化を検出するには upower を動作させる必要があるので注意してください (詳しくは [1] を参照)。
AC 状態にあわせて明るさを変化させる
以下は AC 状態にあわせて輝度を変化させる例です。以下の内容で /etc/pm/power.d/00-brightness というファイルを作成して、あなたのシステムに合わせて、輝度設定のパスとファイルに書き出す値を変更してください。
#!/bin/bash
case $1 in
true)
echo "Enable screen power saving"
echo 5 > /sys/class/backlight/acpi_video0/device/backlight/acpi_video0/brightness
;;
false)
echo "Disable screen power saving"
echo 14 > /sys/class/backlight/acpi_video0/device/backlight/acpi_video0/brightness
;;
esac
アイドル状態でサスペンド
xautolock プログラムを使う方法があります。xautolock -time 30 -locker "sudo pm-suspend" -detectsleep & を ~/.xinitrc に追加してください。30分間、何も動作がない場合に pm-suspend を呼び出します。
通常のスワップパーティションの代わりにスワップファイルを使う
通常のスワップパーティションの代わりにスワップファイルを使いたい場合、スワップファイルを見て下さい。
高度な設定
メインの設定ファイルは /usr/lib/pm-utils/defaults です。このファイルを編集してはいけません。パッケージのアップデートによって、デフォルト設定に書き換えられてしまう可能性があります。設定ファイルは /etc/pm/config.d/ に置くようにしてください。/etc/pm/config.d に modules や config という名前で、以下の内容のシンプルなテキストファイルを作成することで、システム全体の設定ファイルの設定を上書きできます:
SUSPEND_MODULES="button uhci_hcd"
設定ファイルで利用できる変数
- SUSPEND_MODULES="button"
- サスペンドする前にアンロードするモジュールのリスト
- SLEEP_MODULE="tuxonice uswsusp kernel"
- 試行するデフォルトのスリープ/復帰システム
- HIBERNATE_MODE="shutdown"
- 再起動ではなく強制的にシャットダウンさせる
フックの無効化
不必要な、あるいは害を及ぼすフックが動作してしまう場合、それについてバグレポートを送って頂けると幸いです。/etc/pm/sleep.d/ にフックと呼応する空のファイルを作成することで簡単にフックを無効化できます。例えば /usr/lib/pm-utils/sleep.d/45pcmcia フックを無効化したいときは、次を実行することで無効化できます:
# touch /etc/pm/sleep.d/45pcmcia
ダミーのフックには実行可能権限は付与しないでください。
別の方法
ブラックリストにしたいモジュールを HOOK_BLACKLIST 変数に定義したファイルを /etc/pm/config.d に作成してください。例えば、省電力機能を自分で管理したい場合、以下を使います:
HOOK_BLACKLIST="hal-cd-polling intel-audio-powersave journal-commit laptop-mode pcie_aspm readahead sata_alpm sched-powersave xfs_buffer wireless"
フックの作成
サスペンドやハイバネートのときに何か特別なことをしたい場合、簡単にフックを自分で作成して /etc/pm/sleep.d に配置することができます。このディレクトリに含まれているフックはサスペンド時にアルファベット順で実行されます (そのため名前の先頭には2桁の数字を付けて、順番が明確になるようにしています)。復帰時は逆の順番で実行されます。数字については以下のように決められています:
- 00 - 49
- ユーザーやパッケージが作成したフック。通常のサービスやユーザー空間のインフラストラクチャが動作しているときに実行するべきフック。
- 50 - 74
- サービスを管理するフック。この範囲のフックはサービスを起動したり停止します。50 以下のフックはサービスが有効になっている状態に実行されると考えてかまいません。
- 75 - 89
- コア以外のハードウェアあるいはモジュールを管理するフック。モジュールをロード・アンロードしたり、安全な状態にサスペンドしたりハイバネートするのを破壊するようなビデオ以外のハードウェアを扱うフックはこの範囲に収まります。75 以下では、全てのモジュールがロードされることになります。
- 90 - 99
- 重要なサスペンドのフック用に予約されています。
ログファイルに情報を流すだけの、無用のフックを作ると以下のようになります:
#!/bin/bash
case $1 in
hibernate)
echo "Hey guy, we are going to suspend to disk!"
;;
suspend)
echo "Oh, this time we are doing a suspend to RAM. Cool!"
;;
thaw)
echo "Oh, suspend to disk is over, we are resuming..."
;;
resume)
echo "Hey, the suspend to RAM seems to be over..."
;;
*) echo "Somebody is calling me totally wrong."
;;
esac
上記のファイルを /etc/pm/sleep.d/66dummy として保存して chmod +x /etc/pm/sleep.d/66dummy を実行してください。サスペンドや復帰時にメッセージが出力されます。
仕組み
仕組みはとても簡単です: メインスクリプト (pm-suspend, pm-hibernate, pm-suspend-hybrid などのシンボリックリンクで pm-action が呼びされます) はアルファベット順で実行可能スクリプトである"フック"を実行し、その際 suspend (suspend to RAM) あるいは hibernate (suspend to disk) のパラメータが使われます。全てのフックが実行されると、マシンはスリープ状態になります。マシンが再度起こされると、全てのフックは逆順に実行され resume (resume from RAM) あるいは thaw (resume from disk) のパラメータが使われます。フックは様々なことを行います。ブートローダーの準備や Bluetooth サブシステムの停止、重要なモジュールのアンロードなどです。
pm-suspend と pm-hibernate はどちらも大抵は Udev から呼び出され、Udev 自体は gnome-power-manager や kpowersave などのデスクトップアプレットから実行されます。
マシンを高出力モードあるいは低出力モードに設定することもできます。true や false のパラメータを追加して pm-powersave コマンドを使います。基本的なところはサスペンドフレームワークと同じです。
サスペンドするときのフックは以下のディレクトリに配置されています:
/usr/lib/pm-utils/sleep.d- ディストリビューションやパッケージによって配置されたフック
/etc/pm/sleep.d- システム管理者によって追加されたフック
電源状態を変更するときのフックは以下のディレクトリに配置されています:
/usr/lib/pm-utils/power.d- ディストリビューションやパッケージによって配置されたフック
/etc/pm/power.d- システム管理者によって追加されたフック
/etc/pm/ のフックは /usr/lib/pm-utils/ のフックよりも優先されるため、システム管理者はディストリビューションによって決められたデフォルト設定を上書きすることができます。
Pm-suspend の内部
This outlines the internal actions when pm-suspend is run, describing how pm-utils gracefully falls back onto the kernel method if the requirements of other methods are not met.
$ pm-suspend
The first step is set-up preliminary variables and source parent scripts:
export STASHNAME=pm-suspend
export METHOD="$(echo ${0##*pm-} |tr - _)"
. "/usr/lib/pm-utils/pm-functions"
The variable METHOD is extracted from the executable name, suspend from pm-suspend and hibernate from pm-hibernate.
The location of runtime configuration parameters is defined in /usr/lib/pm-utils/pm-functions as PM_UTILS_RUNDIR="/var/run/pm-utils" and STORAGEDIR="${PM_UTILS_RUNDIR}/${STASHNAME}/storage". Therefore STORAGEDIR="/var/run/pm-utils/pm-suspend/storage"; this is where pm-suspend will cache its configuration. Disabled hooks are stored as plain text files with the hook name prefixed by "disable_hook:". Configuration parameters are appended to the parameters file:
$ ls -lah /var/run/pm-utils/pm-suspend/storage/
-rw-r--r-- 1 root root 20 May 19 09:57 disable_hook:99video -rw-r--r-- 1 root root 0 May 19 02:59 parameters -rw-r--r-- 1 root root 247 May 19 02:59 parameters.rm -rw-r--r-- 1 root root 9 May 19 02:59 state:cpu0_governor -rw-r--r-- 1 root root 9 May 19 02:59 state:cpu1_governor
Then pm-functions will source the files located in /etc/pm/config.d/ in addition to /usr/lib/pm-utils/defaults. Upon returning, pm-functions will proceed to source the files specified by $SLEEP_METHOD as /usr/lib/pm-utils/module.d/$SLEEP_METHOD[...] if they exist:
for mod in $SLEEP_MODULE; do
mod="${PM_UTILS_LIBDIR}/module.d/${mod}"
[ -f "$mod" ] || continue
. "$mod"
done
Otherwise, if $SLEEP_MODULE is empty, do_suspend() will be set to the kernel backend as described above:
if [ -z "$SUSPEND_MODULE" ]; then
if grep -q mem /sys/power/state; then
SUSPEND_MODULE="kernel"
do_suspend() { echo -n "mem" >/sys/power/state; }
elif [ -c /dev/pmu ] && pm-pmu --check; then
SUSPEND_MODULE="kernel"
do_suspend() { pm-pmu --suspend; }
elif grep -q standby /sys/power/state; then
SUSPEND_MODULE="kernel"
do_suspend() { echo -n "standby" >/sys/power/state; }
fi
fi
Assuming $SLEEP_MODULE is not empty and uswsusp is specified, /usr/lib/pm-utils/module.d/uswsusp is executed. This script checks several requirements (these are the requirements for being able to use uswsusp):
- [ -z $SUSPEND_MODULE ]
- command_exists s2ram
- grep -q mem /sys/power/state || ( [ -c /dev/pmu ] && pm-pmu --check; );
If these requirements are met, do_suspend() is defined as:
do_suspend()
{
uswsusp_get_quirks
s2ram --force $OPTS
}
Most importantly, the uswsusp module runs:
add_before_hooks uswsusp_hooks add_module_help uswsusp_help
The first function, add_before_hook disables the pm-utils hooks 99video since this functionality is subsumed by s2ram. The second function, add_module_help, adds uswsusp-module-specific help, which in essence replaces the help function provided by 99video.
Back to pm-suspend:
command_exists "check_$METHOD" && command_exists "do_$METHOD" "check_$METHOD"
This verifies that the check_suspend and do_suspend methods have been defined. The check_suspend method simply verifies that $SUSPEND_MODULE is not empty:
check_suspend() { [ -n "$SUSPEND_MODULE" ]; }
Lastly, pm-suspend must run all hooks that have not been disabled, sync file-system buffers, and run do_suspend:
if run_hooks sleep "$ACTION $METHOD"; then
# Sleep only if we know how and if a hook did not inhibit us.
log "$(date): performing $METHOD"
sync
"do_$METHOD" || r=128
log "$(date): Awake."
The method run_hooks is a wrapper for _run_hooks, which the case of pm-suspend is called as run_hooks sleep "suspend suspend". Given that:
PARAMETERS="${STORAGEDIR}/parameters"
PM_UTILS_LIBDIR="/usr/lib/pm-utils"
PM_UTILS_ETCDIR="/etc/pm"
The method _run_hooks, will for each hook in "${PM_UTILS_LIBDIR}/$1.d" and "${PM_UTILS_ETCDIR}/$1.d", check that sleep has not been inhibited and update the runtime parameters stored in $PARAMETERS before running each hook via run_hook $hook $2. In the case of Suspend-to-RAM, all the hooks in {/usr/lib/pm-utils/sleep.d/,/etc/pm/sleep.d/} will be enumerated, and run_hook will be passed the parameters $hook and "suspend suspend". The method run_hook uses the hook_ok function to verify that the hook has not been disabled before executing the hook with the "suspend suspend" parameters.
ヒントとテクニック
復帰時にハードディスクの電源管理レベルを自動的に設定
以下のようにフックを作成:
/etc/pm/sleep.d/50-hdparm_pm
#!/bin/dash if [ -n "$1" ] && ([ "$1" = "resume" ] || [ "$1" = "thaw" ]); then hdparm -B 254 /dev/sda > /dev/null fi
そして次を実行:
# chmod +x /etc/pm/sleep.d/50-hdparm_pm
上記の Bash スクリプトが動作しない場合、以下のスクリプトで動作する可能性があります:
/etc/pm/sleep.d/50-hdparm_pm
#!/bin/sh
. "${PM_FUNCTIONS}"
case "$1" in
thaw|resume)
sleep 6
hdparm -B 254 /dev/sda
;;
*)
;;
esac
exit $NA
-B スイッチの値を低くすると効果があるかもしれません。hdparm を見て下さい。
マウスの再起動
ノートパソコンによっては、サスペンドがされた後にマウスが動かなくなることがあります。/etc/pm/hooks にフックを作成して PS/2 ドライバー (例: i8042) を強制的に再初期化することで解決します (フックの作成を参照):
#!/bin/sh echo -n "i8042" > /sys/bus/platform/drivers/i8042/unbind echo -n "i8042" > /sys/bus/platform/drivers/i8042/bind
Openbox のメニューにスリープモードを追加
Openbox を使っている場合、~/.config/openbox/menu.xml のサブメニューにアイテムを追加することで、Openbox メニューにシャットダウンオプションとして新しいスクリプトを追加できます。例:
<menu id="64" label="Shutdown"> <item label="Lock"> <action name="Execute"> <execute>xscreensaver-command -lock</execute> </action> </item> <item label="Logout"> <action name="Exit"/> </item> <item label="Reboot"> <action name="Execute"> <execute>sudo shutdown -r now</execute> </action> </item> <item label="Poweroff"> <action name="Execute"> <execute>sudo shutdown -h now </execute> </action> </item> <item label="Hibernate"> <action name="Execute"> <execute>sudo pm-hibernate</execute> </action> </item> <item label="Suspend"> <action name="Execute"> <execute>sudo pm-suspend</execute> </action> </item> </menu>
"sleep" と "power" ボタンの処理
"Sleep" と "power" ボタンは acpid の /etc/acpi/handler.sh で処理されます ("button/power" と "power/sleep" エントリを見て下さい)。pm-suspend や pm-hibernate を呼び出すようにデフォルトのアクションを置き換えることができます。
systemd は独自に電源イベントを管理しており pm-utils や /etc/pm/* のスクリプトは使わないので注意してください。
ハイバネートやサスペンド時にスクリーンセーバーをロック
You may wish to run a screen locking utility when the system suspends (so that a password is required after waking up). This can be done by adding a script to the /etc/pm/sleep.d folder. Make sure the script is executable (chmod 755) and owned by root:root.
シンプルなサンプルスクリプト:
/etc/pm/sleep.d/00screensaver-lock
#!/bin/sh
#
# 00screensaver-lock: lock workstation on hibernate or suspend
username= # add username here; i.e.: username=foobar
userhome=/home/$username
export XAUTHORITY="$userhome/.Xauthority"
export DISPLAY=":0"
case "$1" in
hibernate|suspend)
su $username -c "/usr/bin/slimlock" & # or any other such as /usr/bin/xscreensaver-command -lock
;;
thaw|resume)
;;
*) exit $NA
;;
esac
/usr/bin/slimlock は使用する画面ロックユーティリティのパスに置き換えてください。
ユーザー名をハードコードしたくない場合 (例えばユーザーが複数いる場合など)、現在の X11 ユーザー名とディスプレイ番号を確認する必要があります。systemd を使っている場合、xuserrun と以下の sleep.d スクリプトが使えます (xuserrun と画面ロッカーのパスは適宜修正してください):
/etc/pm/sleep.d/00screensaver-lock
#!/bin/sh
#
# 00screensaver-lock: lock workstation on hibernate or suspend
case "$1" in
hibernate|suspend)
/path/to/xuserrun /usr/bin/slimlock & # or any other such as /usr/bin/xscreensaver-command -lock
;;
thaw|resume)
;;
*) exit $NA
;;
esac
If you have problems using xuserrun, you can instead try having loginctl do this directly. This script will lock all active sessions before going into hibernation:
/etc/pm/sleep.d/00screensaver-lock
#!/bin/sh
#
# 00screensaver-lock: lock workstation on hibernate or suspend
case "$1" in
hibernate|suspend)
loginctl lock-sessions
;;
thaw|resume)
;;
*) exit $NA
;;
esac
polkit でハイバネーションを無効化
ハイバネーションを無効化するには、/etc/polkit-1/ に 99-disable-hibernate.rules という名前の新しいファイルを作成してください。そして、以下の内容を記述します:
99-disable-hibernate.rules
polkit.addRule(function(action, subject) {
if ((action.id == "org.freedesktop.login1.hibernate")) {
return polkit.Result.NO;
}
});
polkit.addRule(function(action, subject) {
if ((action.id == "org.freedesktop.login1.hibernate-multiple-sessions")) {
return polkit.Result.NO;
}
});
KDE を使っている場合、一度ログオフすればハイバネーションオプションが消えます。
トラブルシューティング
サスペンドやハイバネートが正しく動作しない場合、ログファイル /var/log/pm-suspend.log に何らかの情報を見つけられる可能性があります。例えば、動作したフックやフックの出力などがログファイルで確認できます。
また、pm-is-supported コマンドの出力も確認してください。このコマンドは (--hibernate や --suspend フラグが付けられたときに) サニティチェックを実行して、設定に問題がある場合エラーを報告します。設定の問題以外のエラーは認識してくれませんが、それでも有用ではあります。
セグメンテーション違反
セグメンテーション違反が発生してシステムが反応しなくなったりする場合、上で説明しているように /boot/grub/menu.lst の resume-path に UUID を設定してみてください。
サスペンドから復帰する代わりに再起動する
この問題はサスペンド時に NVS 領域を保存するようになってから起こるようになりました (2.6.35-rc4) (メーリングリストの投稿)。しかしながら、全てのマシンでこの機構が動作するとは限らないと知れ渡ってから、カーネルの開発者は acpi_sleep=nonvs カーネルコマンドラインオプションで無効化できるようにしています (カーネルパラメータを参照)。
サスペンドから復帰するとシャットダウンしてしまう
Acer Aspire AS3810TG では、サスペンドから復帰すると、パソコンが立ち上がるかわりにシャットダウンしてしまいます。同じような問題が発生する場合、カーネルに i8042.reset=1 パラメータを指定してみてください。GRUB の場合、/boot/grub/grub.cfg の設定行を以下のようにします:
linux /vmlinuz-linux root=/dev/vg00/root resume=/dev/vg00/swap i8042.reset=1 ro
未確認ですが、以下を実行することで再起動せずにパラメータを設定することもできます:
# sysctl -e -w i8042.reset=1
サスペンドから復帰したときに画面が表示されない
一部のノートパソコンではサスペンドから復帰したときにバックライトが点灯せず画面に何も表示されないことがあります。問題を解決する方法はいくつか存在します:
- キーボードとマウスを Y アダプタで使うことができる多重化 PS/2 コントローラを搭載したコンピュータの場合 (一部のノートパソコンはこの機能を内部的に搭載しています)、カーネルパラメータに
i8042.nomux=1を追加してみてください (i8042.reset=1も追加する必要があるかもしれません)。もしくは、BIOS の設定で PS/2 Y アダプタを無効化出来る場合があります。
- BIOS の設定で Intel SpeedStep 機能を無効化すると問題が解決する場合があります (例: Dell Inspiron Mini 1018)。また、以下のファイルを
/etc/pm/sleep.d/に作成することで SpeedStep を無効化することなく試すことができます (vbetool が必要です):#!/bin/sh # case "$1" in suspend) ;; resume) sleep 5 vbetool dpms off vbetool dpms on ;; *) exit $NA ;; esacファイル名は何でもかまいませんが名前の最初に必ず00を付けてください。また、作成後にスクリプトにchmod +xで実行可能権限を与えてください。
他のコマンドが呼ばれるのが早すぎる場合sleepの時間を調整してください。
- BIOS の VT-d 仮想化の設定を "VT-x only" にして無効化する (例: Toshiba Portégé R830)。
VirtualBox の問題
ノートパソコンによっては VirtualBox のカーネルモジュールによって pm-suspend や pm-hibernate が機能しなくなることがあります ([2] を参照)。サスペンドやハイバネートがされる代わりに、システムはフリーズしてインジケータ LED が点滅します (ThinkPad の場合、サスペンドインジケータが点滅。MSI Wind U100 の場合、Caps Lock や Scroll Lock のインジケータが点滅)。pm-suspend と pm-hibernate のログは通常通りに出力されます。
サスペンドやハイバネートをする前にモジュールをアンロードして、復帰後にモジュールをリロードするようにすることで問題を解決できます。スクリプトを使うことでモジュールを管理できます:
#!/bin/sh rmmod vboxdrv pm-hibernate modprobe vboxdrv
スワップパーティションが存在しないのにハイバネート
有効なスワップパーティションが存在しないのにハイバネートしようとすると、ハイバネートが開始されるようにみえて、すぐに復帰してしまいます。たとえ、ログ出力を詳細にするように指定していても、スワップパーティションが存在しないことに関するエラーメッセージが全く表示されません。そのため、この問題をデバッグするのは大変です。スワップパーティションが何らかの理由で破損していて無効になっていると、インストール時にスワップパーティションを設定していてもこの問題が発生することがあります。ハイバネートですぐ復帰するようならば、使用しているスワップパーティションが本当に有効になっているか確認してください。blkid コマンドの出力が以下のようになっている場合:
# blkid
/dev/sda1: UUID="00000-000-000-0000000" TYPE="ext2" /dev/sda2: UUID="00000-000-000-0000000" TYPE="ext4" /dev/sda3: UUID="00000-000-000-0000000" TYPE="ext4" /dev/sda4: UUID="00000-000-000-0000000" TYPE="swap"
タイプが "swap" のパーティションがあれば大丈夫です。パーティションが存在しない場合、スワップ#スワップパーティションを見て、スワップパーティションを再作成・有効化してください。
サスペンドしようとしたときにカーソルしか表示されない黒画面になる
次のコマンドを実行したときにカーソルしか表示されなくなる場合:
$ sudo pm-suspend
/var/log/pm-suspend.log を開いて "ehci" や "xhci" を検索してください。"ehci_hd", "xhci_hd", "ehci_hcd" などという名前が見つかります。
それから root で /etc/pm/config.d/modules ファイルを作成して、先に見つけた ehci や xhci モジュールの名前を使ってコードを記述してください。例:
SUSPEND_MODULES="ehci_hcd"
これでサスペンドが機能するようになるはずです。
画面が表示されない問題
ノートパソコンを使っているユーザーの間でサスペンドやハイバネートからの復帰後に問題が発生することが報告されています。原因は /etc/mkinitcpio.conf ファイルの "HOOKS" 配列の autodetect フックです。resume フックを追加するのと同じ方法でフックは無効化できます。リストから autodetect を削除して新しいイメージを生成してください。
64ビットの OS で復帰できない
特定のマザーボードや BIOS の組み合わせで (特に Zotac の ITX ボードなどが知られています)、64ビットのオペレーティングシステムをインストールしている場合にサスペンドからの復帰が上手くできないことがあります。解決法は BIOS 設定を開いて DRAM 設定のページで "Memory Remapping Hole" を無効にしてください。RAM のサスペンドが修正されますが、全ての RAM が OS から認識されなくなる可能性もあります。
radeon ドライバーでハイバネートから復帰した時に黒画面になる
radeon ドライバーを使用していて /etc/mkinitcpio.conf の HOOKS 配列に radeon があると、ハイバネーションからの復帰時に黒画面になることがあります。ただし、他のプロセスは問題なく動作します (コンソールを開いてコマンドを実行することで確認できます)。radeon の電源管理方法として radeon.dpm=1 を使用していることに関連がある模様です (カーネル 3.13 からのデフォルトとなっています)。
HOOKS 行から radeon を削除 (そして initrd を再生成) することでこの問題は解決します ([3] を参照)。
ハイバネート時にコンピュータの電源が切れない
Linux をハイバネートしてディスクにデータが書き込まれた後、コンピュータの電源が正しく切れないことがあります。その場合、強制的に電源を切ってから再起動すると、復帰が正しく動作します。
/etc/pm/config.d/hibernate_mode という名前の実行可能ファイルを作成して、次の行を記述することで修正できます: HIBERNATE_MODE="shutdown"。その後 pm-hibernate でコンピュータが正しくシャットダウンされるようになります。
サスペンド後にディスプレイの電源が入らない (radeon)
radeon gpu でサスペンド後にディスプレイが表示されない場合、以下の内容で /etc/pm/config.d/radeon を作成してみてください:
/etc/pm/config.d/radeon
QUIRK_S3_BIOS="true" QUIRK_S3_MODE="true"
参照
- OpenSUSE Wiki - The article from where this was originally sourced (Licensed under GPL)
- Understanding Suspend - Ubuntu article explaining how suspending to RAM works
- PM Debugging - Basic PM debugging
- Cpufrequtils - CPU 周波数スケーリングと CPU 電源スキーム
- Acpid - ACPI イベントを通知するデーモン
- Hibernate after sleep - An example of a custom pm-utils hook where hibernation is triggered after a period of time in suspension