「Pm-utils」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
134行目: 134行目:
 
=== フックの無効化 ===
 
=== フックの無効化 ===
   
  +
不必要な、あるいは害を及ぼすフックが動作してしまう場合、それについてバグレポートを送って頂けると幸いです。{{ic|/etc/pm/sleep.d/}} にフックと呼応する空のファイルを作成することで簡単にフックを無効化できます。例えば {{ic|/usr/lib/pm-utils/sleep.d/45pcmcia}} フックを無効化したいときは、次を実行することで無効化できます:
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
 
# touch /etc/pm/sleep.d/45pcmcia
  +
ダミーのフックには実行可能権限は付与しないでください。
Do not set the executable bit on that dummy-hook.
 
   
 
{{Note|適当なディレクトリにダミーファイルを作成してください。例えば {{ic|/usr/lib/pm-utils/power.d}} のフックを無効化する場合、{{ic|/etc/pm/power.d}} にダミーファイルを作成する必要があります。}}
 
{{Note|適当なディレクトリにダミーファイルを作成してください。例えば {{ic|/usr/lib/pm-utils/power.d}} のフックを無効化する場合、{{ic|/etc/pm/power.d}} にダミーファイルを作成する必要があります。}}
149行目: 148行目:
   
 
{{Note|systemd を使っている場合、sleep.d のフックはおそらく動作しません。そのようなときは systemd の[[電源管理#スリープフック|スリープフック]]を使って下さい。}}
 
{{Note|systemd を使っている場合、sleep.d のフックはおそらく動作しません。そのようなときは systemd の[[電源管理#スリープフック|スリープフック]]を使って下さい。}}
  +
サスペンドやハイバネートのときに何か特別なことをしたい場合、簡単にフックを自分で作成して {{ic|/etc/pm/sleep.d}} に配置することができます。このディレクトリに含まれているフックはサスペンド時にアルファベット順で実行されます (そのため名前の先頭には2桁の数字を付けて、順番が明確になるようにしています)。復帰時は逆の順番で実行されます。数字については以下のように決められています:
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: ユーザーやパッケージが作成したフック。通常のサービスやユーザー空間のインフラストラクチャが動作しているときに実行するべきフック。
;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: サービスを管理するフック。この範囲のフックはサービスを起動したり停止します。50 以下のフックはサービスが有効になっている状態に実行されると考えてかまいません。
;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: コア以外のハードウェアあるいはモジュールを管理するフック。モジュールをロード・アンロードしたり、安全な状態にサスペンドしたりハイバネートするのを破壊するようなビデオ以外のハードウェアを扱うフックはこの範囲に収まります。75 以下では、全てのモジュールがロードされることになります。
;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: 重要なサスペンドのフック用に予約されています。
;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
 
#!/bin/bash
175行目: 174行目:
 
esac
 
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.
+
上記のファイルを {{ic|/etc/pm/sleep.d/66dummy}} として保存して {{ic|chmod +x /etc/pm/sleep.d/66dummy}} を実行してください。サスペンドや復帰時にメッセージが出力されます。
   
  +
{{Warning|全てのフックは root で実行されます。したがって、一時ファイルを作成する場合は注意してください。セキュリティに問題が起きないように {{ic|PATH}} 環境変数が正しく設定されていることなどを確認します。}}
{{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.}}
 
   
 
== 仕組み ==
 
== 仕組み ==
   
  +
仕組みはとても簡単です: メインスクリプト ({{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 サブシステムの停止、重要なモジュールのアンロードなどです。
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}}.
+
{{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.}}
 
{{Note|{{ic|suspend-hybrid}} is a placeholder right now -- it is not completely implemented.}}
   
  +
マシンを高出力モードあるいは低出力モードに設定することもできます。{{ic|true}} や {{ic|false}} のパラメータを追加して {{ic|pm-powersave}} コマンドを使います。基本的なところはサスペンドフレームワークと同じです。
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|/usr/lib/pm-utils/sleep.d}}: ディストリビューションやパッケージによって配置されたフック
;{{ic|/etc/pm/sleep.d}}: hooks added by the system administrator
+
;{{ic|/etc/pm/sleep.d}}: システム管理者によって追加されたフック
   
  +
電源状態を変更するときのフックは以下のディレクトリに配置されています:
The hooks for the power state are placed in
 
;{{ic|/usr/lib/pm-utils/power.d}}: distribution / package provided hooks
+
;{{ic|/usr/lib/pm-utils/power.d}}: ディストリビューションやパッケージによって配置されたフック
;{{ic|/etc/pm/power.d}}: hooks added by the system administrator
+
;{{ic|/etc/pm/power.d}}: システム管理者によって追加されたフック
   
  +
{{ic|/etc/pm/}} のフックは {{ic|/usr/lib/pm-utils/}} のフックよりも優先されるため、システム管理者はディストリビューションによって決められたデフォルト設定を上書きすることができます。
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 の内部 ===
 
=== Pm-suspend の内部 ===
286行目: 283行目:
 
=== 復帰時にハードディスクの電源管理レベルを自動的に設定 ===
 
=== 復帰時にハードディスクの電源管理レベルを自動的に設定 ===
   
  +
以下のようにフックを作成:
Do it like this:
 
 
{{hc|/etc/pm/sleep.d/50-hdparm_pm|<nowiki>
 
{{hc|/etc/pm/sleep.d/50-hdparm_pm|<nowiki>
 
#!/bin/dash
 
#!/bin/dash
295行目: 292行目:
 
</nowiki>}}
 
</nowiki>}}
   
  +
そして次を実行:
Then run:
 
 
# chmod +x /etc/pm/sleep.d/50-hdparm_pm
 
# chmod +x /etc/pm/sleep.d/50-hdparm_pm
   
  +
上記の [[Bash]] スクリプトが動作しない場合、以下のスクリプトで動作する可能性があります:
If the above [[Bash]] script fails the work, the following may work instead:
 
 
{{hc|/etc/pm/sleep.d/50-hdparm_pm|<nowiki>
 
{{hc|/etc/pm/sleep.d/50-hdparm_pm|<nowiki>
 
#!/bin/sh
 
#!/bin/sh
314行目: 311行目:
 
</nowiki>}}
 
</nowiki>}}
   
  +
{{ic|-B}} スイッチの値を低くすると効果があるかもしれません。[[hdparm]] を見て下さい。
Lower {{ic|-B}} switch values may be effective. See [[hdparm]].
 
   
 
=== マウスの再起動 ===
 
=== マウスの再起動 ===
   
  +
ノートパソコンによっては、サスペンドがされた後にマウスが動かなくなることがあります。{{ic|/etc/pm/hooks}} にフックを作成して PS/2 ドライバー (例: {{ic|i8042}}) を強制的に再初期化することで解決します ([[#フックの作成|フックの作成]]を参照):
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
 
#!/bin/sh
475行目: 472行目:
 
=== VirtualBox の問題 ===
 
=== VirtualBox の問題 ===
   
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.
+
ノートパソコンによっては 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}} のログは通常通りに出力されます。
   
  +
サスペンドやハイバネートをする前にモジュールをアンロードして、復帰後にモジュールをリロードするようにすることで問題を解決できます。スクリプトを使うことでモジュールを管理できます:
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=
 
{{bc|1=
 
#!/bin/sh
 
#!/bin/sh
486行目: 483行目:
 
}}
 
}}
   
  +
{{Note|root で {{ic|vboxbuild}} を実行してカーネルモジュールをリビルドすることで問題が解決するという報告もあります。}}
{{Note|Some users reported that it is sufficient to rebuild the kernel module by running {{ic|vboxbuild}} as root.}}
 
   
 
=== スワップパーティションが存在しないのにハイバネート ===
 
=== スワップパーティションが存在しないのにハイバネート ===

2015年12月6日 (日) 18:01時点における版

関連記事

警告: 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"
再起動ではなく強制的にシャットダウンさせる

フックの無効化

不必要な、あるいは害を及ぼすフックが動作してしまう場合、それについてバグレポートを送って頂けると幸いです。/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.

Tips and tricks

復帰時にハードディスクの電源管理レベルを自動的に設定

以下のようにフックを作成:

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

ハイバネートやサスペンド時にスクリーンセーバーをロック

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 カーネルコマンドラインオプションで無効化できるようにしています (カーネルパラメータを参照)。

サスペンドから復帰するとシャットダウンしてしまう

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

サスペンドから復帰したときに画面が表示されない

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 の問題

ノートパソコンによっては 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" のパーティションがあれば大丈夫です。パーティションが存在しない場合、スワップ#スワップパーティションを見て、スワップパーティションを再作成・有効化してください。

サスペンドしようとしたときにカーソルしか表示されない黒画面になる

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.

画面が表示されない問題

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.

64ビットの 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.

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

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.

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