「電源管理」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(2人の利用者による、間の18版が非表示)
1行目: 1行目:
 
[[Category:電源管理]]
 
[[Category:電源管理]]
[[en:Power Management]]
+
[[en:Power management]]
[[es:Power Management]]
+
[[es:Power management]]
[[zh-CN:Power Management]]
+
[[it:Shutdown Pressing Power Button]]
  +
[[zh-hans:Power management]]
 
{{Related articles start}}
 
{{Related articles start}}
{{Related|省電力設定}}
 
{{Related|Display Power Management Signaling}}
 
 
{{Related|サスペンドとハイバネート}}
 
{{Related|サスペンドとハイバネート}}
  +
{{Related|Display Power Management Signaling}}
  +
{{Related|CPU 周波数スケーリング}}
  +
{{Related|ハイブリッドグラフィック}}
  +
{{Related|カーネルモジュール}}
  +
{{Related|sysctl}}
  +
{{Related|udev}}
 
{{Related articles end}}
 
{{Related articles end}}
   
このページでは Arch Linux における電源管理の全体的な外観を説明します。Arch Linux はシステムマネージャとして [[systemd]] を使っているため、この記事では systemd に焦点をあてています。
+
電源管理とはシステムが使われていない場合に電力の供給を切ったり低電力状態にする機能のことです。このページでは Arch Linux における電源管理の全体的な外観を説明します。
   
電源管理の設定を変更するのに使える設定箇所は複数存在します:
+
ハードウェアの電源管理の設定を直接変更するときはカーネルの設定を使います:
 
* [[カーネルパラメータ]]
 
* [[カーネルパラメータ]]
 
* [[カーネルモジュール]]
 
* [[カーネルモジュール]]
 
* [[udev]] ルール
 
* [[udev]] ルール
   
