「Pm-utils」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(en:Pm-utilsへの転送ページ)
 
(文字列「http://www.spinics.net/」を「https://www.spinics.net/」に置換)
(3人の利用者による、間の13版が非表示)
1行目: 1行目:
#redirect[[en:Pm-utils]]
+
{{DISPLAYTITLE:pm-utils}}
  +
[[Category:電源管理]]
  +
[[en:Pm-utils]]
  +
[[it:Pm-utils]]
  +
[[ru:Pm-utils]]
  +
[[zh-hans:Pm-utils]]
  +
{{Related articles start}}
  +
{{Related|Uswsusp}}
  +
{{Related|TuxOnIce}}
  +
{{Related articles end}}
  +
{{Warning|
  +
* Pm-utils は公式にサポートされていません。systemd のサスペンド機能が同じ機能を提供します。
  +
* Pm-utils でハイバネートをして systemd をアップデートするとファイルが破壊されるという報告が存在します: https://bbs.archlinux.org/viewtopic.php?pid=1423442 。}}
  +
'''pm-utils''' はサスペンドと電源状態を設定するフレームワークです。{{ic|powersave}} などのスクリプトなどを置き換えるために作られました。
  +
  +
pm-utils はカーネルのサスペンドと復帰を様々なハックで包み込むシェルスクリプトのコレクションです。サスペンドに対応していないドライバーやサブシステムによるバグを回避するためにハックが必要になります。カスタムフックをディレクトリに配置することで簡単に拡張することができ、システムの管理者がフックを作成するだけでなく、パッケージによってフックがインストールされることもあります。システムのサスペンドや電源状態の変化に特別注意する必要があるパッケージにフックが含まれています。
  +
  +
あまり知られていない機能として [[Laptop Mode Tools]] による切り替えを模倣します。
  +
  +
[[CPU 周波数スケーリング|cpupower]] パッケージと組み合わせて使うことで、ノートパソコン (デスクトップ) のユーザーは完全な電源管理スイートとして利用できます。
  +
  +
== インストール ==
  +
  +
[[公式リポジトリ]]の {{AUR|pm-utils}} パッケージを[[pacman|インストール]]してください。
  +
  +
{{Note|
  +
* 復帰時にビデオに問題が発生する場合は、[[公式リポジトリ]]から {{Pkg|vbetool}} もインストールする必要があります。
  +
* 初めてインストールするときは、{{Pkg|acpi}} がインストールされていることを確認してください。
  +
}}
  +
  +
root で {{ic|pm-suspend}}, {{ic|pm-suspend-hybrid}}, {{ic|pm-hibernate}} を実行すると手動でサスペンドが行われます。サスペンドスクリプトは {{ic|/var/log/pm-suspend.log}} にログを書き出します。
  +
  +
=== 別のサスペンドバックエンドをインストール (任意) ===
  +
  +
Arch Linux のパッケージでは次のバックエンドに対応するようになっています: {{ic|kernel}}, {{ic|tuxonice}}, {{ic|uswsusp}}。
  +
  +
サスペンドバックエンドは {{ic|/etc/pm/config.d}} の {{ic|SLEEP_MODULE}} 設定変数で指定することができ、デフォルトでは {{ic|kernel}} バックエンドが使われます。別のサスペンドバックエンドを使うには、それぞれ必要なパッケージをインストールしてください。どちらも [[Arch User Repository]] からインストールできます:
  +
* uswsusp - {{AUR|uswsusp-git}}
  +
* tuxonice - {{AUR|linux-ice}}{{Broken package link|パッケージが存在しません}} / [[linux-pf]]
  +
  +
さらに、{{AUR|pm-utils}} には独自のビデオ互換データベースが付属しており、{{ic|/usr/lib/pm-utils/video-quirks/}} にインストールされます。
  +
  +
== 基本設定 ==
  +
  +
=== スタンバイ/RAM にサスペンド ===
  +
  +
理想的な状態は、root で {{ic|pm-suspend}} を実行することでメモリへのサスペンドが開始され、全ての動作状態が RAM に保存されて、消費電力を抑えるために RAM 以外の部品は全部シャットダウンされることです。また、電源ボタンを押すことでこの状態から復帰できなければなりません。
  +
  +
{{Note|ネットワークドライバーは SUSPENDED_MODULES に必ず記述することを推奨します。ほとんどのワイヤレスドライバーはスタンバイ後に問題を起こすことが知られています。Intel の iwlwifi, Atheros の ath5k, Realtek の r8* ドライバーなどが復帰後に問題を起こすという報告がフォーラムにあります。iwlwifi は復帰後にリロードしないと接続速度が 1Mbps まで落ちます。}}
  +
  +
場合によっては、{{ic|pm-suspend}} を実行するとフリーズするなどの問題が発生することがあります。特定のモジュールが正しく動作しないのが原因です。問題を発生させるモジュールがわかっている場合、{{ic|/etc/pm/config.d/modules}} の {{ic|SUSPEND_MODULES}} に以下のようにモジュールを追加します:
  +
SUSPEND_MODULES="uhci_hd button ehci_hd iwlwifi"
  +
設定に追加されたモジュールはサスペンドが行われる前にアンロードされ、復帰後にリロードされます。
  +
  +
ノートパソコンのフタを閉じた時などの電源イベントによって自動的に {{ic|pm-suspend}} を実行するように設定したい場合は、[[Acpid]] を参照してください。
  +
  +
=== ハイバネーション (suspend2disk) ===
  +
  +
[[サスペンドとハイバネート#ハイバネーション]]の指示に従ってハイバネーションを設定してください。
  +
  +
もしくは、{{ic|kernel}} バックエンドを使わない場合、[[Uswsusp#設定]] や [[TuxOnIce#ブートローダーの設定]] を見て下さい。
  +
  +
=== 通常ユーザーでサスペンド/ハイバネート ===
  +
  +
root パスワードを入力することなくサスペンドする方法は3つあります: [[Udev]] を使用する方法、UPower を使用する方法、[[sudo|visudo]] でユーザーに適当な権限を与える方法です。
  +
  +
==== ユーザーに権限を与える方法 ====
  +
  +
{{AUR|pm-utils}} スクリプトは root で実行する必要があるため、sudo を使うことで root パスワードを入力しないで通常ユーザーでスクリプトを使えるようにすることができます。そうするには、root で {{ic|visudo}} を使って {{ic|/etc/sudoers}} ファイルを編集してください。詳しくは、[[sudo]] を参照。
  +
  +
以下の行を追加してください。{{ic|''username''}} はあなたのユーザー名に置き換えて、保存してから {{ic|visudo}} を終了します:
  +
''username'' ALL = NOPASSWD: /usr/sbin/pm-hibernate
  +
''username'' ALL = NOPASSWD: /usr/sbin/pm-suspend
  +
  +
もしくは、グループを使うこともできます。以下の行を使って下さい。{{ic|''group''}} は置き換えて下さい:
  +
%''group'' ALL = NOPASSWD: /usr/sbin/pm-hibernate
  +
%''group'' ALL = NOPASSWD: /usr/sbin/pm-suspend
  +
  +
{{Note|These must come after any user privilege specifications, e.g., {{ic|1=username ALL=(ALL) ALL}}, or they will not work.}}
  +
  +
上記の設定によって、パスワードを入力しなくても以下のコマンドを実行することでスクリプトが実行できます:
  +
$ sudo pm-hibernate
  +
  +
もしくは:
  +
  +
$ sudo pm-suspend
  +
  +
また、ユーザーを {{ic|power}} [[グループ]]に追加して、アプレットなどを使用してサスペンドできるようにします。グループに追加していないと、[[GNOME]] のシャットダウンアプレットなどでサスペンドしようとしたときに、耳障りなビープ音が三回鳴って画面がロックされます。ユーザーをグループに追加するには:
  +
# gpasswd -a ''username'' power
  +
  +
これで[[デスクトップ環境]]の電源管理ツールを使って、ノートパソコンのフタが閉じられたとき、あるいはバッテリーの残量が少なくなったときに、自動的にサスペンドやハイバネートをすることができるようになります。
  +
  +
=== 省電力機能 ===
  +
  +
pm-utils ではシステムが AC アダプタに接続しているかどうかに合わせてコマンドを実行することができます。スクリプトを {{ic|/etc/pm/power.d/}} フォルダの中に作成してください。スクリプトの例は [http://crunchbanglinux.org/forums/post/110148/#p110148 crunchbang フォーラム] に存在します。AC 状態の変化を検出するには upower を動作させる必要があるので注意してください (詳しくは [https://bbs.archlinux.org/viewtopic.php?id=132125] を参照)。
  +
  +
==== AC 状態にあわせて明るさを変化させる ====
  +
  +
以下は AC 状態にあわせて輝度を変化させる例です。以下の内容で {{ic|/etc/pm/power.d/00-brightness}} というファイルを作成して、あなたのシステムに合わせて、輝度設定のパスとファイルに書き出す値を変更してください。
  +
  +
{{bc|
  +
#!/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 プログラムを使う方法があります。{{ic|xautolock -time 30 -locker "sudo pm-suspend" -detectsleep &}} を {{ic|~/.xinitrc}} に追加してください。30分間、何も動作がない場合に {{ic|pm-suspend}} を呼び出します。
  +
  +
=== 通常のスワップパーティションの代わりにスワップファイルを使う ===
  +
  +
通常のスワップパーティションの代わりにスワップファイルを使いたい場合、[[スワップ#スワップファイル|スワップファイル]]を見て下さい。
  +
  +
== 高度な設定 ==
  +
  +
メインの設定ファイルは {{ic|/usr/lib/pm-utils/defaults}} です。このファイルを編集してはいけません。パッケージのアップデートによって、デフォルト設定に書き換えられてしまう可能性があります。設定ファイルは {{ic|/etc/pm/config.d/}} に置くようにしてください。{{ic|/etc/pm/config.d}} に {{ic|modules}} や {{ic|config}} という名前で、以下の内容のシンプルなテキストファイルを作成することで、システム全体の設定ファイルの設定を上書きできます:
  +
SUSPEND_MODULES="button uhci_hcd"
  +
  +
=== 設定ファイルで利用できる変数 ===
  +
  +
; SUSPEND_MODULES="button": サスペンドする前にアンロードするモジュールのリスト
  +
; SLEEP_MODULE="tuxonice uswsusp kernel": 試行するデフォルトのスリープ/復帰システム
  +
; HIBERNATE_MODE="shutdown": 再起動ではなく強制的にシャットダウンさせる
  +
  +
=== フックの無効化 ===
  +
  +
不必要な、あるいは害を及ぼすフックが動作してしまう場合、それについてバグレポートを送って頂けると幸いです。{{ic|/etc/pm/sleep.d/}} にフックと呼応する空のファイルを作成することで簡単にフックを無効化できます。例えば {{ic|/usr/lib/pm-utils/sleep.d/45pcmcia}} フックを無効化したいときは、次を実行することで無効化できます:
  +
# touch /etc/pm/sleep.d/45pcmcia
  +
ダミーのフックには実行可能権限は付与しないでください。
  +
  +
{{Note|適当なディレクトリにダミーファイルを作成してください。例えば {{ic|/usr/lib/pm-utils/power.d}} のフックを無効化する場合、{{ic|/etc/pm/power.d}} にダミーファイルを作成する必要があります。}}
  +
  +
==== 別の方法 ====
  +
  +
ブラックリストにしたいモジュールを {{ic|HOOK_BLACKLIST}} 変数に定義したファイルを {{ic|/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"
  +
  +
=== フックの作成 ===
  +
  +
{{Note|systemd を使っている場合、sleep.d のフックはおそらく動作しません。そのようなときは systemd の[[電源管理#スリープフック|スリープフック]]を使って下さい。}}
  +
サスペンドやハイバネートのときに何か特別なことをしたい場合、簡単にフックを自分で作成して {{ic|/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
  +
  +
上記のファイルを {{ic|/etc/pm/sleep.d/66dummy}} として保存して {{ic|chmod +x /etc/pm/sleep.d/66dummy}} を実行してください。サスペンドや復帰時にメッセージが出力されます。
  +
  +
{{Warning|全てのフックは root で実行されます。したがって、一時ファイルを作成する場合は注意してください。セキュリティに問題が起きないように {{ic|PATH}} 環境変数が正しく設定されていることなどを確認します。}}
  +
  +
== 仕組み ==
  +
  +
仕組みはとても簡単です: メインスクリプト ({{ic|pm-suspend}}, {{ic|pm-hibernate}}, {{ic|pm-suspend-hybrid}} などのシンボリックリンクで {{ic|pm-action}} が呼びされます) はアルファベット順で実行可能スクリプトである"フック"を実行し、その際 {{ic|suspend}} (suspend to RAM) あるいは {{ic|hibernate}} (suspend to disk) のパラメータが使われます。全てのフックが実行されると、マシンはスリープ状態になります。マシンが再度起こされると、全てのフックは逆順に実行され {{ic|resume}} (resume from RAM) あるいは {{ic|thaw}} (resume from disk) のパラメータが使われます。フックは様々なことを行います。ブートローダーの準備や Bluetooth サブシステムの停止、重要なモジュールのアンロードなどです。
  +
  +
{{ic|pm-suspend}} と {{ic|pm-hibernate}} はどちらも大抵は [[Udev]] から呼び出され、Udev 自体は {{Pkg|gnome-power-manager}} や {{ic|kpowersave}} などのデスクトップアプレットから実行されます。
  +
  +
{{Note|{{ic|suspend-hybrid}} is a placeholder right now -- it is not completely implemented.}}
  +
  +
マシンを高出力モードあるいは低出力モードに設定することもできます。{{ic|true}} や {{ic|false}} のパラメータを追加して {{ic|pm-powersave}} コマンドを使います。基本的なところはサスペンドフレームワークと同じです。
  +
  +
サスペンドするときのフックは以下のディレクトリに配置されています:
  +
;{{ic|/usr/lib/pm-utils/sleep.d}}: ディストリビューションやパッケージによって配置されたフック
  +
;{{ic|/etc/pm/sleep.d}}: システム管理者によって追加されたフック
  +
  +
電源状態を変更するときのフックは以下のディレクトリに配置されています:
  +
;{{ic|/usr/lib/pm-utils/power.d}}: ディストリビューションやパッケージによって配置されたフック
  +
;{{ic|/etc/pm/power.d}}: システム管理者によって追加されたフック
  +
  +
{{ic|/etc/pm/}} のフックは {{ic|/usr/lib/pm-utils/}} のフックよりも優先されるため、システム管理者はディストリビューションによって決められたデフォルト設定を上書きすることができます。
  +
  +
=== Pm-suspend の内部 ===
  +
  +
This outlines the internal actions when {{ic|pm-suspend}} is run, describing how {{ic|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 {{Ic|METHOD}} is extracted from the executable name, ''suspend'' from {{ic|pm-suspend}} and ''hibernate'' from {{ic|pm-hibernate}}.
  +
  +
The location of runtime configuration parameters is defined in {{ic|/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 {{ic|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:
  +
{{hc|$ 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 {{Ic|pm-functions}} will source the files located in {{Ic|/etc/pm/config.d/}} in addition to {{ic|/usr/lib/pm-utils/defaults}}. Upon returning, {{Ic|pm-functions}} will proceed to source the files specified by '''$SLEEP_METHOD''' as {{Ic|/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, {{ic|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 {{Ic|uswsusp}} is specified, {{Ic|/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 {{Ic|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 {{Ic|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, {{Ic|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 {{ic|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.
  +
  +
== ヒントとテクニック ==
  +
  +
=== 復帰時にハードディスクの電源管理レベルを自動的に設定 ===
  +
  +
以下のようにフックを作成:
  +
{{hc|/etc/pm/sleep.d/50-hdparm_pm|<nowiki>
  +
#!/bin/dash
  +
  +
if [ -n "$1" ] && ([ "$1" = "resume" ] || [ "$1" = "thaw" ]); then
  +
hdparm -B 254 /dev/sda > /dev/null
  +
fi
  +
</nowiki>}}
  +
  +
そして次を実行:
  +
# chmod +x /etc/pm/sleep.d/50-hdparm_pm
  +
  +
上記の [[Bash]] スクリプトが動作しない場合、以下のスクリプトで動作する可能性があります:
  +
{{hc|/etc/pm/sleep.d/50-hdparm_pm|<nowiki>
  +
#!/bin/sh
  +
  +
. "${PM_FUNCTIONS}"
  +
case "$1" in
  +
thaw|resume)
  +
sleep 6
  +
hdparm -B 254 /dev/sda
  +
;;
  +
*)
  +
;;
  +
esac
  +
exit $NA
  +
</nowiki>}}
  +
  +
{{ic|-B}} スイッチの値を低くすると効果があるかもしれません。[[hdparm]] を見て下さい。
  +
  +
=== マウスの再起動 ===
  +
  +
ノートパソコンによっては、サスペンドがされた後にマウスが動かなくなることがあります。{{ic|/etc/pm/hooks}} にフックを作成して PS/2 ドライバー (例: {{ic|i8042}}) を強制的に再初期化することで解決します ([[#フックの作成|フックの作成]]を参照):
  +
  +
#!/bin/sh
  +
echo -n "i8042" > /sys/bus/platform/drivers/i8042/unbind
  +
echo -n "i8042" > /sys/bus/platform/drivers/i8042/bind
  +
  +
=== Openbox のメニューにスリープモードを追加 ===
  +
  +
Openbox を使っている場合、{{ic|~/.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" ボタンは {{ic|acpid}} の {{ic|/etc/acpi/handler.sh}} で処理されます ("button/power" と "power/sleep" エントリを見て下さい)。{{ic|pm-suspend}} や {{ic|pm-hibernate}} を呼び出すようにデフォルトのアクションを置き換えることができます。
  +
  +
[[電源管理#ACPI イベント|systemd]] は独自に電源イベントを管理しており pm-utils や {{ic|/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 {{ic|/etc/pm/sleep.d}} folder. Make sure the script is executable (chmod 755) and owned by {{ic|root:root}}.
  +
  +
シンプルなサンプルスクリプト:
  +
  +
{{hc|/etc/pm/sleep.d/00screensaver-lock|<nowiki>
  +
#!/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</nowiki>}}
  +
  +
{{ic|/usr/bin/slimlock}} は使用する画面ロックユーティリティのパスに置き換えてください。
  +
  +
ユーザー名をハードコードしたくない場合 (例えばユーザーが複数いる場合など)、現在の X11 ユーザー名とディスプレイ番号を確認する必要があります。[[systemd]] を使っている場合、[https://github.com/rephorm/xuserrun xuserrun] と以下の sleep.d スクリプトが使えます (xuserrun と画面ロッカーのパスは適宜修正してください):
  +
  +
{{hc|/etc/pm/sleep.d/00screensaver-lock|<nowiki>
  +
#!/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
  +
</nowiki>}}
  +
  +
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:
  +
  +
{{hc|/etc/pm/sleep.d/00screensaver-lock|<nowiki>
  +
#!/bin/sh
  +
#
  +
# 00screensaver-lock: lock workstation on hibernate or suspend
  +
  +
case "$1" in
  +
hibernate|suspend)
  +
loginctl lock-sessions
  +
;;
  +
thaw|resume)
  +
;;
  +
*) exit $NA
  +
;;
  +
esac
  +
</nowiki>}}
  +
  +
=== polkit でハイバネーションを無効化 ===
  +
  +
ハイバネーションを無効化するには、{{ic|/etc/polkit-1/}} に {{ic|99-disable-hibernate.rules}} という名前の新しいファイルを作成してください。そして、以下の内容を記述します:
  +
  +
{{hc|99-disable-hibernate.rules|<nowiki>
  +
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;
  +
}
  +
});
  +
</nowiki>}}
  +
  +
KDE を使っている場合、一度ログオフすればハイバネーションオプションが消えます。
  +
  +
== トラブルシューティング ==
  +
  +
サスペンドやハイバネートが正しく動作しない場合、ログファイル {{ic|/var/log/pm-suspend.log}} に何らかの情報を見つけられる可能性があります。例えば、動作したフックやフックの出力などがログファイルで確認できます。
  +
  +
また、{{ic|pm-is-supported}} コマンドの出力も確認してください。このコマンドは ({{ic|--hibernate}} や {{ic|--suspend}} フラグが付けられたときに) サニティチェックを実行して、設定に問題がある場合エラーを報告します。設定の問題以外のエラーは認識してくれませんが、それでも有用ではあります。
  +
  +
=== セグメンテーション違反 ===
  +
  +
セグメンテーション違反が発生してシステムが反応しなくなったりする場合、[[#ハイバネーション (suspend2disk)|上]]で説明しているように {{ic|/boot/grub/menu.lst}} の resume-path に UUID を設定してみてください。
  +
  +
=== サスペンドから復帰する代わりに再起動する ===
  +
  +
この問題はサスペンド時に NVS 領域を保存するようになってから起こるようになりました (2.6.35-rc4) ([https://www.spinics.net/lists/linux-acpi/msg29521.html メーリングリストの投稿])。しかしながら、全てのマシンでこの機構が動作するとは限らないと知れ渡ってから、カーネルの開発者は {{ic|1=acpi_sleep=nonvs}} カーネルコマンドラインオプションで無効化できるようにしています ([[カーネルパラメータ]]を参照)。
  +
  +
=== サスペンドから復帰するとシャットダウンしてしまう ===
  +
  +
Acer Aspire AS3810TG では、サスペンドから復帰すると、パソコンが立ち上がるかわりにシャットダウンしてしまいます。同じような問題が発生する場合、カーネルに {{ic|1=i8042.reset=1}} パラメータを指定してみてください。[[GRUB]] の場合、{{ic|/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 コントローラを搭載したコンピュータの場合 (一部のノートパソコンはこの機能を内部的に搭載しています)、[[カーネルパラメータ]]に {{ic|1=i8042.nomux=1}} を追加してみてください ({{ic|1=i8042.reset=1}} も追加する必要があるかもしれません)。もしくは、BIOS の設定で PS/2 Y アダプタを無効化出来る場合があります。
  +
  +
* BIOS の設定で [[wikipedia:ja:Intel SpeedStep テクノロジ|Intel SpeedStep]] 機能を無効化すると問題が解決する場合があります (例: Dell Inspiron Mini 1018)。また、以下のファイルを {{ic|/etc/pm/sleep.d/}} に作成することで SpeedStep を無効化することなく試すことができます ({{Pkg|vbetool}} が必要です):{{bc|<nowiki>
  +
#!/bin/sh
  +
#
  +
case "$1" in
  +
suspend)
  +
;;
  +
resume)
  +
sleep 5
  +
vbetool dpms off
  +
vbetool dpms on
  +
;;
  +
*) exit $NA
  +
;;
  +
esac
  +
</nowiki>}} ファイル名は何でもかまいませんが名前の最初に必ず {{ic|00}} を付けてください。また、作成後にスクリプトに {{ic|chmod +x}} で実行可能権限を与えてください。<br>他のコマンドが呼ばれるのが早すぎる場合 {{ic|sleep}} の時間を調整してください。
  +
  +
* BIOS の VT-d 仮想化の設定を "VT-x only" にして無効化する (例: Toshiba Portégé R830)。
  +
  +
=== VirtualBox の問題 ===
  +
  +
ノートパソコンによっては VirtualBox のカーネルモジュールによって {{ic|pm-suspend}} や {{ic|pm-hibernate}} が機能しなくなることがあります ([https://bbs.archlinux.org/viewtopic.php?id=123354] を参照)。サスペンドやハイバネートがされる代わりに、システムはフリーズしてインジケータ LED が点滅します (ThinkPad の場合、サスペンドインジケータが点滅。MSI Wind U100 の場合、Caps Lock や Scroll Lock のインジケータが点滅)。{{ic|pm-suspend}} と {{ic|pm-hibernate}} のログは通常通りに出力されます。
  +
  +
サスペンドやハイバネートをする前にモジュールをアンロードして、復帰後にモジュールをリロードするようにすることで問題を解決できます。スクリプトを使うことでモジュールを管理できます:
  +
{{bc|1=
  +
#!/bin/sh
  +
  +
rmmod vboxdrv
  +
pm-hibernate
  +
modprobe vboxdrv
  +
}}
  +
  +
{{Note|root で {{ic|vboxbuild}} を実行してカーネルモジュールをリビルドすることで問題が解決するという報告もあります。}}
  +
  +
=== スワップパーティションが存在しないのにハイバネート ===
  +
  +
有効なスワップパーティションが存在しないのにハイバネートしようとすると、ハイバネートが開始されるようにみえて、すぐに復帰してしまいます。たとえ、ログ出力を詳細にするように指定していても、スワップパーティションが存在しないことに関するエラーメッセージが全く表示されません。そのため、この問題をデバッグするのは大変です。スワップパーティションが何らかの理由で破損していて無効になっていると、インストール時にスワップパーティションを設定していてもこの問題が発生することがあります。ハイバネートですぐ復帰するようならば、使用しているスワップパーティションが本当に有効になっているか確認してください。{{ic|blkid}} コマンドの出力が以下のようになっている場合:
  +
{{hc|# blkid|2=
  +
/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"
  +
}}
  +
タイプが {{ic|"swap"}} のパーティションがあれば大丈夫です。パーティションが存在しない場合、[[スワップ#スワップパーティション]]を見て、スワップパーティションを再作成・有効化してください。
  +
  +
=== サスペンドしようとしたときにカーソルしか表示されない黒画面になる ===
  +
  +
次のコマンドを実行したときにカーソルしか表示されなくなる場合:
  +
$ sudo pm-suspend
  +
{{ic|/var/log/pm-suspend.log}} を開いて "ehci" や "xhci" を検索してください。"ehci_hd", "xhci_hd", "ehci_hcd" などという名前が見つかります。
  +
  +
それから root で {{ic|/etc/pm/config.d/modules}} ファイルを作成して、先に見つけた ehci や xhci モジュールの名前を使ってコードを記述してください。例:
  +
SUSPEND_MODULES="ehci_hcd"
  +
これでサスペンドが機能するようになるはずです。
  +
  +
=== 画面が表示されない問題 ===
  +
  +
ノートパソコンを使っているユーザーの間でサスペンドやハイバネートからの復帰後に問題が発生することが報告されています。原因は {{ic|/etc/mkinitcpio.conf}} ファイルの "HOOKS" 配列の {{ic|autodetect}} フックです。{{ic|resume}} フックを追加するのと同じ方法でフックは無効化できます。リストから {{ic|autodetect}} を削除して新しいイメージを生成してください。
  +
  +
{{Note|[[plymouth]] を使っている場合、それが原因かもしれません。{{ic|/etc/mkinitcpio.conf}} ファイルの "HOOKS" 配列で {{ic|plymouth}} の前に {{ic|resume}} を追加することで問題が解決する場合があります。}}
  +
  +
=== 64ビットの OS で復帰できない ===
  +
  +
特定のマザーボードや BIOS の組み合わせで (特に Zotac の ITX ボードなどが知られています)、64ビットのオペレーティングシステムをインストールしている場合にサスペンドからの復帰が上手くできないことがあります。解決法は BIOS 設定を開いて DRAM 設定のページで "Memory Remapping Hole" を無効にしてください。RAM のサスペンドが修正されますが、全ての RAM が OS から認識されなくなる可能性もあります。
  +
  +
=== radeon ドライバーでハイバネートから復帰した時に黒画面になる ===
  +
  +
radeon ドライバーを使用していて {{ic|/etc/mkinitcpio.conf}} の {{ic|HOOKS}} 配列に {{ic|radeon}} があると、ハイバネーションからの復帰時に黒画面になることがあります。ただし、他のプロセスは問題なく動作します (コンソールを開いてコマンドを実行することで確認できます)。radeon の電源管理方法として {{ic|radeon.dpm<nowiki>=</nowiki>1}} を使用していることに関連がある模様です (カーネル 3.13 からのデフォルトとなっています)。
  +
  +
HOOKS 行から {{ic|radeon}} を削除 (そして initrd を再生成) することでこの問題は解決します ([https://bugs.freedesktop.org/show_bug.cgi?id=72716] を参照)。
  +
  +
=== ハイバネート時にコンピュータの電源が切れない ===
  +
  +
Linux をハイバネートしてディスクにデータが書き込まれた後、コンピュータの電源が正しく切れないことがあります。その場合、強制的に電源を切ってから再起動すると、復帰が正しく動作します。
  +
  +
{{ic|/etc/pm/config.d/hibernate_mode}} という名前の実行可能ファイルを作成して、次の行を記述することで修正できます: {{ic|HIBERNATE_MODE<nowiki>=</nowiki>"shutdown"}}。その後 pm-hibernate でコンピュータが正しくシャットダウンされるようになります。
  +
  +
=== サスペンド後にディスプレイの電源が入らない (radeon) ===
  +
  +
radeon gpu でサスペンド後にディスプレイが表示されない場合、以下の内容で {{ic|/etc/pm/config.d/radeon}} を作成してみてください:
  +
  +
{{hc|/etc/pm/config.d/radeon|2=
  +
QUIRK_S3_BIOS="true"
  +
QUIRK_S3_MODE="true"
  +
}}
  +
  +
== 参照 ==
  +
  +
* [https://en.opensuse.org/SDB:Pm-utils OpenSUSE Wiki] - The article from where this was originally sourced (Licensed under GPL)
  +
* [https://wiki.ubuntu.com/UnderstandingSuspend Understanding Suspend] - Ubuntu article explaining how suspending to RAM works
  +
* [https://www.mjmwired.net/kernel/Documentation/power/basic-pm-debugging.txt#178 PM Debugging] - Basic PM debugging
  +
*[[Cpufrequtils]] - CPU 周波数スケーリングと CPU 電源スキーム
  +
*[[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月7日 (水) 00:17時点における版

関連記事

警告:
  • Pm-utils は公式にサポートされていません。systemd のサスペンド機能が同じ機能を提供します。
  • Pm-utils でハイバネートをして systemd をアップデートするとファイルが破壊されるという報告が存在します: https://bbs.archlinux.org/viewtopic.php?pid=1423442

pm-utils はサスペンドと電源状態を設定するフレームワークです。powersave などのスクリプトなどを置き換えるために作られました。

pm-utils はカーネルのサスペンドと復帰を様々なハックで包み込むシェルスクリプトのコレクションです。サスペンドに対応していないドライバーやサブシステムによるバグを回避するためにハックが必要になります。カスタムフックをディレクトリに配置することで簡単に拡張することができ、システムの管理者がフックを作成するだけでなく、パッケージによってフックがインストールされることもあります。システムのサスペンドや電源状態の変化に特別注意する必要があるパッケージにフックが含まれています。

あまり知られていない機能として Laptop Mode Tools による切り替えを模倣します。

cpupower パッケージと組み合わせて使うことで、ノートパソコン (デスクトップ) のユーザーは完全な電源管理スイートとして利用できます。

目次

インストール

公式リポジトリpm-utilsAUR パッケージをインストールしてください。

ノート:
  • 復帰時にビデオに問題が発生する場合は、公式リポジトリから vbetool もインストールする必要があります。
  • 初めてインストールするときは、acpi がインストールされていることを確認してください。

root で pm-suspend, pm-suspend-hybrid, pm-hibernate を実行すると手動でサスペンドが行われます。サスペンドスクリプトは /var/log/pm-suspend.log にログを書き出します。

別のサスペンドバックエンドをインストール (任意)

Arch Linux のパッケージでは次のバックエンドに対応するようになっています: kernel, tuxonice, uswsusp

サスペンドバックエンドは /etc/pm/config.dSLEEP_MODULE 設定変数で指定することができ、デフォルトでは kernel バックエンドが使われます。別のサスペンドバックエンドを使うには、それぞれ必要なパッケージをインストールしてください。どちらも Arch User Repository からインストールできます:

さらに、pm-utilsAUR には独自のビデオ互換データベースが付属しており、/usr/lib/pm-utils/video-quirks/ にインストールされます。

基本設定

スタンバイ/RAM にサスペンド

理想的な状態は、root で pm-suspend を実行することでメモリへのサスペンドが開始され、全ての動作状態が RAM に保存されて、消費電力を抑えるために RAM 以外の部品は全部シャットダウンされることです。また、電源ボタンを押すことでこの状態から復帰できなければなりません。

ノート: ネットワークドライバーは SUSPENDED_MODULES に必ず記述することを推奨します。ほとんどのワイヤレスドライバーはスタンバイ後に問題を起こすことが知られています。Intel の iwlwifi, Atheros の ath5k, Realtek の r8* ドライバーなどが復帰後に問題を起こすという報告がフォーラムにあります。iwlwifi は復帰後にリロードしないと接続速度が 1Mbps まで落ちます。

場合によっては、pm-suspend を実行するとフリーズするなどの問題が発生することがあります。特定のモジュールが正しく動作しないのが原因です。問題を発生させるモジュールがわかっている場合、/etc/pm/config.d/modulesSUSPEND_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
ノート: These must come after any user privilege specifications, e.g., username ALL=(ALL) ALL, or they will not work.

上記の設定によって、パスワードを入力しなくても以下のコマンドを実行することでスクリプトが実行できます:

$ 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.dmodulesconfig という名前で、以下の内容のシンプルなテキストファイルを作成することで、システム全体の設定ファイルの設定を上書きできます:

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

ダミーのフックには実行可能権限は付与しないでください。

ノート: 適当なディレクトリにダミーファイルを作成してください。例えば /usr/lib/pm-utils/power.d のフックを無効化する場合、/etc/pm/power.d にダミーファイルを作成する必要があります。

別の方法

ブラックリストにしたいモジュールを 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"

フックの作成

ノート: systemd を使っている場合、sleep.d のフックはおそらく動作しません。そのようなときは systemd のスリープフックを使って下さい。

サスペンドやハイバネートのときに何か特別なことをしたい場合、簡単にフックを自分で作成して /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 を実行してください。サスペンドや復帰時にメッセージが出力されます。

警告: 全てのフックは root で実行されます。したがって、一時ファイルを作成する場合は注意してください。セキュリティに問題が起きないように PATH 環境変数が正しく設定されていることなどを確認します。

仕組み

仕組みはとても簡単です: メインスクリプト (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-suspendpm-hibernate はどちらも大抵は Udev から呼び出され、Udev 自体は gnome-power-managerkpowersave などのデスクトップアプレットから実行されます。

ノート: suspend-hybrid is a placeholder right now -- it is not completely implemented.

マシンを高出力モードあるいは低出力モードに設定することもできます。truefalse のパラメータを追加して 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-suspendpm-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-suspendpm-hibernate が機能しなくなることがあります ([2] を参照)。サスペンドやハイバネートがされる代わりに、システムはフリーズしてインジケータ LED が点滅します (ThinkPad の場合、サスペンドインジケータが点滅。MSI Wind U100 の場合、Caps Lock や Scroll Lock のインジケータが点滅)。pm-suspendpm-hibernate のログは通常通りに出力されます。

サスペンドやハイバネートをする前にモジュールをアンロードして、復帰後にモジュールをリロードするようにすることで問題を解決できます。スクリプトを使うことでモジュールを管理できます:

#!/bin/sh

rmmod vboxdrv
pm-hibernate
modprobe vboxdrv
ノート: root で vboxbuild を実行してカーネルモジュールをリビルドすることで問題が解決するという報告もあります。

スワップパーティションが存在しないのにハイバネート

有効なスワップパーティションが存在しないのにハイバネートしようとすると、ハイバネートが開始されるようにみえて、すぐに復帰してしまいます。たとえ、ログ出力を詳細にするように指定していても、スワップパーティションが存在しないことに関するエラーメッセージが全く表示されません。そのため、この問題をデバッグするのは大変です。スワップパーティションが何らかの理由で破損していて無効になっていると、インストール時にスワップパーティションを設定していてもこの問題が発生することがあります。ハイバネートですぐ復帰するようならば、使用しているスワップパーティションが本当に有効になっているか確認してください。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 を削除して新しいイメージを生成してください。

ノート: plymouth を使っている場合、それが原因かもしれません。/etc/mkinitcpio.conf ファイルの "HOOKS" 配列で plymouth の前に resume を追加することで問題が解決する場合があります。

64ビットの OS で復帰できない

特定のマザーボードや BIOS の組み合わせで (特に Zotac の ITX ボードなどが知られています)、64ビットのオペレーティングシステムをインストールしている場合にサスペンドからの復帰が上手くできないことがあります。解決法は BIOS 設定を開いて DRAM 設定のページで "Memory Remapping Hole" を無効にしてください。RAM のサスペンドが修正されますが、全ての RAM が OS から認識されなくなる可能性もあります。

radeon ドライバーでハイバネートから復帰した時に黒画面になる

radeon ドライバーを使用していて /etc/mkinitcpio.confHOOKS 配列に 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