「電源管理」の版間の差分
Kusanaginoturugi (トーク | 投稿記録) 細 (→Intel ワイヤレスカード (iwlwifi): need one file.) |
|||
(2人の利用者による、間の16版が非表示) | |||
3行目: | 3行目: | ||
[[es:Power management]] |
[[es:Power management]] |
||
[[it:Shutdown Pressing Power Button]] |
[[it:Shutdown Pressing Power Button]] |
||
− | [[ |
+ | [[zh-hans:Power management]] |
− | [[zh-cn:Power management]] |
||
{{Related articles start}} |
{{Related articles start}} |
||
{{Related|サスペンドとハイバネート}} |
{{Related|サスペンドとハイバネート}} |
||
15行目: | 14行目: | ||
{{Related articles end}} |
{{Related articles end}} |
||
− | このページでは Arch Linux における電源管理の全体的な外観を説明します。 |
+ | 電源管理とはシステムが使われていない場合に電力の供給を切ったり低電力状態にする機能のことです。このページでは Arch Linux における電源管理の全体的な外観を説明します。 |
ハードウェアの電源管理の設定を直接変更するときはカーネルの設定を使います: |
ハードウェアの電源管理の設定を直接変更するときはカーネルの設定を使います: |
||
28行目: | 27行目: | ||
== ユーザースペースツール == |
== ユーザースペースツール == |
||
− | 以下のツールを使うことで手動で多数の設定を行うかわりになります。どのツールも多かれ少なかれ同じような動作をするので、衝突をさけるためにツールはどれか一つだけを実行してください。[[:Category:電源管理|電源管理カテゴリ]]を見ることで |
+ | 以下のツールを使うことで手動で多数の設定を行うかわりになります。どのツールも多かれ少なかれ同じような動作をするので、衝突をさけるためにツールはどれか一つだけを実行してください。[[:Category:電源管理|電源管理カテゴリ]]を見ることで Arch Linux にどんな電源管理の選択肢が存在するかわかります。 |
以下は省電力設定をするために作られた人気のあるスクリプトやツールです: |
以下は省電力設定をするために作られた人気のあるスクリプトやツールです: |
||
− | * {{App|[[acpid]]|ACPI の電源管理イベントを届けるデーモン。netlink をサポート。| |
+ | * {{App|[[acpid]]|ACPI の電源管理イベントを届けるデーモン。netlink をサポート。|https://sourceforge.net/projects/acpid2/|{{Pkg|acpid}}}} |
− | * {{App|ftw|節電のための udev ルールを設定するスクリプト。|https://github.com/supplantr/ftw|{{AUR|ftw-git}}}} |
||
* {{App|[[Laptop Mode Tools]]|ノートパソコンの省電力設定をするユーティリティ。多少設定が要りますが省電力設定ユーティリティのデファクトスタンダードとされています。|https://github.com/rickysarraf/laptop-mode-tools|{{AUR|laptop-mode-tools}}}} |
* {{App|[[Laptop Mode Tools]]|ノートパソコンの省電力設定をするユーティリティ。多少設定が要りますが省電力設定ユーティリティのデファクトスタンダードとされています。|https://github.com/rickysarraf/laptop-mode-tools|{{AUR|laptop-mode-tools}}}} |
||
− | * {{App|[[pm-utils]]|サスペンドと電源状態設定のフレームワーク (今のところ大部分が開発途上)。|http://pm-utils.freedesktop.org/|{{Pkg|pm-utils}}}} |
||
− | * {{App|[[Powerdown]]|様々な設定によってコンピュータの消費電力を減らすスクリプト。|https://github.com/taylorchu/powerdown|{{Aur|powerdown-git}}}} |
||
* {{App|[[powertop]]|消費電力や電源管理の問題を診断して省電力設定を補助するツール。|https://01.org/powertop/|{{Pkg|powertop}}}} |
* {{App|[[powertop]]|消費電力や電源管理の問題を診断して省電力設定を補助するツール。|https://01.org/powertop/|{{Pkg|powertop}}}} |
||
+ | * [[systemd]] |
||
− | * {{App|[[TLP]]|Linux 向けの先進的な電源管理。|http://linrunner.de/en/tlp/docs/tlp-linux-advanced-power-management.html|{{Pkg|tlp}}}} |
||
+ | * {{App|[[TLP]]|Linux 向けの先進的な電源管理。|http://linrunner.de/tlp|{{Pkg|tlp}}}} |
||
== systemd による電源管理 == |
== systemd による電源管理 == |
||
44行目: | 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}}: パワーキーが押された時に行う動作を定めます。 |
||
64行目: | 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]] と [[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}} を使うことで問題が解決します。 |
||
=== サスペンドとハイバネート === |
=== サスペンドとハイバネート === |
||
72行目: | 81行目: | ||
''systemd'' はカーネルに入っているサスペンド・レジューム機能を使ってサスペンド (suspend to RAM)・ハイバネート・ハイブリッドサスペンドを行うコマンドを提供しています。また、サスペンドの前後の行動をカスタマイズするフックを追加する仕組みも存在します。 |
''systemd'' はカーネルに入っているサスペンド・レジューム機能を使ってサスペンド (suspend to RAM)・ハイバネート・ハイブリッドサスペンドを行うコマンドを提供しています。また、サスペンドの前後の行動をカスタマイズするフックを追加する仕組みも存在します。 |
||
− | {{Note|''systemd'' はデフォルトの''カーネル''バックエンドに加えて、他のサスペンドバックエンド ([[Uswsusp |
+ | {{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 はマシンをスリープ状態にするのに [[pm-utils]] を使いません; [[Pm-utils#Creating_your_own_hooks|カスタムフック]]を含む、[[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}} のマニュアルページを読んでください。 |
||
+ | |||
+ | === スリープフック === |
||
===== サスペンド/リジューム サービスファイル ===== |
===== サスペンド/リジューム サービスファイル ===== |
||
95行目: | 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] |
||
112行目: | 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}} で有効にしてください): |
||
139行目: | 173行目: | ||
WantedBy=sleep.target</nowiki>}} |
WantedBy=sleep.target</nowiki>}} |
||
− | サービスファイルについてのヒント (詳しくは {{ |
+ | サービスファイルについてのヒント (詳しくは {{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以外でも)無視され、コマンドは成功したとして扱われます。 |
||
169行目: | 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}}。呼び出されるものによる。 |
||
− | + | 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]] を使って下さい: |
||
199行目: | 271行目: | ||
# chmod a+x /usr/lib/systemd/system-sleep/example.sh |
# chmod a+x /usr/lib/systemd/system-sleep/example.sh |
||
− | 詳しくは {{ |
+ | 詳しくは {{man|7|systemd.special}} や {{man|8|systemd-sleep}} を見てください。 |
== 省電力設定 == |
== 省電力設定 == |
||
221行目: | 293行目: | ||
options snd_ac97_codec power_save=1 |
options snd_ac97_codec power_save=1 |
||
+ | {{Note| |
||
− | {{Note|サウンドカードの電源状態を変更すると壊れたハードウェアでポップノイズがまじったり著しい遅延が発生することがあります。}} |
||
+ | * サウンドカードの製造者や使われているカーネルドライバーの情報を取得するには、{{ic|lspci -k}} を実行してください。 |
||
+ | * サウンドカードの電源状態を変更すると壊れたハードウェアでポップノイズがまじったり著しい遅延が発生することがあります。 |
||
+ | }} |
||
+ | |||
+ | HDMI の音声出力を無効化することで消費電力を下げることもできます。適切なカーネルモジュールを[[ブラックリスト]]に追加してください (例: {{ic|snd_hda_codec_hdmi}})。 |
||
=== バックライト === |
=== バックライト === |
||
231行目: | 308行目: | ||
[[Bluetooth]] を完全に無効化するには、{{ic|btusb}} と {{ic|bluetooth}} モジュールを[[カーネルモジュール#ブラックリスト|ブラックリスト]]に入れてください。 |
[[Bluetooth]] を完全に無効化するには、{{ic|btusb}} と {{ic|bluetooth}} モジュールを[[カーネルモジュール#ブラックリスト|ブラックリスト]]に入れてください。 |
||
− | 一時的にだけ bluetooth をオフにするには、 |
+ | 一時的にだけ bluetooth をオフにするには、''rfkill'' を使用します: |
# rfkill block bluetooth |
# rfkill block bluetooth |
||
241行目: | 318行目: | ||
SUBSYSTEM=="rfkill", ATTR{type}=="bluetooth", ATTR{state}="0" |
SUBSYSTEM=="rfkill", ATTR{type}=="bluetooth", ATTR{state}="0" |
||
</nowiki>}} |
</nowiki>}} |
||
− | |||
− | または {{Pkg|rfkill}} パッケージに入っている {{ic|rfkill-block@bluetooth.service}} を[[systemd#ユニットを使う|有効化]]してください。 |
||
=== ウェブカメラ === |
=== ウェブカメラ === |
||
250行目: | 325行目: | ||
=== カーネルパラメータ === |
=== カーネルパラメータ === |
||
− | このセクションでは {{ic|/etc/sysctl.d/}} の設定を使います。このディレクトリはカーネルの sysctl パラメータと対応するディレクトリです。詳しくは [http://0pointer.de/blog/projects/the-new-configuration-files The New Configuration Files] や、より正確な |
+ | このセクションでは {{ic|/etc/sysctl.d/}} の設定を使います。このディレクトリはカーネルの sysctl パラメータと対応するディレクトリです。詳しくは [http://0pointer.de/blog/projects/the-new-configuration-files The New Configuration Files] や、より正確な {{man|5|sysctl.d}} を見てください。 |
==== NMI watchdog の無効化 ==== |
==== NMI watchdog の無効化 ==== |
||
288行目: | 363行目: | ||
上記の例では、{{ic|%k}} がマッチするデバイスのカーネル名を示します。例えば、ルールが {{ic|wlan0}} に適用可能とわかった場合、{{ic|%k}} は {{ic|wlan0}} に置き換えられます。特定のインターフェイスにだけルールを適用するには、パターン {{ic|eth*}} と修飾子 {{ic|%k}} を適当なインターフェイスの名前に置き換えて下さい。詳しくは、[http://www.reactivated.net/writing_udev_rules.html Writing udev rules] を参照。 |
上記の例では、{{ic|%k}} がマッチするデバイスのカーネル名を示します。例えば、ルールが {{ic|wlan0}} に適用可能とわかった場合、{{ic|%k}} は {{ic|wlan0}} に置き換えられます。特定のインターフェイスにだけルールを適用するには、パターン {{ic|eth*}} と修飾子 {{ic|%k}} を適当なインターフェイスの名前に置き換えて下さい。詳しくは、[http://www.reactivated.net/writing_udev_rules.html Writing udev rules] を参照。 |
||
− | ここで、設定ファイルの名前は重要です。systemd v197 から {{ic|80-net- |
+ | {{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 |
||
+ | |||
+ | 上記の省電力オプションは実験的であり、システムが不安定になる可能性があります。 |
||
=== バスパワーの管理 === |
=== バスパワーの管理 === |
||
298行目: | 382行目: | ||
$ lspci -vv | grep ASPM.*abled\; |
$ lspci -vv | grep ASPM.*abled\; |
||
− | ASPM は BIOS によって扱われるため、ASPM が無効化される理由は以下の通りです [ |
+ | ASPM は BIOS によって扱われるため、ASPM が無効化される理由は以下の通りです [https://wireless.kernel.org/en/users/Documentation/ASPM]: |
# BIOS が何らかの理由で ASPM を無効化した (コンフリクトが起こるから?)。 |
# BIOS が何らかの理由で ASPM を無効化した (コンフリクトが起こるから?)。 |
||
382行目: | 466行目: | ||
==== SATA Active Link Power Management ==== |
==== SATA Active Link Power Management ==== |
||
+ | {{Note|以下の設定を行うとアイドル状態になっているドライブにアクセスするときに遅延が発生するようになります。AC 電源を使用するかどうかによって変えるべき設定です。}} |
||
− | {{Note|This adds latency when accessing a drive that has been idle, so it is one of the few settings that may be worth toggling based on whether you are on AC power.}} |
||
{{hc|/etc/udev/rules.d/hd_power_save.rules|2=ACTION=="add", SUBSYSTEM=="scsi_host", KERNEL=="host*", ATTR{link_power_management_policy}="min_power"}} |
{{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 T440s はこの問題を抱えていることが[http://lkml.indiana.edu/hypermail/linux/kernel/1401.2/02171.html 知られています] |
+ | {{Warning|デバイスによっては SATA Active Link Power Management でデータが消失する可能性があります (例: [[Lenovo ThinkPad T440s|Lenovo T440s]] はこの問題を抱えていることが[http://lkml.indiana.edu/hypermail/linux/kernel/1401.2/02171.html 知られています])。バックアップを取っていない場合は設定を有効にしないでください。}} |
=== ハードディスクドライブ === |
=== ハードディスクドライブ === |
||
439行目: | 523行目: | ||
{{Note|あなたのノートパソコンでは AC0 が異なっている可能性があります。その場合は変更してください。}} |
{{Note|あなたのノートパソコンでは AC0 が異なっている可能性があります。その場合は変更してください。}} |
||
− | |||
− | これで pm-utils はもう必要なくなりました。設定によっては、他のパッケージの依存パッケージになっている可能性はあります。それでも削除したい場合は、{{ic|pacman -Rdd pm-utils}} を実行してください。 |
||
=== 電源設定の表示 === |
=== 電源設定の表示 === |
||
473行目: | 555行目: | ||
done |
done |
||
</nowiki>}} |
</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] |
||
− | * [https://wiki.ubuntu.com/Kernel/PowerManagement/PowerSavingTweaks Ubuntu Wiki's Power Saving Tweaks] |
2019年6月29日 (土) 22:51時点における版
関連記事
電源管理とはシステムが使われていない場合に電力の供給を切ったり低電力状態にする機能のことです。このページでは Arch Linux における電源管理の全体的な外観を説明します。
ハードウェアの電源管理の設定を直接変更するときはカーネルの設定を使います:
また、カーネルと対話してイベントを処理する電源管理ツールが多数あります: #ユーザースペースツール を参照。
目次
ユーザースペースツール
以下のツールを使うことで手動で多数の設定を行うかわりになります。どのツールも多かれ少なかれ同じような動作をするので、衝突をさけるためにツールはどれか一つだけを実行してください。電源管理カテゴリを見ることで Arch Linux にどんな電源管理の選択肢が存在するかわかります。
以下は省電力設定をするために作られた人気のあるスクリプトやツールです:
- acpid — ACPI の電源管理イベントを届けるデーモン。netlink をサポート。
- Laptop Mode Tools — ノートパソコンの省電力設定をするユーティリティ。多少設定が要りますが省電力設定ユーティリティのデファクトスタンダードとされています。
- powertop — 消費電力や電源管理の問題を診断して省電力設定を補助するツール。
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
。
グラフィカルセットアップを走らせていなかったり i3 や awesome などシンプルなウィンドウマネージャしか使っていないシステムでは、これで ACPI イベントに反応するものとして使っている acpid デーモンを置き換えることが可能です。
電源マネージャ
デスクトップ環境には電源マネージャが含まれていることがあります。現在のバージョンの 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-lock は DPMS イベントにも反応します。
xss-lock を自動起動するときは以下のようなコマンドを使います:
xss-lock -- i3lock -n -i background_image.png &
xss-lock によってサスペンド時に CPU 消費率が 100% になる場合、commit 1e158f にあるように xss-lock-gitAUR を使うことで問題が解決します。
サスペンドとハイバネート
systemd はカーネルに入っているサスペンド・レジューム機能を使ってサスペンド (suspend to RAM)・ハイバネート・ハイブリッドサスペンドを行うコマンドを提供しています。また、サスペンドの前後の行動をカスタマイズするフックを追加する仕組みも存在します。
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
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
Before
と Conflicts
オプションはハイバネートでは動作させないようにするために必要です。そうしないと遅延ハイバネーションが実行されたときにサービスが2回実行されてしまいます。WantedBy
と StopWhenUnneeded
オプションはスリープの前に実行して復帰時に停止するように設定しています。サービスを有効化してください。
/usr/lib/systemd/system-sleep のフック
Systemd は /usr/lib/systemd/system-sleep/
内の全ての実行可能ファイルを実行するときに、2つの引数を渡します:
- 引数 1:
pre
かpost
。マシンが停止するときと起動するとき。 - 引数 2:
suspend
かhibernate
かhybrid-sleep
。呼び出されるものによる。
systemd はスクリプトを(ひとつずつではなく)同時に実行します。
カスタムスクリプトの出力は systemd-suspend.service
, systemd-hibernate.service
, systemd-hybrid-sleep.service
によって記録されます。出力を見るには systemd の journal を使って下さい:
# journalctl -b -u systemd-suspend
カスタムスリープスクリプトの例:
/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 ルールなどを使ってスクリプトや省電力設定を自分で作成したい場合は以下の設定を参考にすることができます。
オーディオ
デフォルトでは、オーディオの省電力機能はほとんどのドライバーで無効になっています。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
HDMI の音声出力を無効化することで消費電力を下げることもできます。適切なカーネルモジュールをブラックリストに追加してください (例: snd_hda_codec_hdmi
)。
バックライト
バックライトを見て下さい。
Bluetooth
Bluetooth を完全に無効化するには、btusb
と bluetooth
モジュールをブラックリストに入れてください。
一時的にだけ 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
に適用可能とわかった場合、%k
は wlan0
に置き換えられます。特定のインターフェイスにだけルールを適用するには、パターン eth*
と修飾子 %k
を適当なインターフェイスの名前に置き換えて下さい。詳しくは、Writing udev 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]:
- BIOS が何らかの理由で ASPM を無効化した (コンフリクトが起こるから?)。
- PCIE が L0s 以外の ASPM を必要とする (L0s は無効化され L1 だけが有効化される)。
- ASPM について BIOS がプログラムされていない。
- BIOS にバグが存在する。
コンピュータが ASPM をサポートしていると信じられる場合は、pcie_aspm=force
カーネルパラメータを使うことで強制的にオンにすることができます。
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
/etc/udev/rules.d/hd_power_save.rules
ACTION=="add", SUBSYSTEM=="scsi_host", KERNEL=="host*", ATTR{link_power_management_policy}="min_power"
ハードディスクドライブ
設定できるドライブのパラメータについては hdparm を見て下さい。
多数のプログラムがディスクに頻繁に書き込みをおこなう場合は省電力は効率的ではありません。全てのプログラムを調査して、いつどのようにプログラムがディスクに書き込むを行うのか調べるのがディスクの使用量を減らす道です。iotop を使えばどのプログラムがディスクに頻繁に書き込みしているかわかります。他のヒントはソリッドステートドライブ#SSD の読み書きを最小化するヒントを見て下さい、ほとんどのヒントは SSD に限ったものではありません。
noatime オプションを設定するなどの小さなことも馬鹿にできません。十分な RAM がある場合、swappiness を無効化したり制限することでディスクへの書き込みが減る可能性があります。
CD/DVD のスピンダウン
udisks を使用してしばらくしてから CD/DVD ロムをスピンダウンさせるには:
# udisks --inhibit-polling /dev/sr0
ツールとスクリプト
スクリプトと udev ルールを使う
systemd ユーザーは systemctl suspend
や systemctl hibernate
でサスペンドとハイバネートを行うことができ、/etc/systemd/logind.conf
で acpi イベントを処理することができるので、pm-utils と acpid を削除するということに興味を引かれるかもしれません。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"
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
忘れずに実行可能属性を付与してください。
電源設定の表示
以下のスクリプトは 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
と表示されるようになるはずです。