また、電源管理ツールが多数あります:
+
また、カーネルと対話してイベントを処理する電源管理ツールが多数あります: [[#ユーザースペースツール]] を参照。
* [[systemd]]
 
* [[en2:pm-utils|pm-utils]]
 
* [[Laptop Mode Tools]]
 
* [[TLP]]
 
* [[acpid]]
 
   
 
{{Note|ひとつの設定箇所・ツールで設定した電力設定が他の設定箇所・ツールで上書きされる可能性もあるので注意してください。}}
 
{{Note|ひとつの設定箇所・ツールで設定した電力設定が他の設定箇所・ツールで上書きされる可能性もあるので注意してください。}}
  +
  +
== ユーザースペースツール ==
  +
  +
以下のツールを使うことで手動で多数の設定を行うかわりになります。どのツールも多かれ少なかれ同じような動作をするので、衝突をさけるためにツールはどれか一つだけを実行してください。[[:Category:電源管理|電源管理カテゴリ]]を見ることで Arch Linux にどんな電源管理の選択肢が存在するかわかります。
  +
  +
以下は省電力設定をするために作られた人気のあるスクリプトやツールです:
  +
  +
* {{App|[[acpid]]|ACPI の電源管理イベントを届けるデーモン。netlink をサポート。|https://sourceforge.net/projects/acpid2/|{{Pkg|acpid}}}}
  +
* {{App|[[Laptop Mode Tools]]|ノートパソコンの省電力設定をするユーティリティ。多少設定が要りますが省電力設定ユーティリティのデファクトスタンダードとされています。|https://github.com/rickysarraf/laptop-mode-tools|{{AUR|laptop-mode-tools}}}}
  +
* {{App|[[powertop]]|消費電力や電源管理の問題を診断して省電力設定を補助するツール。|https://01.org/powertop/|{{Pkg|powertop}}}}
  +
* [[systemd]]
  +
* {{App|[[TLP]]|Linux 向けの先進的な電源管理。|http://linrunner.de/tlp|{{Pkg|tlp}}}}
   
 
== systemd による電源管理 ==
 
== systemd による電源管理 ==
29行目: 41行目:
 
=== ACPI イベント ===
 
=== ACPI イベント ===
   
systemd は電源関連の [[Wikipedia:Advanced_Configuration_and_Power_Interface|ACPI]] イベントを扱えます。{{ic|/etc/systemd/logind.conf}} のオプションを使って設定できます:
+
systemd は電源関連の [[Wikipedia:Advanced_Configuration_and_Power_Interface|ACPI]] イベントを扱えます。{{ic|/etc/systemd/logind.conf}} や {{ic|/etc/systemd/logind.conf.d/*.conf}} のオプションを使って設定できます:
   
 
* {{ic|HandlePowerKey}}: パワーキーが押された時に行う動作を定めます。
 
* {{ic|HandlePowerKey}}: パワーキーが押された時に行う動作を定めます。
49行目: 61行目:
 
{{Warning|1=[[systemd]] バージョン 211 と 212 では、{{ic|HandleLidSwitch}} オプションは [[NVIDIA]] バイナリドライバーがインストールされている環境では使用できません。この問題はバージョン 213 で修正されています。[https://bugs.freedesktop.org/show_bug.cgi?id=76267 systemd のバグトラッカー]や [https://bbs.archlinux.org/viewtopic.php?pid=1410252#p1410252 BBS のトピック]を参照してください。}}
 
{{Warning|1=[[systemd]] バージョン 211 と 212 では、{{ic|HandleLidSwitch}} オプションは [[NVIDIA]] バイナリドライバーがインストールされている環境では使用できません。この問題はバージョン 213 で修正されています。[https://bugs.freedesktop.org/show_bug.cgi?id=76267 systemd のバグトラッカー]や [https://bbs.archlinux.org/viewtopic.php?pid=1410252#p1410252 BBS のトピック]を参照してください。}}
   
  +
==== 電源マネージャ ====
現在のバージョンの systemd では、{{ic|Handle*}} オプションは(デスクトップ環境のパワーマネージャなどの)プログラムによって "inhibited" (一時的にオフ) にされない限りシステム全体に適用されます。停止されなければ、systemd がシステムをサスペンドした状態で終わることができ、立ち上がった時に他のパワーマネージャによってもう一度停止されます。
 
   
  +
[[デスクトップ環境]]には電源マネージャが含まれていることがあります。現在のバージョンの systemd では、{{ic|Handle*}} オプションは電源マネージャによって "inhibited" (一時的にオフ) にされない限りシステム全体に適用されます。停止されなければ、systemd がシステムをサスペンドした状態で終わることができ、立ち上がった時に他の電源マネージャによってもう一度停止されます。
{{Warning|現在、最新の [[KDE|KDE]] と [[GNOME|GNOME]] の電源マネージャは "inhibited" コマンドを実行します。[[Xfce]] や、[[acpid]] など他のプログラムで ACPI イベントを管理したい場合は、{{ic|Handle}} オプションを {{ic|ignore}} に設定する必要があります。}}
 
  +
  +
最新の [[KDE]], [[GNOME]], [[Xfce]] の電源マネージャは "inhibited" コマンドを実行します。[[acpid]] など他のプログラムで ACPI イベントを管理したい場合は、{{ic|Handle}} オプションを {{ic|ignore}} に設定する必要があります。詳しくは {{man|1|systemd-inhibit}} を参照。
  +
  +
==== xss-lock ====
  +
  +
{{pkg|xss-lock}} は systemd の {{ic|suspend}}, {{ic|hibernate}}, {{ic|lock-session}}, {{ic|unlock-session}} イベントで適切なアクションを実行します (ロッカーの起動など)。''xss-lock'' は [[DPMS]] イベントにも反応します。
  +
  +
xss-lock を[[自動起動]]するときは以下のようなコマンドを使います:
  +
  +
xss-lock -- i3lock -n -i ''background_image.png'' &
  +
  +
xss-lock によってサスペンド時に CPU 消費率が 100% になる場合、[https://bitbucket.org/raymonad/xss-lock/commits/1e158fb20108058dbd62bd51d8e8c003c0a48717 commit 1e158f] にあるように {{AUR|xss-lock-git}} を使うことで問題が解決します。
   
 
=== サスペンドとハイバネート ===
 
=== サスペンドとハイバネート ===
57行目: 81行目:
 
''systemd'' はカーネルに入っているサスペンド・レジューム機能を使ってサスペンド (suspend to RAM)・ハイバネート・ハイブリッドサスペンドを行うコマンドを提供しています。また、サスペンドの前後の行動をカスタマイズするフックを追加する仕組みも存在します。
 
''systemd'' はカーネルに入っているサスペンド・レジューム機能を使ってサスペンド (suspend to RAM)・ハイバネート・ハイブリッドサスペンドを行うコマンドを提供しています。また、サスペンドの前後の行動をカスタマイズするフックを追加する仕組みも存在します。
   
{{Note|''systemd'' はデフォルトの''カーネル''バックエンドに加えて、他のサスペンドバックエンド ([[en2:Uswsusp|Uswsusp]] や [[en2:TuxOnIce|TuxOnIce]]) を使ってコンピュータをサスペンドしたりハイバネートすることもできます。例えば [[en2:Uswsusp#With systemd|Uswsusp#With systemd]] を見て下さい。}}
+
{{Note|''systemd'' はデフォルトの''カーネル''バックエンドに加えて、他のサスペンドバックエンド ([[Uswsusp]]) を使ってコンピュータをサスペンドしたりハイバネートすることもできます。例えば [[Uswsusp#systemd を使う]] を見て下さい。}}
   
 
{{ic|systemctl suspend}} は何も設定しなくても動きますが、あなたの環境で {{ic|systemctl hibernate}} を使うには[[サスペンドとハイバネート#ハイバネーション]]の指示に従う必要があります。
 
{{ic|systemctl suspend}} は何も設定しなくても動きますが、あなたの環境で {{ic|systemctl hibernate}} を使うには[[サスペンドとハイバネート#ハイバネーション]]の指示に従う必要があります。
   
=== スリープフック ===
+
==== ハイブリッドスリープ ====
   
  +
{{ic|systemctl hybrid-sleep}} はハイバネートとサスペンドを同時に行います。サスペンドとハイバネートのメリット・デメリットを組み合わせたものになります。突然コンピュータの電源が喪失 (コンセントが抜けたりバッテリーが切れる) しても、ハイバネートから復帰するため便利です。電源喪失がない場合、サスペンドから復帰するため、ハイバネートから復帰するよりも高速に復帰します。ただし、"hybrid-sleep" はハイバネートを機能させるためにメモリをスワップする必要があるので、普通の {{ic|systemctl suspend}} よりもスリープするのにかかる時間が長くなります。ハイブリッドスリープの別の方法として[[#遅延ハイバネーション|遅延ハイバネーション]]があります。
{{ic|systemctl suspend}}, {{ic|systemctl hibernate}}, {{ic|systemctl hybrid-sleep}} が実行された時、Systemd はマシンをスリープ状態にするのに [[en2:pm-utils|pm-utils]] を使いません; [[en2:Pm-utils#Creating_your_own_hooks|カスタムフック]]を含む、[[en2:pm-utils|pm-utils]] フックは実行されません。ただし、こうしたイベントでカスタムスクリプトを動かすための仕組みを systemd は2つ提供しています。
 
  +
  +
==== サスペンドやハイバネーションの代わりに常にハイブリッドスリープを使う ====
  +
  +
サスペンドやハイバネートが要求されたときでもハイブリッドスリープを行うように systemd を設定することができます。
  +
  +
デフォルトのサスペンドとハイバネートのアクションは {{ic|/etc/systemd/sleep.conf}} ファイルで設定します。両方ともハイブリッドスリープを実行するように設定するには:
  +
  +
{{hc|/etc/systemd/sleep.conf|2=
  +
[Sleep]
  +
# suspend=hybrid-sleep
  +
SuspendMode=suspend
  +
SuspendState=disk
  +
# hibernate=hybrid-sleep
  +
HibernateMode=suspend
  +
HibernateState=disk
  +
}}
  +
  +
詳しくは {{man|5|sleep.conf.d}} のマニュアルページを読んでください。
  +
  +
=== スリープフック ===
   
 
===== サスペンド/リジューム サービスファイル =====
 
===== サスペンド/リジューム サービスファイル =====
80行目: 124行目:
 
ExecStartPre= -/usr/bin/pkill -u %u unison ; /usr/local/bin/music.sh stop ; /usr/bin/mysql -e 'slave stop'
 
ExecStartPre= -/usr/bin/pkill -u %u unison ; /usr/local/bin/music.sh stop ; /usr/bin/mysql -e 'slave stop'
 
ExecStart=/usr/bin/sflock
 
ExecStart=/usr/bin/sflock
  +
ExecStartPost=/usr/bin/sleep 1
   
 
[Install]
 
[Install]
97行目: 142行目:
 
[Install]
 
[Install]
 
WantedBy=suspend.target</nowiki>}}
 
WantedBy=suspend.target</nowiki>}}
  +
  +
{{Note|
  +
* [[アプリケーション一覧/セキュリティ#スクリーンロック|slock]] を使用する場合、スリープする前にサービスを起動してはいけません。デフォルトの simple サービスタイプを使って下さい。でないと、先に ''slock'' が起動して、ロックを解除しないとスリープに入らないようになってしまいます。forking タイプを指定しても解決しません。
  +
* スクリーンがロックされる前にスクリーンロックが返ってきてしまい、サスペンドから復帰するときに画面が点滅することがあります。{{ic|1=ExecStartPost=/usr/bin/sleep 1}} で遅延を追加することで解決します。}}
   
 
root アクションでは ({{ic|# systemctl enable root-suspend}} で有効にしてください):
 
root アクションでは ({{ic|# systemctl enable root-suspend}} で有効にしてください):
124行目: 173行目:
 
WantedBy=sleep.target</nowiki>}}
 
WantedBy=sleep.target</nowiki>}}
   
サービスファイルについてのヒント (詳しくは {{ic|man systemd.service}}):
+
サービスファイルについてのヒント (詳しくは {{man|5|systemd.service}}):
 
* {{ic|1=<nowiki>Type=oneshot</nowiki>}} の場合、複数の {{ic|1=<nowiki>ExecStart=</nowiki>}} 行を使うことができます。それ以外の場合は使える ExecStart は一行だけです。{{ic|ExecStartPre}} を使ったりコマンドをセミコロンで分割することでコマンドを追加することができます(最初の例を見て下さい -- セミコロンの前後にはスペースが必要です)。
 
* {{ic|1=<nowiki>Type=oneshot</nowiki>}} の場合、複数の {{ic|1=<nowiki>ExecStart=</nowiki>}} 行を使うことができます。それ以外の場合は使える ExecStart は一行だけです。{{ic|ExecStartPre}} を使ったりコマンドをセミコロンで分割することでコマンドを追加することができます(最初の例を見て下さい -- セミコロンの前後にはスペースが必要です)。
 
* コマンドの前に '-' を付けるとエラーが起こっても(終了ステータスが0以外でも)無視され、コマンドは成功したとして扱われます。
 
* コマンドの前に '-' を付けるとエラーが起こっても(終了ステータスが0以外でも)無視され、コマンドは成功したとして扱われます。
154行目: 203行目:
 
* sleep.target は suspend.target, hibernate.target, hybrid-sleep.target から呼ばれ sleep.target 自身は StopWhenUnneeded サービスなので、タスクごとにフックが正しく起動・停止することが保証されています。
 
* sleep.target は suspend.target, hibernate.target, hybrid-sleep.target から呼ばれ sleep.target 自身は StopWhenUnneeded サービスなので、タスクごとにフックが正しく起動・停止することが保証されています。
   
  +
==== 遅延ハイバネーション ====
===== /usr/lib/systemd/system-sleep のフック =====
 
   
  +
遅延ハイバネーションではスリープフックを利用して通常通りにサスペンドしますが、その後にハイバネーションを実行するタイマーをセットします。ハイバネーションを最初に実行しないためスリープに入るのが {{ic|systemctl hybrid-sleep}} よりも早くなります。ただし、"hybrid-sleep" とは違って、サスペンド中にハイバネーションを使うことで電源喪失から保護するようなことはできません。そのため遅延ハイバネーションはデスクトップなどよりもノートパソコンで使うほうが適しています。ハイバネーションが遅延されるため、サスペンド中はノートパソコンのバッテリーだけが使われ、それからハイバネーションが実行されます。バッテリーがなくなるまでサスペンドし続ける "hybrid-sleep" よりも消費電力を抑えることが可能です。ノートパソコンにハードディスクが搭載されている場合、ハイバネートするためにサスペンドから復帰したとき、ノートパソコンを数秒間は動かさないほうがよいでしょう。遅延ハイバネーションは消費電力だけでなくセキュリティに関しても利点があります (例: 完全なディスク暗号化を使っている場合)。サンプルスクリプトは [https://superuser.com/questions/298672/linuxhow-to-hibernate-after-a-period-of-sleep こちら] にあります。systemd のスリープフックについては [https://bbs.archlinux.org/viewtopic.php?pid=1420279#p1420279 こちらの投稿] も参照してください。
Systemd は {{ic|/usr/lib/systemd/system-sleep/}} 内の全ての実行可能ファイルを実行するときに、2つの引数を渡します:
 
  +
  +
{{hc|/etc/systemd/system/suspend-to-hibernate.service|<nowiki>
  +
[Unit]
  +
Description=Delayed hibernation trigger
  +
Documentation=https://bbs.archlinux.org/viewtopic.php?pid=1420279#p1420279
  +
Documentation=https://wiki.archlinux.org/index.php/Power_management
  +
Conflicts=hibernate.target hybrid-sleep.target
  +
Before=sleep.target
  +
StopWhenUnneeded=true
  +
  +
[Service]
  +
Type=oneshot
  +
RemainAfterExit=yes
  +
Environment="WAKEALARM=/sys/class/rtc/rtc0/wakealarm"
  +
Environment="SLEEPLENGTH=+2hour"
  +
ExecStart=-/usr/bin/sh -c 'echo -n "alarm set for "; date +%%s -d$SLEEPLENGTH | tee $WAKEALARM'
  +
ExecStop=-/usr/bin/sh -c '\
  +
alarm=$(cat $WAKEALARM); \
  +
now=$(date +%%s); \
  +
if [ -z "$alarm" ] || [ "$now" -ge "$alarm" ]; then \
  +
echo "hibernate triggered"; \
  +
systemctl hibernate; \
  +
else \
  +
echo "normal wakeup"; \
  +
fi; \
  +
echo 0 > $WAKEALARM; \
  +
'
  +
  +
[Install]
  +
WantedBy=sleep.target
  +
</nowiki>
  +
}}
  +
  +
{{ic|Before}} と {{ic|Conflicts}} オプションはハイバネートでは動作させないようにするために必要です。そうしないと遅延ハイバネーションが実行されたときにサービスが2回実行されてしまいます。{{ic|WantedBy}} と {{ic|StopWhenUnneeded}} オプションはスリープの前に実行して復帰時に停止するように設定しています。サービスを[[有効化]]してください。
  +
  +
==== /usr/lib/systemd/system-sleep のフック ====
  +
  +
Systemd は {{ic|/usr/lib/systemd/system-sleep/}} 内の全ての実行可能ファイルを実行するときに、2つの引数を渡します:
   
 
* 引数 1: {{ic|pre}} か {{ic|post}}。マシンが停止するときと起動するとき。
 
* 引数 1: {{ic|pre}} か {{ic|post}}。マシンが停止するときと起動するとき。
 
* 引数 2: {{ic|suspend}} か {{ic|hibernate}} か {{ic|hybrid-sleep}}。呼び出されるものによる。
 
* 引数 2: {{ic|suspend}} か {{ic|hibernate}} か {{ic|hybrid-sleep}}。呼び出されるものによる。
   
[[pm-utils]] とは対照的に、systemd はスクリプトを(つずつではなく)同時に実行します。
+
systemd はスクリプトを(ひとつずつではなく)同時に実行します。
   
 
カスタムスクリプトの出力は {{ic|systemd-suspend.service}}, {{ic|systemd-hibernate.service}}, {{ic|systemd-hybrid-sleep.service}} によって記録されます。出力を見るには systemd の [[Systemd#Journal|journal]] を使って下さい:
 
カスタムスクリプトの出力は {{ic|systemd-suspend.service}}, {{ic|systemd-hibernate.service}}, {{ic|systemd-hybrid-sleep.service}} によって記録されます。出力を見るには systemd の [[Systemd#Journal|journal]] を使って下さい:
184行目: 271行目:
 
# chmod a+x /usr/lib/systemd/system-sleep/example.sh
 
# chmod a+x /usr/lib/systemd/system-sleep/example.sh
   
詳しくは {{ic|man 7 systemd.special}} や {{ic|man 8 systemd-sleep}} を見てさい。
+
詳しくは {{man|7|systemd.special}} や {{man|8|systemd-sleep}} を見てください。
  +
  +
== 省電力設定 ==
  +
  +
{{Note|[[ノートパソコン#電源管理]]ではノートパソコンでの電源管理(特にバッテリー状態の監視)を説明しています。}}
  +
  +
このセクションでは省電力機能を使用するのに必要な設定を扱います。コンピュータが AC 電源またはバッテリーで動作しているかに関わらず、ここに記載されているほとんど全ての機能には使用する価値があります。パフォーマンスへの影響は軽微ですが、大抵壊れているハードウェアやドライバーのためにデフォルトでは有効になっていません。電力の使用量を減らすことは熱を減らすことでもあり、[[Wikipedia:ja:インテル ターボ・ブースト・テクノロジー|動的なオーバークロック]]によって、最近の Intel や AMD の CPU ではパフォーマンスの向上につながることもあります。
  +
  +
udev ルールなどを使ってスクリプトや省電力設定を自分で作成したい場合は以下の設定を参考にすることができます。
  +
  +
{{Note|以下で記述しているルールのほとんどは [[TLP]] などのツールで管理することもでき、ツールを使いながら自分でも管理するのは不得策です。}}
  +
  +
=== オーディオ ===
  +
  +
デフォルトでは、オーディオの省電力機能はほとんどのドライバーで無効になっています。{{ic|power_save}} パラメータを設定することで有効にすることができます。アイドルモードに移行するまでの時間を秒数で指定します。1秒後にサウンドカードをアイドル状態にするには、Intel の場合、以下を作成:
  +
  +
{{hc|/etc/modprobe.d/audio_powersave.conf|2=options snd_hda_intel power_save=1}}
  +
  +
ac97 の場合は以下を使って下さい:
  +
  +
options snd_ac97_codec power_save=1
  +
  +
{{Note|
  +
* サウンドカードの製造者や使われているカーネルドライバーの情報を取得するには、{{ic|lspci -k}} を実行してください。
  +
* サウンドカードの電源状態を変更すると壊れたハードウェアでポップノイズがまじったり著しい遅延が発生することがあります。
  +
}}
  +
  +
HDMI の音声出力を無効化することで消費電力を下げることもできます。適切なカーネルモジュールを[[ブラックリスト]]に追加してください (例: {{ic|snd_hda_codec_hdmi}})。
  +
  +
=== バックライト ===
  +
  +
[[バックライト]]を見て下さい。
  +
  +
=== Bluetooth ===
  +
  +
[[Bluetooth]] を完全に無効化するには、{{ic|btusb}} と {{ic|bluetooth}} モジュールを[[カーネルモジュール#ブラックリスト|ブラックリスト]]に入れてください。
  +
  +
一時的にだけ bluetooth をオフにするには、''rfkill'' を使用します:
  +
  +
# rfkill block bluetooth
  +
  +
もしくは udev ルールを使って:
  +
  +
{{hc|/etc/udev/rules.d/50-bluetooth.rules|<nowiki>
  +
# disable bluetooth
  +
SUBSYSTEM=="rfkill", ATTR{type}=="bluetooth", ATTR{state}="0"
  +
</nowiki>}}
  +
  +
=== ウェブカメラ ===
  +
  +
内蔵のウェブカメラを使わない場合、{{ic|uvcvideo}} モジュールを[[カーネルモジュール#ブラックリスト|ブラックリスト]]に入れてください。
  +
  +
=== カーネルパラメータ ===
  +
  +
このセクションでは {{ic|/etc/sysctl.d/}} の設定を使います。このディレクトリはカーネルの sysctl パラメータと対応するディレクトリです。詳しくは [http://0pointer.de/blog/projects/the-new-configuration-files The New Configuration Files] や、より正確な {{man|5|sysctl.d}} を見てください。
  +
  +
==== NMI watchdog の無効化 ====
  +
  +
[[Wikipedia:Non-maskable interrupt|NMI]] watchdog はカーネルパニックを引き起こすハードウェアのハングアップをキャッチするデバッグ機能です。システムによっては大量の割り込みが発生するため、消費電力の増加につながっていることがあります:
  +
  +
{{hc|/etc/sysctl.d/disable_watchdog.conf|2=kernel.nmi_watchdog = 0}}
  +
  +
もしくは起動の初期で完全に無効化するには[[カーネルパラメータ|カーネル行]]に {{ic|1=nmi_watchdog=0}} を追加してください。
  +
  +
==== ライトバック時間 ====
  +
  +
仮想メモリのダーティなライトバック時間を増やすことでディスク I/O がまとめられて、断続的なディスクの書き込みが減って、消費電力が抑えられます。この値を60秒に設定するには (デフォルトは5秒です):
  +
  +
{{hc|/etc/sysctl.d/dirty.conf|2=vm.dirty_writeback_centisecs = 6000}}
  +
  +
ジャーナルをサポートしているファイルシステム (ext4 や btrfs など) でジャーナルコミットでも同じことをするには、[[fstab]] でオプションとして {{ic|1=commit=60}} を使用します。
  +
  +
I/O パフォーマンスや省電力に影響する他のパラメータは [[sysctl#仮想メモリ]] を参照。
  +
  +
==== Laptop Mode ====
  +
  +
ラップトップモードの'ノブ'については[https://www.kernel.org/doc/Documentation/laptops/laptop-mode.txt カーネルドキュメント]を見て下さい。''"このノブの適切な値は5秒です。"''
  +
  +
{{hc|/etc/sysctl.d/laptop.conf|2=vm.laptop_mode = 5}}
  +
  +
=== ネットワークインターフェイス ===
  +
  +
[[Wake-on-LAN]] は便利な機能ですが、利用しない場合はサスペンド中にマジックパケットが来るのを待つのに無駄な電力を消耗するだけです。全ての Ethernet インターフェイスで Wake-on-LAN を無効化:
  +
  +
{{hc|/etc/udev/rules.d/70-disable_wol.rules|2=ACTION=="add", SUBSYSTEM=="net", KERNEL=="eth*", RUN+="/usr/bin/ethtool -s %k wol d"}}
  +
  +
全ての無線インターフェイスで省電力機能を有効にするには:
  +
  +
{{hc|/etc/udev/rules.d/70-wifi-powersave.rules|2=ACTION=="add", SUBSYSTEM=="net", KERNEL=="wlan*", RUN+="/usr/bin/iw dev %k set power_save on"}}
  +
  +
上記の例では、{{ic|%k}} がマッチするデバイスのカーネル名を示します。例えば、ルールが {{ic|wlan0}} に適用可能とわかった場合、{{ic|%k}} は {{ic|wlan0}} に置き換えられます。特定のインターフェイスにだけルールを適用するには、パターン {{ic|eth*}} と修飾子 {{ic|%k}} を適当なインターフェイスの名前に置き換えて下さい。詳しくは、[http://www.reactivated.net/writing_udev_rules.html Writing udev rules] を参照。
  +
  +
{{Note|ここで、設定ファイルの名前は重要です。systemd v197 から {{ic|80-net-setup-link.rules}} によって[[ネットワーク設定#デバイス名|永続的なデバイス名]]が導入されたため、デバイスに {{ic|enp2s0}} というような名前で呼ばれるようになる前に適用されるように、ネットワークの powersave ファイルは辞書順で {{ic|80-net-setup-link.rules}} よりも前に来る名前を付けなくてはなりません。}}
  +
  +
==== Intel ワイヤレスカード (iwlwifi) ====
  +
  +
Intel 製ワイヤレスカードの省電力機能は {{ic|iwlwifi}} ドライバーに適切なパラメータを渡すことで有効にできます。{{ic|/etc/modprobe.d/iwlwifi.conf}} ファイルに以下の行を追加することで永続的に有効にできます:
  +
  +
options iwlwifi power_save=1 d0i3_disable=0 uapsd_disable=0
  +
options iwldvm force_cam=0
  +
  +
上記の省電力オプションは実験的であり、システムが不安定になる可能性があります。
  +
  +
=== バスパワーの管理 ===
  +
  +
==== Active State Power Management ====
  +
  +
コンピュータが [[Wikipedia:Active State Power Management|ASPM]] をサポートしているという信頼が得られなかった場合、起動時に無効化されます:
  +
  +
$ lspci -vv | grep ASPM.*abled\;
  +
  +
ASPM は BIOS によって扱われるため、ASPM が無効化される理由は以下の通りです [https://wireless.kernel.org/en/users/Documentation/ASPM]:
  +
  +
# BIOS が何らかの理由で ASPM を無効化した (コンフリクトが起こるから?)。
  +
# PCIE が L0s 以外の ASPM を必要とする (L0s は無効化され L1 だけが有効化される)。
  +
# ASPM について BIOS がプログラムされていない。
  +
# BIOS にバグが存在する。
  +
  +
コンピュータが ASPM をサポートしていると信じられる場合は、{{ic|1=pcie_aspm=force}} [[カーネルパラメータ]]を使うことで強制的にオンにすることができます。
  +
  +
{{Warning|
  +
* ASPM を強制するとフリーズやパニックが発生することがあります。ASPM が動作しなかったときにオプションを戻す手段があるか確認してください。
  +
* ASPM をサポートしていないシステムで強制させると消費電力が逆に上昇することがあります。
  +
}}
  +
  +
{{ic|powersave}} に調整するには次を実行 (以下のコマンドは ASPM が有効になっていないと機能しません):
  +
  +
echo powersave | tee /sys/module/pcie_aspm/parameters/policy
  +
  +
デフォルトでは以下のようになります:
  +
  +
{{hc|$ cat /sys/module/pcie_aspm/parameters/policy|[default] performance powersave}}
  +
  +
==== PCI Runtime Power Management ====
  +
  +
{{hc|/etc/udev/rules.d/pci_pm.rules|2=ACTION=="add", SUBSYSTEM=="pci", ATTR{power/control}="auto"}}
  +
  +
==== デバイスの電源管理 ====
  +
  +
''USB を含む''、(ほぼ) 全てのデバイスの電源管理を有効化:
  +
  +
{{hc|/etc/udev/rules.d/dev_power_save.rules|<nowiki>
  +
# Various subsystems runtime power management (by bus or class)
  +
ACTION=="add", SUBSYSTEMS=="*", TEST=="power/control", ATTR{power/control}="auto"
  +
  +
# Various subsystems power saving (by module)
  +
ACTION=="add", SUBSYSTEMS=="*", TEST=="parameters/power_save", ATTR{parameters/power_save}="1" </nowiki>}}
  +
  +
影響を受けるデバイスを表示するには:
  +
ls /sys/bus/*/devices/*/power/control
  +
ls /sys/class/*/*/power/control
  +
ls /sys/module/*/parameters/power_save
  +
  +
''USB を除く''全てのシステムで電源管理を有効にするには、最初のルールをサブシステムごとのルールに置き換えます (/sys/bus/''some_subsystem'', /sys/class/''some_subsystem''):
  +
ACTION=="add", SUBSYSTEM=="some_subsystem", TEST=="power/control", ATTR{power/control}="auto"
  +
  +
==== USB の自動サスペンド ====
  +
  +
Linux カーネルは USB デバイスが使用されていないときに USB デバイスを自動的にサスペンドさせることができます。これによって電力を相当カットできるときもありますが、USB の省電力機能に対応していない USB デバイスではおかしな挙動が起こる可能性もあります (特に USB マウスやキーボード)。ホワイトリストとブラックリストでフィルタリングする [[udev]] ルールを使うことで問題は軽減されます。
  +
  +
最も単純であまり役に立たない、全ての USB デバイスで自動サスペンドを有効にする例:
  +
  +
{{hc|/etc/udev/rules.d/50-usb_power_save.rules|<nowiki>
  +
ACTION=="add", SUBSYSTEM=="usb", TEST=="power/control", ATTR{power/control}="auto"
  +
</nowiki>}}
  +
  +
自動サスペンドが動作するデバイスにだけ自動サスペンドを有効にするには、ベンダーとプロダクト ID でマッチングを行います (''lsusb'' を使って値を取得):
  +
  +
{{hc|/etc/udev/rules.d/50-usb_power_save.rules|<nowiki>
  +
# whitelist for usb autosuspend
  +
ACTION=="add", SUBSYSTEM=="usb", TEST=="power/control", ATTR{idVendor}=="05c6", ATTR{idProduct}=="9205", ATTR{power/control}="auto"
  +
</nowiki>}}
  +
  +
もしくは、USB 自動サスペンドが使えないデバイスをブラックリストに入れて、他の全てのデバイスで自動サスペンドを有効にするには:
  +
  +
{{hc|/etc/udev/rules.d/50-usb_power_save.rules|<nowiki>
  +
# blacklist for usb autosuspend
  +
ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="05c6", ATTR{idProduct}=="9205", GOTO="power_usb_rules_end"
  +
  +
ACTION=="add", SUBSYSTEM=="usb", TEST=="power/control", ATTR{power/control}="auto"
  +
LABEL="power_usb_rules_end"
  +
</nowiki>}}
  +
  +
自動サスペンドに入るデフォルトのアイドル遅延時間は {{ic|usbcore}} [[カーネルモジュール]]の {{ic|autosuspend}} パラメータによって制御されています。遅延時間をデフォルトの2秒から5秒に設定するには:
  +
  +
{{hc|/etc/modprobe.d/usb-autosuspend.conf|<nowiki>
  +
options usbcore autosuspend=5
  +
</nowiki>}}
  +
  +
{{ic|power/control}} と同じように、{{ic|power/autosuspend}} 属性を設定することで遅延時間はデバイスごとに細かく設定することができます。
  +
  +
USB の電源管理に関する詳細は [https://www.kernel.org/doc/Documentation/usb/power-management.txt Linux カーネルドキュメント]を見て下さい。
  +
  +
==== SATA Active Link Power Management ====
  +
  +
{{Note|以下の設定を行うとアイドル状態になっているドライブにアクセスするときに遅延が発生するようになります。AC 電源を使用するかどうかによって変えるべき設定です。}}
  +
  +
{{hc|/etc/udev/rules.d/hd_power_save.rules|2=ACTION=="add", SUBSYSTEM=="scsi_host", KERNEL=="host*", ATTR{link_power_management_policy}="min_power"}}
  +
  +
{{Warning|デバイスによっては SATA Active Link Power Management でデータが消失する可能性があります (例: [[Lenovo ThinkPad T440s|Lenovo T440s]] はこの問題を抱えていることが[http://lkml.indiana.edu/hypermail/linux/kernel/1401.2/02171.html 知られています])。バックアップを取っていない場合は設定を有効にしないでください。}}
  +
  +
=== ハードディスクドライブ ===
  +
  +
設定できるドライブのパラメータについては [[hdparm]] を見て下さい。
  +
  +
多数のプログラムがディスクに頻繁に書き込みをおこなう場合は省電力は効率的ではありません。全てのプログラムを調査して、いつどのようにプログラムがディスクに書き込むを行うのか調べるのがディスクの使用量を減らす道です。{{Pkg|iotop}} を使えばどのプログラムがディスクに頻繁に書き込みしているかわかります。他のヒントは[[ソリッドステートドライブ#SSD の読み書きを最小化するヒント]]を見て下さい、ほとんどのヒントは SSD に限ったものではありません。
  +
  +
[[Fstab#atime オプション|noatime]] オプションを設定するなどの小さなことも馬鹿にできません。十分な RAM がある場合、[[スワップ#Swappiness|swappiness]] を無効化したり制限することでディスクへの書き込みが減る可能性があります。
  +
  +
=== CD/DVD のスピンダウン ===
  +
  +
[[udisks]] を使用してしばらくしてから CD/DVD ロムをスピンダウンさせるには:
  +
  +
# udisks --inhibit-polling /dev/sr0
  +
  +
== ツールとスクリプト ==
  +
  +
=== スクリプトと udev ルールを使う ===
  +
  +
systemd ユーザーは {{ic|systemctl suspend}} や {{ic|systemctl hibernate}} でサスペンドとハイバネートを行うことができ、{{ic|/etc/systemd/logind.conf}} で acpi イベントを処理することができるので、[[pm-utils]] と [[acpid]] を削除するということに興味を引かれるかもしれません。systemd が行えないことがたったひとつだけ存在します (systemd-204 現在): システムが AC 電源またはバッテリーで動作しているのかで別れる電源管理です。このギャップをなくすには、AC アダプタが抜き差しされたときにスクリプトを実行する [[udev]] ルールを作成します:
  +
  +
{{hc|/etc/udev/rules.d/powersave.rules|2=<nowiki>
  +
SUBSYSTEM=="power_supply", ATTR{online}=="0", RUN+="/path/to/your/script true"
  +
SUBSYSTEM=="power_supply", ATTR{online}=="1", RUN+="/path/to/your/script false"
  +
</nowiki>}}
  +
  +
{{Note|''pm-powersave'' が使用しているのと同じスクリプトを使うことができます。実行可能属性を付与して別の所に保存する必要があります (例えば {{ic|/usr/local/bin/}})。}}
  +
  +
powersave スクリプトのサンプル: [[powerdown]], [https://github.com/Unia/powersave powersave]。
  +
  +
上記の udev ルールはちゃんと動作するはずですが、電源設定がサスペンドやハイバネートをした後に更新されない場合、以下の内容で {{ic|/usr/lib/systemd/system-sleep/}} にスクリプトを追加してください:
  +
  +
{{hc|/usr/lib/systemd/system-sleep/00powersave|<nowiki>
  +
#!/bin/sh
  +
  +
case $1 in
  +
pre) /path/to/your/script false ;;
  +
post)
  +
if cat /sys/class/power_supply/AC0/online | grep 0 > /dev/null 2>&1
  +
then
  +
/path/to/your/script true
  +
else
  +
/path/to/your/script false
  +
fi
  +
;;
  +
esac
  +
exit 0
  +
</nowiki>}}
  +
  +
忘れずに実行可能属性を付与してください。
  +
  +
{{Note|あなたのノートパソコンでは AC0 が異なっている可能性があります。その場合は変更してください。}}
  +
  +
=== 電源設定の表示 ===
  +
  +
以下のスクリプトは USB や PCI デバイスの電源設定などのプロパティを表示します。全ての設定を見るには root 権限が必要なので注意して下さい。
  +
  +
{{bc|<nowiki>
  +
#!/bin/bash
  +
  +
for i in $(find /sys/devices -name "bMaxPower")
  +
do
  +
busdir=${i%/*}
  +
busnum=$(<$busdir/busnum)
  +
devnum=$(<$busdir/devnum)
  +
title=$(lsusb -s $busnum:$devnum)
  +
  +
printf "\n\n+++ %s\n -%s\n" "$title" "$busdir"
  +
  +
for ff in $(find $busdir/power -type f ! -empty 2>/dev/null)
  +
do
  +
v=$(cat $ff 2>/dev/null|tr -d "\n")
  +
[[ ${#v} -gt 0 ]] && echo -e " ${ff##*/}=$v";
  +
v=;
  +
done | sort -g;
  +
done;
  +
  +
printf "\n\n\n+++ %s\n" "Kernel Modules"
  +
for mod in $(lspci -k | sed -n '/in use:/s,^.*: ,,p' | sort -u)
  +
do
  +
echo "+ $mod";
  +
systool -v -m $mod 2> /dev/null | sed -n "/Parameters:/,/^$/p";
  +
done
  +
</nowiki>}}
  +
  +
== トラブルシューティング ==
  +
  +
=== フタのスイッチのアクションの遅延 ===
  +
  +
短期間に連続してフタのスイッチが反応した場合、''logind'' はドッキングを検出するために90秒までサスペンドを遅延します [https://lists.freedesktop.org/archives/systemd-devel/2015-January/027131.html]。この遅延時間は systemd v220 から設定ができます [https://cgit.freedesktop.org/systemd/systemd/commit/?id=9d10cbee89ca7f82d29b9cb27bef11e23e3803ba]:
  +
  +
{{hc|/etc/systemd/logind.conf|<nowiki>
  +
...
  +
HoldoffTimeoutSec=30s
  +
...
  +
</nowiki>}}
  +
  +
=== ノートパソコンをサスペンドする Fn キーが動作しない ===
  +
  +
{{ic|logind.conf}} をどう設定してもスリープボタンが動作しない場合 (ボタンを押しても syslog にメッセージすら表示されない)、おそらく logind がキーボードデバイスを監視していません [https://lists.freedesktop.org/archives/systemd-devel/2015-February/028325.html]。次のコマンドを実行してください:
  +
# journalctl | grep "Watching system buttons"
  +
すると以下のような表示がされます:
  +
May 25 21:28:19 vmarch.lan systemd-logind[210]: Watching system buttons on /dev/input/event2 (Power Button)
  +
May 25 21:28:19 vmarch.lan systemd-logind[210]: Watching system buttons on /dev/input/event3 (Sleep Button)
  +
May 25 21:28:19 vmarch.lan systemd-logind[210]: Watching system buttons on /dev/input/event4 (Video Bus)
  +
キーボードデバイスがないことに気づいて下さい。したがってキーボードデバイスの ATTRS{name} を取得します [http://systemd-devel.freedesktop.narkive.com/Rbi3rjNN/patch-1-2-logind-add-support-for-tps65217-power-button]:
  +
# udevadm info -a /dev/input/by-path/*-kbd
  +
...
  +
KERNEL=="event0"
  +
...
  +
ATTRS{name}=="AT Translated Set 2 keyboard"
  +
カスタム udev ルールを作成して "power-switch" タグを追加:
  +
{{hc|/etc/udev/rules.d/70-power-switch-my.rules|<nowiki>
  +
ACTION=="remove", GOTO="power_switch_my_end"
  +
SUBSYSTEM=="input", KERNEL=="event*", ATTRS{name}=="AT Translated Set 2 keyboard", TAG+="power-switch"
  +
LABEL="power_switch_my_end"
  +
</nowiki>}}
  +
サービスを再起動してルールをリロードしてください:
  +
# systemctl restart systemd-udevd
  +
# udevadm trigger
  +
# systemctl restart systemd-logind
  +
これで syslog に {{ic|Watching system buttons on /dev/input/event0}} と表示されるようになるはずです。
   
 
== 参照 ==
 
== 参照 ==
  +
* [[ノートパソコン#電源管理]]ではノートパソコンでの電源管理(特にバッテリー状態の監視)を説明しています。
 
  +
* [https://www.thinkwiki.org/wiki/How_to_reduce_power_consumption ThinkWiki:How to reduce power consumption]
* [[一般的な推奨事項#電源管理]]
 
  +
* [http://ivanvojtko.blogspot.sk/2016/04/how-to-get-longer-battery-life-on-linux.html How to get longer battery life on Linux]

2019年6月29日 (土) 22:51時点における版

関連記事

電源管理とはシステムが使われていない場合に電力の供給を切ったり低電力状態にする機能のことです。このページでは Arch Linux における電源管理の全体的な外観を説明します。

ハードウェアの電源管理の設定を直接変更するときはカーネルの設定を使います:

また、カーネルと対話してイベントを処理する電源管理ツールが多数あります: #ユーザースペースツール を参照。

ノート: ひとつの設定箇所・ツールで設定した電力設定が他の設定箇所・ツールで上書きされる可能性もあるので注意してください。

ユーザースペースツール

以下のツールを使うことで手動で多数の設定を行うかわりになります。どのツールも多かれ少なかれ同じような動作をするので、衝突をさけるためにツールはどれか一つだけを実行してください。電源管理カテゴリを見ることで Arch Linux にどんな電源管理の選択肢が存在するかわかります。

以下は省電力設定をするために作られた人気のあるスクリプトやツールです:

  • acpid — ACPI の電源管理イベントを届けるデーモン。netlink をサポート。
https://sourceforge.net/projects/acpid2/ || acpid
  • Laptop Mode Tools — ノートパソコンの省電力設定をするユーティリティ。多少設定が要りますが省電力設定ユーティリティのデファクトスタンダードとされています。
https://github.com/rickysarraf/laptop-mode-tools || laptop-mode-toolsAUR
  • powertop — 消費電力や電源管理の問題を診断して省電力設定を補助するツール。
https://01.org/powertop/ || powertop
  • systemd
  • TLP — Linux 向けの先進的な電源管理。
http://linrunner.de/tlp || tlp

systemd による電源管理

ACPI イベント

systemd は電源関連の ACPI イベントを扱えます。/etc/systemd/logind.conf/etc/systemd/logind.conf.d/*.conf のオプションを使って設定できます:

  • HandlePowerKey: パワーキーが押された時に行う動作を定めます。
  • HandleSuspendKey: サスペンドキーが押された時に行う動作を定めます。
  • HandleHibernateKey: ハイバネートキーが押された時に行う動作を定めます。
  • HandleLidSwitch: フタが閉じられた時に行う動作を定めます。

定めることができる動作は ignore, poweroff, reboot, halt, suspend, hibernate, hybrid-sleep, lock, kexec のいずれかです。

オプションが設定されていない場合、systemd が使うデフォルトは: HandlePowerKey=poweroff, HandleSuspendKey=suspend, HandleHibernateKey=hibernate, HandleLidSwitch=suspend

グラフィカルセットアップを走らせていなかったり i3awesome などシンプルなウィンドウマネージャしか使っていないシステムでは、これで ACPI イベントに反応するものとして使っている acpid デーモンを置き換えることが可能です。

ノート:
  • 変更を適用するには systemctl restart systemd-logind を実行してください。
  • Systemd は AC やバッテリの ACPI イベントを取り扱うことはできません、Laptop Mode Tools などのツールを使うには、依然として acpid が必要になります。
  • 外付けモニターが接続されている場合、フタが閉じられても HandleLidSwitch オプションはアクションを実行しません。
警告: systemd バージョン 211 と 212 では、HandleLidSwitch オプションは NVIDIA バイナリドライバーがインストールされている環境では使用できません。この問題はバージョン 213 で修正されています。systemd のバグトラッカーBBS のトピックを参照してください。

電源マネージャ

デスクトップ環境には電源マネージャが含まれていることがあります。現在のバージョンの systemd では、Handle* オプションは電源マネージャによって "inhibited" (一時的にオフ) にされない限りシステム全体に適用されます。停止されなければ、systemd がシステムをサスペンドした状態で終わることができ、立ち上がった時に他の電源マネージャによってもう一度停止されます。

最新の KDE, GNOME, Xfce の電源マネージャは "inhibited" コマンドを実行します。acpid など他のプログラムで ACPI イベントを管理したい場合は、Handle オプションを ignore に設定する必要があります。詳しくは systemd-inhibit(1) を参照。

xss-lock

xss-lock は systemd の suspend, hibernate, lock-session, unlock-session イベントで適切なアクションを実行します (ロッカーの起動など)。xss-lockDPMS イベントにも反応します。

xss-lock を自動起動するときは以下のようなコマンドを使います:

xss-lock -- i3lock -n -i background_image.png &

xss-lock によってサスペンド時に CPU 消費率が 100% になる場合、commit 1e158f にあるように xss-lock-gitAUR を使うことで問題が解決します。

サスペンドとハイバネート

systemd はカーネルに入っているサスペンド・レジューム機能を使ってサスペンド (suspend to RAM)・ハイバネート・ハイブリッドサスペンドを行うコマンドを提供しています。また、サスペンドの前後の行動をカスタマイズするフックを追加する仕組みも存在します。

ノート: systemd はデフォルトのカーネルバックエンドに加えて、他のサスペンドバックエンド (Uswsusp) を使ってコンピュータをサスペンドしたりハイバネートすることもできます。例えば Uswsusp#systemd を使う を見て下さい。

systemctl suspend は何も設定しなくても動きますが、あなたの環境で systemctl hibernate を使うにはサスペンドとハイバネート#ハイバネーションの指示に従う必要があります。

ハイブリッドスリープ

systemctl hybrid-sleep はハイバネートとサスペンドを同時に行います。サスペンドとハイバネートのメリット・デメリットを組み合わせたものになります。突然コンピュータの電源が喪失 (コンセントが抜けたりバッテリーが切れる) しても、ハイバネートから復帰するため便利です。電源喪失がない場合、サスペンドから復帰するため、ハイバネートから復帰するよりも高速に復帰します。ただし、"hybrid-sleep" はハイバネートを機能させるためにメモリをスワップする必要があるので、普通の systemctl suspend よりもスリープするのにかかる時間が長くなります。ハイブリッドスリープの別の方法として遅延ハイバネーションがあります。

サスペンドやハイバネーションの代わりに常にハイブリッドスリープを使う

サスペンドやハイバネートが要求されたときでもハイブリッドスリープを行うように systemd を設定することができます。

デフォルトのサスペンドとハイバネートのアクションは /etc/systemd/sleep.conf ファイルで設定します。両方ともハイブリッドスリープを実行するように設定するには:

/etc/systemd/sleep.conf
[Sleep]
# suspend=hybrid-sleep
SuspendMode=suspend
SuspendState=disk
# hibernate=hybrid-sleep
HibernateMode=suspend
HibernateState=disk

詳しくは sleep.conf.d(5) のマニュアルページを読んでください。

スリープフック

サスペンド/リジューム サービスファイル

サービスファイルを suspend.target, hibernate.target, sleep.target にフックすることでサスペンド・ハイバネート前後に行うアクションを設定できます。ユーザー・システムアクションを行うにはファイルを分割する必要があります。ユーザーサービスファイルを作動させるには、# systemctl enable suspend@<user> && systemctl enable resume@<user>。例:

/etc/systemd/system/suspend@.service
[Unit]
Description=User suspend actions
Before=sleep.target

[Service]
User=%I
Type=forking
Environment=DISPLAY=:0
ExecStartPre= -/usr/bin/pkill -u %u unison ; /usr/local/bin/music.sh stop ; /usr/bin/mysql -e 'slave stop'
ExecStart=/usr/bin/sflock
ExecStartPost=/usr/bin/sleep 1

[Install]
WantedBy=sleep.target
/etc/systemd/system/resume@.service
[Unit]
Description=User resume actions
After=suspend.target

[Service]
User=%I
Type=simple
ExecStartPre=/usr/local/bin/ssh-connect.sh
ExecStart=/usr/bin/mysql -e 'slave start'

[Install]
WantedBy=suspend.target
ノート:
  • slock を使用する場合、スリープする前にサービスを起動してはいけません。デフォルトの simple サービスタイプを使って下さい。でないと、先に slock が起動して、ロックを解除しないとスリープに入らないようになってしまいます。forking タイプを指定しても解決しません。
  • スクリーンがロックされる前にスクリーンロックが返ってきてしまい、サスペンドから復帰するときに画面が点滅することがあります。ExecStartPost=/usr/bin/sleep 1 で遅延を追加することで解決します。

root アクションでは (# systemctl enable root-suspend で有効にしてください):

/etc/systemd/system/root-resume.service
[Unit]
Description=Local system resume actions
After=suspend.target

[Service]
Type=simple
ExecStart=/usr/bin/systemctl restart mnt-media.automount

[Install]
WantedBy=suspend.target
/etc/systemd/system/root-suspend.service
[Unit]
Description=Local system suspend actions
Before=sleep.target

[Service]
Type=simple
ExecStart=-/usr/bin/pkill sshfs

[Install]
WantedBy=sleep.target

サービスファイルについてのヒント (詳しくは systemd.service(5)):

  • Type=oneshot の場合、複数の ExecStart= 行を使うことができます。それ以外の場合は使える ExecStart は一行だけです。ExecStartPre を使ったりコマンドをセミコロンで分割することでコマンドを追加することができます(最初の例を見て下さい -- セミコロンの前後にはスペースが必要です)。
  • コマンドの前に '-' を付けるとエラーが起こっても(終了ステータスが0以外でも)無視され、コマンドは成功したとして扱われます。
  • サービスファイルのトラブルシューティングのときにエラーを見つけるには journalctl を使うのがベストです。
サスペンド/レジューム サービスファイルの統合

サスペンド/レジューム サービスファイルを統合すれば、様々なフェイズ(スリープ・レジューム)やターゲット(サスペンド・ハイバネート・ハイブリッドスリープ)でやることをひとつのフックで行うことができます。

例と説明:

/etc/systemd/system/wicd-sleep.service
[Unit]
Description=Wicd sleep hook
Before=sleep.target
StopWhenUnneeded=yes

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=-/usr/share/wicd/daemon/suspend.py
ExecStop=-/usr/share/wicd/daemon/autoconnect.py

[Install]
WantedBy=sleep.target
  • RemainAfterExit=yes: 起動後、明示的に止められるまでサービスは常時 active になります。
  • StopWhenUnneeded=yes: active のとき、サービスは sleep.target が停止した後に止められます。
  • sleep.target は suspend.target, hibernate.target, hybrid-sleep.target から呼ばれ sleep.target 自身は StopWhenUnneeded サービスなので、タスクごとにフックが正しく起動・停止することが保証されています。

遅延ハイバネーション

遅延ハイバネーションではスリープフックを利用して通常通りにサスペンドしますが、その後にハイバネーションを実行するタイマーをセットします。ハイバネーションを最初に実行しないためスリープに入るのが systemctl hybrid-sleep よりも早くなります。ただし、"hybrid-sleep" とは違って、サスペンド中にハイバネーションを使うことで電源喪失から保護するようなことはできません。そのため遅延ハイバネーションはデスクトップなどよりもノートパソコンで使うほうが適しています。ハイバネーションが遅延されるため、サスペンド中はノートパソコンのバッテリーだけが使われ、それからハイバネーションが実行されます。バッテリーがなくなるまでサスペンドし続ける "hybrid-sleep" よりも消費電力を抑えることが可能です。ノートパソコンにハードディスクが搭載されている場合、ハイバネートするためにサスペンドから復帰したとき、ノートパソコンを数秒間は動かさないほうがよいでしょう。遅延ハイバネーションは消費電力だけでなくセキュリティに関しても利点があります (例: 完全なディスク暗号化を使っている場合)。サンプルスクリプトは こちら にあります。systemd のスリープフックについては こちらの投稿 も参照してください。

/etc/systemd/system/suspend-to-hibernate.service
[Unit]
Description=Delayed hibernation trigger
Documentation=https://bbs.archlinux.org/viewtopic.php?pid=1420279#p1420279
Documentation=https://wiki.archlinux.org/index.php/Power_management
Conflicts=hibernate.target hybrid-sleep.target
Before=sleep.target
StopWhenUnneeded=true

[Service]
Type=oneshot
RemainAfterExit=yes
Environment="WAKEALARM=/sys/class/rtc/rtc0/wakealarm"
Environment="SLEEPLENGTH=+2hour"
ExecStart=-/usr/bin/sh -c 'echo -n "alarm set for "; date +%%s -d$SLEEPLENGTH | tee $WAKEALARM'
ExecStop=-/usr/bin/sh -c '\
  alarm=$(cat $WAKEALARM); \
  now=$(date +%%s); \
  if [ -z "$alarm" ] || [ "$now" -ge "$alarm" ]; then \
     echo "hibernate triggered"; \
     systemctl hibernate; \
  else \
     echo "normal wakeup"; \
  fi; \
  echo 0 > $WAKEALARM; \
'

[Install]
WantedBy=sleep.target

BeforeConflicts オプションはハイバネートでは動作させないようにするために必要です。そうしないと遅延ハイバネーションが実行されたときにサービスが2回実行されてしまいます。WantedByStopWhenUnneeded オプションはスリープの前に実行して復帰時に停止するように設定しています。サービスを有効化してください。

/usr/lib/systemd/system-sleep のフック

Systemd は /usr/lib/systemd/system-sleep/ 内の全ての実行可能ファイルを実行するときに、2つの引数を渡します:

  • 引数 1: prepost。マシンが停止するときと起動するとき。
  • 引数 2: suspendhibernatehybrid-sleep。呼び出されるものによる。

systemd はスクリプトを(ひとつずつではなく)同時に実行します。

カスタムスクリプトの出力は systemd-suspend.service, systemd-hibernate.service, systemd-hybrid-sleep.service によって記録されます。出力を見るには systemd の journal を使って下さい:

# journalctl -b -u systemd-suspend
ノート: カスタムスクリプトを使うかわりに sleep.target, suspend.target, hibernate.target, hybrid-sleep.target を使ってユニットをスリープステートロジックにフックさせることもできます。

カスタムスリープスクリプトの例:

/usr/lib/systemd/system-sleep/example.sh
#!/bin/sh
case $1/$2 in
  pre/*)
    echo "Going to $2..."
    ;;
  post/*)
    echo "Waking up from $2..."
    ;;
esac

スクリプトを実行可能にするのを忘れないで下さい:

# chmod a+x /usr/lib/systemd/system-sleep/example.sh

詳しくは systemd.special(7)systemd-sleep(8) を見てください。

省電力設定

ノート: ノートパソコン#電源管理ではノートパソコンでの電源管理(特にバッテリー状態の監視)を説明しています。

このセクションでは省電力機能を使用するのに必要な設定を扱います。コンピュータが AC 電源またはバッテリーで動作しているかに関わらず、ここに記載されているほとんど全ての機能には使用する価値があります。パフォーマンスへの影響は軽微ですが、大抵壊れているハードウェアやドライバーのためにデフォルトでは有効になっていません。電力の使用量を減らすことは熱を減らすことでもあり、動的なオーバークロックによって、最近の Intel や AMD の CPU ではパフォーマンスの向上につながることもあります。

udev ルールなどを使ってスクリプトや省電力設定を自分で作成したい場合は以下の設定を参考にすることができます。

ノート: 以下で記述しているルールのほとんどは TLP などのツールで管理することもでき、ツールを使いながら自分でも管理するのは不得策です。

オーディオ

デフォルトでは、オーディオの省電力機能はほとんどのドライバーで無効になっています。power_save パラメータを設定することで有効にすることができます。アイドルモードに移行するまでの時間を秒数で指定します。1秒後にサウンドカードをアイドル状態にするには、Intel の場合、以下を作成:

/etc/modprobe.d/audio_powersave.conf
options snd_hda_intel power_save=1

ac97 の場合は以下を使って下さい:

options snd_ac97_codec power_save=1
ノート:
  • サウンドカードの製造者や使われているカーネルドライバーの情報を取得するには、lspci -k を実行してください。
  • サウンドカードの電源状態を変更すると壊れたハードウェアでポップノイズがまじったり著しい遅延が発生することがあります。

HDMI の音声出力を無効化することで消費電力を下げることもできます。適切なカーネルモジュールをブラックリストに追加してください (例: snd_hda_codec_hdmi)。

バックライト

バックライトを見て下さい。

Bluetooth

Bluetooth を完全に無効化するには、btusbbluetooth モジュールをブラックリストに入れてください。

一時的にだけ bluetooth をオフにするには、rfkill を使用します:

# rfkill block bluetooth

もしくは udev ルールを使って:

/etc/udev/rules.d/50-bluetooth.rules
# disable bluetooth
SUBSYSTEM=="rfkill", ATTR{type}=="bluetooth", ATTR{state}="0"

ウェブカメラ

内蔵のウェブカメラを使わない場合、uvcvideo モジュールをブラックリストに入れてください。

カーネルパラメータ

このセクションでは /etc/sysctl.d/ の設定を使います。このディレクトリはカーネルの sysctl パラメータと対応するディレクトリです。詳しくは The New Configuration Files や、より正確な sysctl.d(5) を見てください。

NMI watchdog の無効化

NMI watchdog はカーネルパニックを引き起こすハードウェアのハングアップをキャッチするデバッグ機能です。システムによっては大量の割り込みが発生するため、消費電力の増加につながっていることがあります:

/etc/sysctl.d/disable_watchdog.conf
kernel.nmi_watchdog = 0

もしくは起動の初期で完全に無効化するにはカーネル行nmi_watchdog=0 を追加してください。

ライトバック時間

仮想メモリのダーティなライトバック時間を増やすことでディスク I/O がまとめられて、断続的なディスクの書き込みが減って、消費電力が抑えられます。この値を60秒に設定するには (デフォルトは5秒です):

/etc/sysctl.d/dirty.conf
vm.dirty_writeback_centisecs = 6000

ジャーナルをサポートしているファイルシステム (ext4 や btrfs など) でジャーナルコミットでも同じことをするには、fstab でオプションとして commit=60 を使用します。

I/O パフォーマンスや省電力に影響する他のパラメータは sysctl#仮想メモリ を参照。

Laptop Mode

ラップトップモードの'ノブ'についてはカーネルドキュメントを見て下さい。"このノブの適切な値は5秒です。"

/etc/sysctl.d/laptop.conf
vm.laptop_mode = 5

ネットワークインターフェイス

Wake-on-LAN は便利な機能ですが、利用しない場合はサスペンド中にマジックパケットが来るのを待つのに無駄な電力を消耗するだけです。全ての Ethernet インターフェイスで Wake-on-LAN を無効化:

/etc/udev/rules.d/70-disable_wol.rules
ACTION=="add", SUBSYSTEM=="net", KERNEL=="eth*", RUN+="/usr/bin/ethtool -s %k wol d"

全ての無線インターフェイスで省電力機能を有効にするには:

/etc/udev/rules.d/70-wifi-powersave.rules
ACTION=="add", SUBSYSTEM=="net", KERNEL=="wlan*", RUN+="/usr/bin/iw dev %k set power_save on"

上記の例では、%k がマッチするデバイスのカーネル名を示します。例えば、ルールが wlan0 に適用可能とわかった場合、%kwlan0 に置き換えられます。特定のインターフェイスにだけルールを適用するには、パターン eth* と修飾子 %k を適当なインターフェイスの名前に置き換えて下さい。詳しくは、Writing udev rules を参照。

ノート: ここで、設定ファイルの名前は重要です。systemd v197 から 80-net-setup-link.rules によって永続的なデバイス名が導入されたため、デバイスに enp2s0 というような名前で呼ばれるようになる前に適用されるように、ネットワークの powersave ファイルは辞書順で 80-net-setup-link.rules よりも前に来る名前を付けなくてはなりません。

Intel ワイヤレスカード (iwlwifi)

Intel 製ワイヤレスカードの省電力機能は iwlwifi ドライバーに適切なパラメータを渡すことで有効にできます。/etc/modprobe.d/iwlwifi.conf ファイルに以下の行を追加することで永続的に有効にできます:

options iwlwifi power_save=1 d0i3_disable=0 uapsd_disable=0
options iwldvm force_cam=0

上記の省電力オプションは実験的であり、システムが不安定になる可能性があります。

バスパワーの管理

Active State Power Management

コンピュータが ASPM をサポートしているという信頼が得られなかった場合、起動時に無効化されます:

$ lspci -vv | grep ASPM.*abled\;

ASPM は BIOS によって扱われるため、ASPM が無効化される理由は以下の通りです [1]:

  1. BIOS が何らかの理由で ASPM を無効化した (コンフリクトが起こるから?)。
  2. PCIE が L0s 以外の ASPM を必要とする (L0s は無効化され L1 だけが有効化される)。
  3. ASPM について BIOS がプログラムされていない。
  4. BIOS にバグが存在する。

コンピュータが ASPM をサポートしていると信じられる場合は、pcie_aspm=force カーネルパラメータを使うことで強制的にオンにすることができます。

警告:
  • ASPM を強制するとフリーズやパニックが発生することがあります。ASPM が動作しなかったときにオプションを戻す手段があるか確認してください。
  • ASPM をサポートしていないシステムで強制させると消費電力が逆に上昇することがあります。

powersave に調整するには次を実行 (以下のコマンドは ASPM が有効になっていないと機能しません):

echo powersave | tee /sys/module/pcie_aspm/parameters/policy

デフォルトでは以下のようになります:

$ cat /sys/module/pcie_aspm/parameters/policy
[default] performance powersave

PCI Runtime Power Management

/etc/udev/rules.d/pci_pm.rules
ACTION=="add", SUBSYSTEM=="pci", ATTR{power/control}="auto"

デバイスの電源管理

USB を含む、(ほぼ) 全てのデバイスの電源管理を有効化:

/etc/udev/rules.d/dev_power_save.rules
# Various subsystems runtime power management (by bus or class)
ACTION=="add", SUBSYSTEMS=="*", TEST=="power/control", ATTR{power/control}="auto"

# Various subsystems power saving (by module)
ACTION=="add", SUBSYSTEMS=="*", TEST=="parameters/power_save", ATTR{parameters/power_save}="1" 

影響を受けるデバイスを表示するには:

ls /sys/bus/*/devices/*/power/control
ls /sys/class/*/*/power/control
ls /sys/module/*/parameters/power_save

USB を除く全てのシステムで電源管理を有効にするには、最初のルールをサブシステムごとのルールに置き換えます (/sys/bus/some_subsystem, /sys/class/some_subsystem):

ACTION=="add", SUBSYSTEM=="some_subsystem", TEST=="power/control", ATTR{power/control}="auto"

USB の自動サスペンド

Linux カーネルは USB デバイスが使用されていないときに USB デバイスを自動的にサスペンドさせることができます。これによって電力を相当カットできるときもありますが、USB の省電力機能に対応していない USB デバイスではおかしな挙動が起こる可能性もあります (特に USB マウスやキーボード)。ホワイトリストとブラックリストでフィルタリングする udev ルールを使うことで問題は軽減されます。

最も単純であまり役に立たない、全ての USB デバイスで自動サスペンドを有効にする例:

/etc/udev/rules.d/50-usb_power_save.rules
ACTION=="add", SUBSYSTEM=="usb", TEST=="power/control", ATTR{power/control}="auto"

自動サスペンドが動作するデバイスにだけ自動サスペンドを有効にするには、ベンダーとプロダクト ID でマッチングを行います (lsusb を使って値を取得):

/etc/udev/rules.d/50-usb_power_save.rules
# whitelist for usb autosuspend
ACTION=="add", SUBSYSTEM=="usb", TEST=="power/control", ATTR{idVendor}=="05c6", ATTR{idProduct}=="9205", ATTR{power/control}="auto"

もしくは、USB 自動サスペンドが使えないデバイスをブラックリストに入れて、他の全てのデバイスで自動サスペンドを有効にするには:

/etc/udev/rules.d/50-usb_power_save.rules
# blacklist for usb autosuspend
ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="05c6", ATTR{idProduct}=="9205", GOTO="power_usb_rules_end"

ACTION=="add", SUBSYSTEM=="usb", TEST=="power/control", ATTR{power/control}="auto"
LABEL="power_usb_rules_end"

自動サスペンドに入るデフォルトのアイドル遅延時間は usbcore カーネルモジュールautosuspend パラメータによって制御されています。遅延時間をデフォルトの2秒から5秒に設定するには:

/etc/modprobe.d/usb-autosuspend.conf
options usbcore autosuspend=5

power/control と同じように、power/autosuspend 属性を設定することで遅延時間はデバイスごとに細かく設定することができます。

USB の電源管理に関する詳細は Linux カーネルドキュメントを見て下さい。

SATA Active Link Power Management

ノート: 以下の設定を行うとアイドル状態になっているドライブにアクセスするときに遅延が発生するようになります。AC 電源を使用するかどうかによって変えるべき設定です。
/etc/udev/rules.d/hd_power_save.rules
ACTION=="add", SUBSYSTEM=="scsi_host", KERNEL=="host*", ATTR{link_power_management_policy}="min_power"
警告: デバイスによっては SATA Active Link Power Management でデータが消失する可能性があります (例: Lenovo T440s はこの問題を抱えていることが知られています)。バックアップを取っていない場合は設定を有効にしないでください。

ハードディスクドライブ

設定できるドライブのパラメータについては hdparm を見て下さい。

多数のプログラムがディスクに頻繁に書き込みをおこなう場合は省電力は効率的ではありません。全てのプログラムを調査して、いつどのようにプログラムがディスクに書き込むを行うのか調べるのがディスクの使用量を減らす道です。iotop を使えばどのプログラムがディスクに頻繁に書き込みしているかわかります。他のヒントはソリッドステートドライブ#SSD の読み書きを最小化するヒントを見て下さい、ほとんどのヒントは SSD に限ったものではありません。

noatime オプションを設定するなどの小さなことも馬鹿にできません。十分な RAM がある場合、swappiness を無効化したり制限することでディスクへの書き込みが減る可能性があります。

CD/DVD のスピンダウン

udisks を使用してしばらくしてから CD/DVD ロムをスピンダウンさせるには:

# udisks --inhibit-polling /dev/sr0

ツールとスクリプト

スクリプトと udev ルールを使う

systemd ユーザーは systemctl suspendsystemctl hibernate でサスペンドとハイバネートを行うことができ、/etc/systemd/logind.conf で acpi イベントを処理することができるので、pm-utilsacpid を削除するということに興味を引かれるかもしれません。systemd が行えないことがたったひとつだけ存在します (systemd-204 現在): システムが AC 電源またはバッテリーで動作しているのかで別れる電源管理です。このギャップをなくすには、AC アダプタが抜き差しされたときにスクリプトを実行する udev ルールを作成します:

/etc/udev/rules.d/powersave.rules
SUBSYSTEM=="power_supply", ATTR{online}=="0", RUN+="/path/to/your/script true"
SUBSYSTEM=="power_supply", ATTR{online}=="1", RUN+="/path/to/your/script false"
ノート: pm-powersave が使用しているのと同じスクリプトを使うことができます。実行可能属性を付与して別の所に保存する必要があります (例えば /usr/local/bin/)。

powersave スクリプトのサンプル: powerdown, powersave

上記の udev ルールはちゃんと動作するはずですが、電源設定がサスペンドやハイバネートをした後に更新されない場合、以下の内容で /usr/lib/systemd/system-sleep/ にスクリプトを追加してください:

/usr/lib/systemd/system-sleep/00powersave
#!/bin/sh

case $1 in
    pre) /path/to/your/script false ;;
    post)       
	if cat /sys/class/power_supply/AC0/online | grep 0 > /dev/null 2>&1
	then
    		/path/to/your/script true	
	else
    		/path/to/your/script false
	fi
    ;;
esac
exit 0

忘れずに実行可能属性を付与してください。

ノート: あなたのノートパソコンでは AC0 が異なっている可能性があります。その場合は変更してください。

電源設定の表示

以下のスクリプトは USB や PCI デバイスの電源設定などのプロパティを表示します。全ての設定を見るには root 権限が必要なので注意して下さい。

#!/bin/bash

for i in $(find /sys/devices -name "bMaxPower")
do
	busdir=${i%/*}
	busnum=$(<$busdir/busnum)
	devnum=$(<$busdir/devnum)
	title=$(lsusb -s $busnum:$devnum)

	printf "\n\n+++ %s\n  -%s\n" "$title" "$busdir"

	for ff in $(find $busdir/power -type f ! -empty 2>/dev/null)
	do
		v=$(cat $ff 2>/dev/null|tr -d "\n")
		[[ ${#v} -gt 0 ]] && echo -e " ${ff##*/}=$v";
		v=;
	done | sort -g;
done;

printf "\n\n\n+++ %s\n" "Kernel Modules"
for mod in $(lspci -k | sed -n '/in use:/s,^.*: ,,p' | sort -u)
do
	echo "+ $mod";
	systool -v -m $mod 2> /dev/null | sed -n "/Parameters:/,/^$/p";
done

トラブルシューティング

フタのスイッチのアクションの遅延

短期間に連続してフタのスイッチが反応した場合、logind はドッキングを検出するために90秒までサスペンドを遅延します [2]。この遅延時間は systemd v220 から設定ができます [3]:

/etc/systemd/logind.conf
...
HoldoffTimeoutSec=30s
...

ノートパソコンをサスペンドする Fn キーが動作しない

logind.conf をどう設定してもスリープボタンが動作しない場合 (ボタンを押しても syslog にメッセージすら表示されない)、おそらく logind がキーボードデバイスを監視していません [4]。次のコマンドを実行してください:

# journalctl | grep "Watching system buttons"

すると以下のような表示がされます:

May 25 21:28:19 vmarch.lan systemd-logind[210]: Watching system buttons on /dev/input/event2 (Power Button)
May 25 21:28:19 vmarch.lan systemd-logind[210]: Watching system buttons on /dev/input/event3 (Sleep Button)
May 25 21:28:19 vmarch.lan systemd-logind[210]: Watching system buttons on /dev/input/event4 (Video Bus)

キーボードデバイスがないことに気づいて下さい。したがってキーボードデバイスの ATTRS{name} を取得します [5]:

# udevadm info -a /dev/input/by-path/*-kbd
...
KERNEL=="event0"
...
ATTRS{name}=="AT Translated Set 2 keyboard"

カスタム udev ルールを作成して "power-switch" タグを追加:

/etc/udev/rules.d/70-power-switch-my.rules
ACTION=="remove", GOTO="power_switch_my_end"
SUBSYSTEM=="input", KERNEL=="event*", ATTRS{name}=="AT Translated Set 2 keyboard", TAG+="power-switch"
LABEL="power_switch_my_end"

サービスを再起動してルールをリロードしてください:

# systemctl restart systemd-udevd
# udevadm trigger
# systemctl restart systemd-logind

これで syslog に Watching system buttons on /dev/input/event0 と表示されるようになるはずです。

参照