「Pm-utils」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(en:Pm-utilsへの転送ページ)
 
1行目: 1行目:
#redirect[[en:Pm-utils]]
+
{{DISPLAYTITLE:pm-utils}}
  +
[[Category:電源管理]]
  +
[[en:Pm-utils]]
  +
[[it:Pm-utils]]
  +
[[ru:Pm-utils]]
  +
[[zh-CN:Pm-utils]]
  +
{{Related articles start}}
  +
{{Related|Uswsusp}}
  +
{{Related|TuxOnIce}}
  +
{{Related articles end}}
  +
{{Warning|1=Pm-utils でハイバネートをして systemd をアップデートするとファイルが破壊されるという報告が存在します: https://bbs.archlinux.org/viewtopic.php?pid=1423442 。}}
  +
'''pm-utils''' はサスペンドと電源状態を設定するフレームワークです。{{ic|powersave}} などのスクリプトなどを置き換えるために作られました。
  +
  +
pm-utils はカーネルのサスペンドと復帰を様々なハックで包み込むシェルスクリプトのコレクションです。サスペンドに対応していないドライバーやサブシステムによるバグを回避するためにハックが必要になります。カスタムフックをディレクトリに配置することで簡単に拡張することができ、システムの管理者がフックを作成するだけでなく、パッケージによってフックがインストールされることもあります。システムのサスペンドや電源状態の変化に特別注意する必要があるパッケージにフックが含まれています。
  +
  +
あまり知られていない機能として [[Laptop Mode Tools]] による切り替えを模倣します。
  +
  +
[[CPU 周波数スケーリング|cpupower]] パッケージと組み合わせて使うことで、ノートパソコン (デスクトップ) のユーザーは完全な電源管理スイートとして利用できます。
  +
  +
== インストール ==
  +
  +
[[公式リポジトリ]]の {{Pkg|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}}。以下のコマンドで確認できます:
  +
pacman -Ql pm-utils | grep module.d
  +
  +
サスペンドバックエンドは {{ic|/etc/pm/config.d}} の {{ic|SLEEP_MODULE}} 設定変数で指定することができ、デフォルトでは {{ic|kernel}} バックエンドが使われます。別のサスペンドバックエンドを使うには、それぞれ必要なパッケージをインストールしてください。どちらも [[Arch User Repository]] からインストールできます:
  +
* uswsusp - {{AUR|uswsusp-git}}
  +
* tuxonice - {{AUR|linux-ice}} / [[linux-pf]]
  +
  +
さらに、{{Pkg|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]] でユーザーに適当な権限を与える方法です。
  +
  +
==== ユーザーに権限を与える方法 ====
  +
  +
{{Pkg|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": 再起動ではなく強制的にシャットダウンさせる
  +
  +
=== フックの無効化 ===
  +
  +
If a hook is run which you do not like or which you think is not useful or even harmful, we would appreciate a bug report for that.
  +
You can however easily disable hooks by just creating an empty file corresponding to the hook in {{ic|/etc/pm/sleep.d/}}. Say you want to disable the hook {{ic|/usr/lib/pm-utils/sleep.d/45pcmcia}}, you can do this easily by calling
  +
# touch /etc/pm/sleep.d/45pcmcia
  +
Do not set the executable bit on that dummy-hook.
  +
  +
Note: Make sure you create the dummy files in the appropriate directory. For example if you are trying to disable hooks in /usr/lib/pm-utils/power.d, you will need to place the dummy file in /etc/pm/power.d.
  +
  +
==== 別の方法 ====
  +
  +
Create a file in {{ic|/etc/pm/config.d}} with the modules you want to blacklist in the {{ic|HOOK_BLACKLIST}} variable.
  +
For example, to manage power saving yourself, use:
  +
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 の[[電源管理#スリープフック|スリープフック]]を使って下さい。}}
  +
If you want to do something specific to your setup during suspend or hibernate, then you can easily put your own hook into {{ic|/etc/pm/sleep.d}}. The hooks in this directory will be called in alphabetic order during suspend (that is the reason their names all start with 2 digits, to make the ordering explicit) and in the reverse order during resume. The general convention to be followed on number ordering is:.
  +
;00 - 49: User and most package supplied hooks. If a hook assumes that all of the usual services and userspace infrastructure is still running, it should be here.
  +
;50 - 74: Service handling hooks. Hooks that start or stop a service belong in this range. At or before 50, hooks can assume that all services are still enabled.
  +
;75 - 89: Module and non-core hardware handling. If a hook needs to load/unload a module, or if it needs to place non-video hardware that would otherwise break suspend or hibernate into a safe state, it belongs in this range. At or before 75, hooks can assume all modules are still loaded.
  +
;90 - 99: Reserved for critical suspend hooks.
  +
  +
I am showing a pretty useless demonstration hook here, that will just put some informative lines into your log file:
  +
  +
#!/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
  +
  +
Put this into {{ic|/etc/pm/sleep.d/66dummy}}, do a {{ic|chmod +x /etc/pm/sleep.d/66dummy}} and it will spew some useless lines during suspend and resume.
  +
  +
{{Warning|All the hooks run as root. This means that you need to be careful when creating temporary files, check that the {{ic|PATH}} environment variable is set correctly, etc. to avoid security problems.}}
  +
  +
== 仕組み ==
  +
  +
The concept is quite easy: the main script ({{ic|pm-action}}, called via symlinks as either {{ic|pm-suspend}}, {{ic|pm-hibernate}} or {{ic|pm-suspend-hybrid}}) executes so-called "hooks", executable scripts, in the alphabetical sorted order with the parameter {{ic|suspend}} (suspend to RAM) or {{ic|hibernate}} (suspend to disk).
  +
Once all hooks are done, it puts the machine to sleep. After the machine has woken up again, all those hooks are executed in reverse order with the parameter {{ic|resume}} (resume from RAM) or {{ic|thaw}} (resume from disk).
  +
The hooks perform various tasks, such as preparing the bootloader, stopping the Bluetooth subsystem, or unloading of critical modules.
  +
  +
Both {{ic|pm-suspend}} and {{ic|pm-hibernate}} are usually called from [[Udev]], initiated by desktop applets like {{Pkg|gnome-power-manager}} or {{ic|kpowersave}}.
  +
  +
{{Note|{{ic|suspend-hybrid}} is a placeholder right now -- it is not completely implemented.}}
  +
  +
There is also the possibility to set the machine into high-power and low-power mode, the command {{ic|pm-powersave}} is used with an additional parameter of {{ic|true}} or {{ic|false}}. It works basically the same as the suspend framework.
  +
  +
The hooks for suspend are placed in
  +
;{{ic|/usr/lib/pm-utils/sleep.d}}: distribution / package provided hooks
  +
;{{ic|/etc/pm/sleep.d}}: hooks added by the system administrator
  +
  +
The hooks for the power state are placed in
  +
;{{ic|/usr/lib/pm-utils/power.d}}: distribution / package provided hooks
  +
;{{ic|/etc/pm/power.d}}: hooks added by the system administrator
  +
  +
Hooks in {{ic|/etc/pm/}} take precedence over those in {{ic|/usr/lib/pm-utils/}}, so the system administrator can override the defaults provided by the distribution.
  +
  +
=== Pm-suspend internals ===
  +
  +
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.
  +
  +
== Tips and tricks ==
  +
  +
=== Having the HD power management level automatically set again on resume ===
  +
  +
Do it like this:
  +
{{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>}}
  +
  +
Then run:
  +
# chmod +x /etc/pm/sleep.d/50-hdparm_pm
  +
  +
If the above [[Bash]] script fails the work, the following may work instead:
  +
{{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>}}
  +
  +
Lower {{ic|-B}} switch values may be effective. See [[hdparm]].
  +
  +
=== マウスの再起動 ===
  +
  +
On some laptops the mouse will hang after an otherwise successful suspend. One way to remedy this is to force a re-initialization of the PS/2 driver (here {{ic|i8042}}) through a hook in {{ic|/etc/pm/hooks}} (see [[#Creating_your_own_hooks|hooks]])
  +
  +
#!/bin/sh
  +
echo -n "i8042" > /sys/bus/platform/drivers/i8042/unbind
  +
echo -n "i8042" > /sys/bus/platform/drivers/i8042/bind
  +
  +
=== Add sleep modes to Openbox menu ===
  +
  +
Openbox users can add the new scripts as additional shutdown options within the Openbox menu by adding the items to a new or existing sub-menu in {{ic|~/.config/openbox/menu.xml}}, for example:
  +
<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/*}} のスクリプトは使わないので注意してください。
  +
  +
=== Locking the screen saver on hibernate or suspend ===
  +
  +
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}}.
  +
  +
A simple example script is:
  +
  +
{{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>}}
  +
  +
Replace {{ic|/usr/bin/slimlock}} with the path to your screen locking utility of choice.
  +
  +
If you do not wish to hard-code your username (e.g., if you have multiple users), then it is necessary to determine the current X11 username and display number. For systems using [[systemd]], you can use [https://github.com/rephorm/xuserrun xuserrun] and the following sleep.d script (be sure to modify the path to xuserrun and your desired screen locker):
  +
  +
{{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}} に何らかの情報を見つけられる可能性があります。例えば、動作したフックやフックの出力などがログファイルで確認できます。
  +
  +
Also, check the output of the {{ic|pm-is-supported}} command. This command (with the {{ic|--hibernate}} or {{ic|--suspend}} flag) will do some sanity checking and report any errors it finds in your configuration. It will not detect all possible errors, but may still be useful.
  +
  +
=== セグメンテーション違反 ===
  +
  +
セグメンテーション違反が発生してシステムが反応しなくなったりする場合、[[#ハイバネーション (suspend2disk)|上]]で説明しているように {{ic|/boot/grub/menu.lst}} の resume-path に UUID を設定してみてください。
  +
  +
=== サスペンドから復帰する代わりに再起動する ===
  +
  +
この問題はサスペンド時に NVS 領域を保存するようになってから起こるようになりました (2.6.35-rc4) ([http://www.spinics.net/lists/linux-acpi/msg29521.html メーリングリストの投稿])。しかしながら、全てのマシンでこの機構が動作するとは限らないと知れ渡ってから、カーネルの開発者は {{ic|1=acpi_sleep=nonvs}} カーネルコマンドラインオプションで無効化できるようにしています ([[カーネルパラメータ]]を参照)。
  +
  +
=== Resume from suspend shuts down instead of wake up ===
  +
  +
On an Acer Aspire AS3810TG, resuming from suspend shuts down the computer instead of waking it up. If you experience a similar issue, try passing the parameter {{ic|1=i8042.reset=1}} to your kernel. In [[GRUB]], the line in {{ic|/boot/grub/grub.cfg}} should be something like this:
  +
linux /vmlinuz-linux root=/dev/vg00/root resume=/dev/vg00/swap i8042.reset=1 ro
  +
  +
Although I have not tested this, you could also set this parameter live without having to restart by doing:
  +
# sysctl -e -w i8042.reset=1
  +
  +
=== Blank screen when waking from suspend ===
  +
  +
Some laptops (e.g. Dell Inspiron Mini 1018) will just show a black screen with no backlight after resuming from suspend. If this happens to you, try going into the BIOS of the laptop and disabling Intel SpeedStep if it is present.
  +
  +
You could also try, without disabling SpeedStep, creating a quirk in {{ic|/etc/pm/sleep.d/}} with this content (requires {{Pkg|vbetool}}):
  +
{{bc|
  +
#!/bin/sh
  +
#
  +
case "$1" in
  +
suspend)
  +
;;
  +
resume)
  +
sleep 5
  +
vbetool dpms off
  +
vbetool dpms on
  +
;;
  +
*) exit $NA
  +
;;
  +
esac
  +
}}
  +
save it as you want but with a {{ic|00}} in front of the name so this is called last when resuming; remember to {{ic|chmod +x}} the script.
  +
Try adjusting the {{ic|sleep}} time if the other commands are called too soon, or if it works well, you can also try removing that line.
  +
  +
Some other laptops (e.g. Toshiba Portégé R830) will just show a black screen with no backlight after resuming from suspend, with fans blowing at top speed. If this is what you're seeing, try going into the BIOS and disable the VT-d virtualization setting by switching to "VT-x only".
  +
  +
=== VirtualBox problems ===
  +
  +
The VirtualBox kernel modules cause {{ic|pm-suspend}} and {{ic|pm-hibernate}} to fail on some laptops. (See [https://bbs.archlinux.org/viewtopic.php?id=123354 this discussion]). Instead of suspending or hibernating, the system freezes and indicator LEDs blink (the suspend indicator in the case of ThinkPads and the Caps Lock and Scroll Lock indicators in the case of the MSI Wind U100). The {{ic|pm-suspend}} and {{ic|pm-hibernate}} logs appear normal.
  +
  +
The problem can be fixed by removing the modules before suspension or hibernation and reloading them afterwards. That can be accomplished through a script:
  +
{{bc|1=
  +
#!/bin/sh
  +
  +
rmmod vboxdrv
  +
pm-hibernate
  +
modprobe vboxdrv
  +
}}
  +
  +
{{Note|Some users reported that it is sufficient to rebuild the kernel module by running {{ic|vboxbuild}} as root.}}
  +
  +
=== スワップパーティションが存在しないのにハイバネート ===
  +
  +
有効なスワップパーティションが存在しないのにハイバネートしようとすると、ハイバネートが開始されるようにみえて、すぐに復帰してしまいます。たとえ、ログ出力を詳細にするように指定していても、スワップパーティションが存在しないことに関するエラーメッセージが全く表示されません。そのため、この問題をデバッグするのは大変です。スワップパーティションが何らかの理由で破損していて無効になっていると、インストール時にスワップパーティションを設定していてもこの問題が発生することがあります。ハイバネートですぐ復帰するようならば、使用しているスワップパーティションが本当に有効になっているか確認してください。{{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"}} のパーティションがあれば大丈夫です。パーティションが存在しない場合、[[スワップ#スワップパーティション]]を見て、スワップパーティションを再作成・有効化してください。
  +
  +
=== Black screen with unblinking cursor when trying to suspend ===
  +
  +
If you get a black screen with unblinking cursor when trying to do
  +
$ sudo pm-suspend
  +
have a look at {{ic|/var/log/pm-suspend.log}} and search for "ehci" or "xhci". Some of the names you could find may be "ehci_hd", "xhci_hd" or "ehci_hcd".
  +
  +
Then as root create the file {{ic|/etc/pm/config.d/modules}} and include this code with the exact name of the ehci or xhci module you found. For example:
  +
SUSPEND_MODULES="ehci_hcd"
  +
Suspend should now be working.
  +
  +
=== Blank screen issue ===
  +
  +
Some users have reported having issues with their laptops not resuming after a suspend or hibernate. This is due to the {{ic|autodetect}} hook in "HOOKS" array of the {{ic|/etc/mkinitcpio.conf}} file. This can be disabled using the same method for adding the {{ic|resume}} hook. Just remove {{ic|autodetect}} from the list and follow the steps to build the new image. See [[#Mkinitcpio_Resume_Hook|Resume Hook]] for more details on building the new image.
  +
  +
{{Note|If you are using [[plymouth]] it may be an other reason to this issue. Adding {{ic|resume}} before {{ic|plymouth}} in "HOOKS" array of the {{ic|/etc/mkinitcpio.conf}} file should fix this.}}
  +
  +
=== Unable to resume with 64 bit OS ===
  +
  +
Certain motherboards/BIOS combinations (specifically known are some Zotac ITX boards, perhaps others) will not resume properly from suspend if any 64 bit operating system is installed. The solution is the enter your BIOS setup and Disable the "Memory Remapping Hole" in your DRAM configuration page. This will probably fix the suspend to RAM problem but will probably result in your OS not detecting all of your RAM.
  +
  +
=== Black screen when waking from hibernate with radeon driver ===
  +
  +
When using the radeon driver and having {{ic|radeon}} in the {{ic|HOOKS}} array of the {{ic|/etc/mkinitcpio.conf}} resuming from hibernation results in the screen being black, however everything else working (testable by keeping a console open with a command to execute and starting the execution after resuming).
  +
This seems to be related to using {{ic|radeon.dpm<nowiki>=</nowiki>1}} (default since kernel 3.13) as the power management method in radeon.
  +
  +
Removing {{ic|radeon}} from the HOOKS array (and rebuiling the initrd) fixes this problem.
  +
(See [https://bugs.freedesktop.org/show_bug.cgi?id=72716 here].)
  +
  +
=== Computer does not turn off when hibernating ===
  +
  +
It is possible that after Linux hibernates and has written the data to disk, the computer does not power off properly. If it is then forcefully powered off and later restarted, resuming will work fine.
  +
  +
This can easily be fixed by making an executable file named {{ic|/etc/pm/config.d/hibernate_mode}} which contains the single line: {{ic| HIBERNATE_MODE<nowiki>=</nowiki>"shutdown" }}.
  +
After that pm-hibernate should properly shut down the computer.
  +
  +
=== Display not powering on after suspension (radeon) ===
  +
  +
If you get a blank display after suspension with radeon gpu, try to create {{ic|/etc/pm/config.d/radeon}}, and add the following:
  +
  +
{{hc|/etc/pm/config.d/radeon|2=
  +
QUIRK_S3_BIOS="true"
  +
QUIRK_S3_MODE="true"
  +
}}
  +
  +
== 参照 ==
  +
  +
* [http://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
  +
* [http://www.mjmwired.net/kernel/Documentation/power/basic-pm-debugging.txt#178 PM Debugging] - Basic PM debugging
  +
*[[Cpufrequtils]] - CPU 周波数スケーリングと CPU 電源スキーム
  +
*[[Acpid]] - ACPI イベントを通知するデーモン
  +
* [http://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

2015年12月5日 (土) 22:28時点における版

関連記事

警告: Pm-utils でハイバネートをして systemd をアップデートするとファイルが破壊されるという報告が存在します: https://bbs.archlinux.org/viewtopic.php?pid=1423442

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

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

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

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

目次

インストール

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

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

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

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

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

pacman -Ql pm-utils | grep module.d

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

さらに、pm-utils には独自のビデオ互換データベースが付属しており、/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-utils スクリプトは 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"
再起動ではなく強制的にシャットダウンさせる

フックの無効化

If a hook is run which you do not like or which you think is not useful or even harmful, we would appreciate a bug report for that. You can however easily disable hooks by just creating an empty file corresponding to the hook in /etc/pm/sleep.d/. Say you want to disable the hook /usr/lib/pm-utils/sleep.d/45pcmcia, you can do this easily by calling

# touch /etc/pm/sleep.d/45pcmcia

Do not set the executable bit on that dummy-hook.

Note: Make sure you create the dummy files in the appropriate directory. For example if you are trying to disable hooks in /usr/lib/pm-utils/power.d, you will need to place the dummy file in /etc/pm/power.d.

別の方法

Create a file in /etc/pm/config.d with the modules you want to blacklist in the HOOK_BLACKLIST variable. For example, to manage power saving yourself, use:

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 のスリープフックを使って下さい。

If you want to do something specific to your setup during suspend or hibernate, then you can easily put your own hook into /etc/pm/sleep.d. The hooks in this directory will be called in alphabetic order during suspend (that is the reason their names all start with 2 digits, to make the ordering explicit) and in the reverse order during resume. The general convention to be followed on number ordering is:.

00 - 49
User and most package supplied hooks. If a hook assumes that all of the usual services and userspace infrastructure is still running, it should be here.
50 - 74
Service handling hooks. Hooks that start or stop a service belong in this range. At or before 50, hooks can assume that all services are still enabled.
75 - 89
Module and non-core hardware handling. If a hook needs to load/unload a module, or if it needs to place non-video hardware that would otherwise break suspend or hibernate into a safe state, it belongs in this range. At or before 75, hooks can assume all modules are still loaded.
90 - 99
Reserved for critical suspend hooks.

I am showing a pretty useless demonstration hook here, that will just put some informative lines into your log file:

#!/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

Put this into /etc/pm/sleep.d/66dummy, do a chmod +x /etc/pm/sleep.d/66dummy and it will spew some useless lines during suspend and resume.

警告: All the hooks run as root. This means that you need to be careful when creating temporary files, check that the PATH environment variable is set correctly, etc. to avoid security problems.

仕組み

The concept is quite easy: the main script (pm-action, called via symlinks as either pm-suspend, pm-hibernate or pm-suspend-hybrid) executes so-called "hooks", executable scripts, in the alphabetical sorted order with the parameter suspend (suspend to RAM) or hibernate (suspend to disk). Once all hooks are done, it puts the machine to sleep. After the machine has woken up again, all those hooks are executed in reverse order with the parameter resume (resume from RAM) or thaw (resume from disk). The hooks perform various tasks, such as preparing the bootloader, stopping the Bluetooth subsystem, or unloading of critical modules.

Both pm-suspend and pm-hibernate are usually called from Udev, initiated by desktop applets like gnome-power-manager or kpowersave.

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

There is also the possibility to set the machine into high-power and low-power mode, the command pm-powersave is used with an additional parameter of true or false. It works basically the same as the suspend framework.

The hooks for suspend are placed in

/usr/lib/pm-utils/sleep.d
distribution / package provided hooks
/etc/pm/sleep.d
hooks added by the system administrator

The hooks for the power state are placed in

/usr/lib/pm-utils/power.d
distribution / package provided hooks
/etc/pm/power.d
hooks added by the system administrator

Hooks in /etc/pm/ take precedence over those in /usr/lib/pm-utils/, so the system administrator can override the defaults provided by the distribution.

Pm-suspend internals

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.

Tips and tricks

Having the HD power management level automatically set again on resume

Do it like this:

/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

Then run:

# chmod +x /etc/pm/sleep.d/50-hdparm_pm

If the above Bash script fails the work, the following may work instead:

/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

Lower -B switch values may be effective. See hdparm.

マウスの再起動

On some laptops the mouse will hang after an otherwise successful suspend. One way to remedy this is to force a re-initialization of the PS/2 driver (here i8042) through a hook in /etc/pm/hooks (see hooks)

#!/bin/sh
echo -n "i8042" > /sys/bus/platform/drivers/i8042/unbind
echo -n "i8042" > /sys/bus/platform/drivers/i8042/bind

Add sleep modes to Openbox menu

Openbox users can add the new scripts as additional shutdown options within the Openbox menu by adding the items to a new or existing sub-menu in ~/.config/openbox/menu.xml, for example:

<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/* のスクリプトは使わないので注意してください。

Locking the screen saver on hibernate or suspend

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.

A simple example script is:

/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

Replace /usr/bin/slimlock with the path to your screen locking utility of choice.

If you do not wish to hard-code your username (e.g., if you have multiple users), then it is necessary to determine the current X11 username and display number. For systems using systemd, you can use xuserrun and the following sleep.d script (be sure to modify the path to xuserrun and your desired screen locker):

/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 に何らかの情報を見つけられる可能性があります。例えば、動作したフックやフックの出力などがログファイルで確認できます。

Also, check the output of the pm-is-supported command. This command (with the --hibernate or --suspend flag) will do some sanity checking and report any errors it finds in your configuration. It will not detect all possible errors, but may still be useful.

セグメンテーション違反

セグメンテーション違反が発生してシステムが反応しなくなったりする場合、で説明しているように /boot/grub/menu.lst の resume-path に UUID を設定してみてください。

サスペンドから復帰する代わりに再起動する

この問題はサスペンド時に NVS 領域を保存するようになってから起こるようになりました (2.6.35-rc4) (メーリングリストの投稿)。しかしながら、全てのマシンでこの機構が動作するとは限らないと知れ渡ってから、カーネルの開発者は acpi_sleep=nonvs カーネルコマンドラインオプションで無効化できるようにしています (カーネルパラメータを参照)。

Resume from suspend shuts down instead of wake up

On an Acer Aspire AS3810TG, resuming from suspend shuts down the computer instead of waking it up. If you experience a similar issue, try passing the parameter i8042.reset=1 to your kernel. In GRUB, the line in /boot/grub/grub.cfg should be something like this:

linux /vmlinuz-linux root=/dev/vg00/root resume=/dev/vg00/swap i8042.reset=1 ro

Although I have not tested this, you could also set this parameter live without having to restart by doing:

# sysctl -e -w i8042.reset=1

Blank screen when waking from suspend

Some laptops (e.g. Dell Inspiron Mini 1018) will just show a black screen with no backlight after resuming from suspend. If this happens to you, try going into the BIOS of the laptop and disabling Intel SpeedStep if it is present.

You could also try, without disabling SpeedStep, creating a quirk in /etc/pm/sleep.d/ with this content (requires vbetool):

#!/bin/sh
#
case "$1" in
    suspend)
    ;;
    resume)
        sleep 5
        vbetool dpms off
        vbetool dpms on
    ;;
    *) exit $NA
    ;;
esac

save it as you want but with a 00 in front of the name so this is called last when resuming; remember to chmod +x the script. Try adjusting the sleep time if the other commands are called too soon, or if it works well, you can also try removing that line.

Some other laptops (e.g. Toshiba Portégé R830) will just show a black screen with no backlight after resuming from suspend, with fans blowing at top speed. If this is what you're seeing, try going into the BIOS and disable the VT-d virtualization setting by switching to "VT-x only".

VirtualBox problems

The VirtualBox kernel modules cause pm-suspend and pm-hibernate to fail on some laptops. (See this discussion). Instead of suspending or hibernating, the system freezes and indicator LEDs blink (the suspend indicator in the case of ThinkPads and the Caps Lock and Scroll Lock indicators in the case of the MSI Wind U100). The pm-suspend and pm-hibernate logs appear normal.

The problem can be fixed by removing the modules before suspension or hibernation and reloading them afterwards. That can be accomplished through a script:

#!/bin/sh

rmmod vboxdrv
pm-hibernate
modprobe vboxdrv
ノート: Some users reported that it is sufficient to rebuild the kernel module by running vboxbuild as root.

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

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

Black screen with unblinking cursor when trying to suspend

If you get a black screen with unblinking cursor when trying to do

$ sudo pm-suspend

have a look at /var/log/pm-suspend.log and search for "ehci" or "xhci". Some of the names you could find may be "ehci_hd", "xhci_hd" or "ehci_hcd".

Then as root create the file /etc/pm/config.d/modules and include this code with the exact name of the ehci or xhci module you found. For example:

SUSPEND_MODULES="ehci_hcd"

Suspend should now be working.

Blank screen issue

Some users have reported having issues with their laptops not resuming after a suspend or hibernate. This is due to the autodetect hook in "HOOKS" array of the /etc/mkinitcpio.conf file. This can be disabled using the same method for adding the resume hook. Just remove autodetect from the list and follow the steps to build the new image. See Resume Hook for more details on building the new image.

ノート: If you are using plymouth it may be an other reason to this issue. Adding resume before plymouth in "HOOKS" array of the /etc/mkinitcpio.conf file should fix this.

Unable to resume with 64 bit OS

Certain motherboards/BIOS combinations (specifically known are some Zotac ITX boards, perhaps others) will not resume properly from suspend if any 64 bit operating system is installed. The solution is the enter your BIOS setup and Disable the "Memory Remapping Hole" in your DRAM configuration page. This will probably fix the suspend to RAM problem but will probably result in your OS not detecting all of your RAM.

Black screen when waking from hibernate with radeon driver

When using the radeon driver and having radeon in the HOOKS array of the /etc/mkinitcpio.conf resuming from hibernation results in the screen being black, however everything else working (testable by keeping a console open with a command to execute and starting the execution after resuming). This seems to be related to using radeon.dpm=1 (default since kernel 3.13) as the power management method in radeon.

Removing radeon from the HOOKS array (and rebuiling the initrd) fixes this problem. (See here.)

Computer does not turn off when hibernating

It is possible that after Linux hibernates and has written the data to disk, the computer does not power off properly. If it is then forcefully powered off and later restarted, resuming will work fine.

This can easily be fixed by making an executable file named /etc/pm/config.d/hibernate_mode which contains the single line: HIBERNATE_MODE="shutdown" . After that pm-hibernate should properly shut down the computer.

Display not powering on after suspension (radeon)

If you get a blank display after suspension with radeon gpu, try to create /etc/pm/config.d/radeon, and add the following:

/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