コンテンツにスキップ

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

提供: ArchWiki
削除された内容 追加された内容
AshMyzk (トーク | 投稿記録)
同期
Oech3 (トーク | 投稿記録)
同期:マウスとキーボード以外のUSB デバイスUSB の自動サスペンド
 
(2人の利用者による、間の6版が非表示)
8行目: 8行目:
{{Related|電源管理/サスペンドとハイバネート}}
{{Related|電源管理/サスペンドとハイバネート}}
{{Related|電源管理/復帰トリガー}}
{{Related|電源管理/復帰トリガー}}
{{Related|Display Power Management Signaling}}
{{Related|CPU 周波数スケーリング}}
{{Related|CPU 周波数スケーリング}}
{{Related|Display Power Management Signaling}}
{{Related|ハイブリッドグラフィック}}
{{Related|ハイブリッドグラフィック}}
{{Related|カーネルモジュール}}
{{Related|sysctl}}
{{Related|sysctl}}
{{Related|udev}}
{{Related articles end}}
{{Related articles end}}
[[Wikipedia:Power management|電源管理]]とは、アクティブでない時に電源を切ったりシステムのコンポーネントを低電力状態に切り替えたりする機能です。
[[Wikipedia:Power management|電源管理]]とは、アクティブでない時に電源を切ったりシステムのコンポーネントを低電力状態に切り替えたりする機能です。
19行目: 17行目:
Arch Linux では、電源管理は主に2つの部分からなります:
Arch Linux では、電源管理は主に2つの部分からなります:


# Linux カーネルの設定。ハードウェアと対話します。
# Linux [[カーネル]]の設定。ハードウェアと対話します。
#* [[カーネルパラメータ]]
#* [[カーネルパラメータ]]
#* [[カーネルモジュール]]
#* [[カーネルモジュール]]
27行目: 25行目:
== ユーザースペースツール ==
== ユーザースペースツール ==


以下のツールを使うことで、大量の設定を手動で設定しなくて済みます。どのツールも多かれ少なかれ同じような動作をするので、衝突を避けるためにツールはどれか'''一つだけ'''を実行してください。[[:Category:電源管理|電源管理カテゴリ]]を見れば、Arch Linux にどんな電源管理の選択肢が存在するかわかります。
以下のツールを使うことで、設定ファイルを手動で編集せずに多くの設定を変更できます。どのツールも多かれ少なかれ同じような動作をするので、衝突を避けるためにツールはどれか'''一つだけ'''を実行してください。[[:Category:電源管理|電源管理カテゴリ]]を見れば、Arch Linux にどんな電源管理の選択肢が存在するかわかります。


以下は省電力設定をするために作られた人気のあるスクリプトやツールです:
以下は省電力設定をするために作られた人気のあるスクリプトやツールです:
37行目: 35行目:
* {{App|libsmbios|Dell SMBIOS テーブルと対話するためのライブラリおよびツール。|https://github.com/dell/libsmbios|{{Pkg|libsmbios}}}}
* {{App|libsmbios|Dell SMBIOS テーブルと対話するためのライブラリおよびツール。|https://github.com/dell/libsmbios|{{Pkg|libsmbios}}}}
* {{App|[[powertop]]|消費電力や電源管理の問題を診断して省電力設定を補助するツール。|https://github.com/fenrus75/powertop|{{Pkg|powertop}}}}
* {{App|[[powertop]]|消費電力や電源管理の問題を診断して省電力設定を補助するツール。|https://github.com/fenrus75/powertop|{{Pkg|powertop}}}}
* {{App|powerstat|ACPI や Intel RAPL インターフェイスを使用して電力消費量を測定するツール。|https://github.com/ColinIanKing/powerstat|{{AUR|powerstat}}}}
* {{App|[[systemd]]|システムおよびサービスマネージャ。|https://freedesktop.org/wiki/Software/systemd/|{{Pkg|systemd}}}}
* {{App|[[systemd]]|システムおよびサービスマネージャ。|https://systemd.io/|{{Pkg|systemd}}}}
* {{App|[[TLP]]|Linux 向けの先進的な電源管理。|https://linrunner.de/tlp|{{Pkg|tlp}}}}
* {{App|[[TLP]]|Linux 向けの先進的な電源管理。|https://linrunner.de/tlp|{{Pkg|tlp}}}}
* {{App|TuneD|システム上のデバイスの監視と状況に応じた設定を行うデーモン。|https://tuned-project.org|{{Pkg|tuned}}}}
* {{App|[[Wikipedia:UPower|UPower]]|電源デバイスの列挙、デバイスイベントの監視、履歴と統計のクエリを行う抽象化レイヤー。|https://upower.freedesktop.org|{{Pkg|upower}}}}
* {{App|[[power-profiles-daemon]]|D-Bus 経由での電源プロファイルの管理を可能にします。|https://gitlab.freedesktop.org/upower/power-profiles-daemon|{{Pkg|power-profiles-daemon}}}}


=== グラフィカル ===
=== グラフィカル ===


* {{App|batsignal|libnotify を使用してバッテリレベルの低下を警告する軽量バッテリモニタ。|https://github.com/electrickite/batsignal|{{AUR|batsignal}}}}
* {{App|batsignal|libnotify を使用してバッテリレベルの低下を警告する軽量バッテリモニタ。|https://github.com/electrickite/batsignal|{{Pkg|batsignal}}}}
* {{App|cbatticon|軽量で高速なバッテリアイコンをシステムトレイに表示。|https://github.com/valr/cbatticon|{{Pkg|cbatticon}}}}
* {{App|cbatticon|軽量で高速なバッテリアイコンをシステムトレイに表示。|https://github.com/valr/cbatticon|{{Pkg|cbatticon}}}}
* {{App|GNOME Power Statistics|GNOME のシステム電力情報および統計。|https://gitlab.gnome.org/GNOME/gnome-power-manager|{{Pkg|gnome-power-manager}}}}
* {{App|GNOME Power Statistics|GNOME のシステム電力情報および統計。|https://gitlab.gnome.org/GNOME/gnome-power-manager|{{Pkg|gnome-power-manager}}}}
54行目: 56行目:
* {{App|vattery|システムトレイ内のラップトップバッテリのステータスを表示する、 Vala で書かれたバッテリ監視アプリケーション。|https://www.jezra.net/projects/vattery.html|{{AUR|vattery}}}}
* {{App|vattery|システムトレイ内のラップトップバッテリのステータスを表示する、 Vala で書かれたバッテリ監視アプリケーション。|https://www.jezra.net/projects/vattery.html|{{AUR|vattery}}}}


== 電源管理 ==
== ACPI イベント ==

=== ACPI イベント ===


''systemd'' は一部の電源関連の [[Wikipedia:ja:Advanced Configuration and Power Interface|ACPI]] イベントを処理します。これらのイベントの動作は {{ic|/etc/systemd/logind.conf}} や {{ic|/etc/systemd/logind.conf.d/*.conf}} で設定できます ({{man|5|logind.conf}} を参照)。専用の電源マネージャを持たないシステムでは、この方法は [[acpid]] デーモンの代わりになりえます。ちなみに、[[acpid]] は通常、ACPI イベントに対応するために使われるデーモンです。
''systemd'' は一部の電源関連の [[Wikipedia:ja:Advanced Configuration and Power Interface|ACPI]] イベントを処理します。これらのイベントの動作は {{ic|/etc/systemd/logind.conf}} や {{ic|/etc/systemd/logind.conf.d/*.conf}} で設定できます ({{man|5|logind.conf}} を参照)。専用の電源マネージャを持たないシステムでは、この方法は [[acpid]] デーモンの代わりになりえます。ちなみに、[[acpid]] は通常、ACPI イベントに対応するために使われるデーモンです。
94行目: 94行目:
変更を適用するには、{{ic|systemd-logind.service}} を[[リロード|再読み込み]]してください。
変更を適用するには、{{ic|systemd-logind.service}} を[[リロード|再読み込み]]してください。


{{Note|
{{Note|''systemd'' は AC とバッテリの ACPI イベントを処理することができません。なので、[[Laptop Mode Tools]] や他の似たようなツールを使用している場合、[[acpid]] が依然として必要です。}}
* ''systemd'' は AC とバッテリの ACPI イベントを処理することができません。なので、[[Laptop Mode Tools]] や他の似たようなツールを使用している場合、[[acpid]] が依然として必要です。
* 蓋のスイッチを短い間隔で動作させると、''logind'' は、ドックが存在するかどうかを検出するために 90 秒までサスペンドアクションを遅らせます。[https://lists.freedesktop.org/archives/systemd-devel/2015-January/027131.html] この遅延は systemd v220 で設定可能になりました。[https://github.com/systemd/systemd/commit/9d10cbee89ca7f82d29b9cb27bef11e23e3803ba] {{ic|logind.conf}} か、このファイルのドロップインファイルで {{ic|1=HoldoffTimeoutSec=30s}} のように設定できます。
}}


==== 電源マネージャ ====
=== 電源マネージャ ===


一部の[[デスクトップ環境]]には、''systemd'' の ACPI 設定の一部あるいは全てを [https://www.freedesktop.org/wiki/Software/systemd/inhibit/ inhibit] する (一時的にオフにする) 電源マネージャが含まれています。そのような電源マネージャが実行されている場合、電源マネージャだけで ACPI イベントに対する動作を設定することができます。{{ic|/etc/systemd/logind.conf}} や {{ic|/etc/systemd/logind.conf.d/*.conf}} を変更する必要があるのは、電源マネージャによって inhibit されていないイベントに対する挙動を設定したい場合のみです。
一部の[[デスクトップ環境]]には、''systemd'' の ACPI 設定の一部あるいは全てを [https://systemd.io/INHIBITOR_LOCKS/ inhibit] する (一時的にオフにする) 電源マネージャが含まれています。そのような電源マネージャが実行されている場合、電源マネージャだけで ACPI イベントに対する動作を設定することができます。{{ic|/etc/systemd/logind.conf}} や {{ic|/etc/systemd/logind.conf.d/*.conf}} を変更する必要があるのは、電源マネージャによって inhibit されていないイベントに対する挙動を設定したい場合のみです。


注意点として、電源マネージャが適切なイベントに対して ''systemd'' を inhibit しないと、''systemd'' がシステムをサスペンドし、その後サスペンドから復帰すると今度は電源マネージャがシステムを再びサスペンドしてしまうという状況に陥る可能性があります。[[KDE]]、[[GNOME]]、[[Xfce]]、そして [[MATE]] の電源マネージャは、必要な ''inhibited'' コマンドを発行します。''inhibited'' コマンドが発行されない場合 ([[acpid]] などを使って ACPI イベントを処理している場合)、{{ic|Handle}} オプションを {{ic|ignore}} に設定してください。{{man|1|systemd-inhibit}} も参照してください。
注意点として、電源マネージャが適切なイベントに対して ''systemd'' を inhibit しないと、''systemd'' がシステムをサスペンドし、その後サスペンドから復帰すると今度は電源マネージャがシステムを再びサスペンドしてしまうという状況に陥る可能性があります。[[GNOME]]、[[MATE]]、[[Plasma]]、そして [[Xfce]] の電源マネージャは、必要な ''inhibited'' コマンドを発行します。''inhibited'' コマンドが発行されない場合 ([[acpid]] などを使って ACPI イベントを処理している場合)、{{ic|Handle}} オプションを {{ic|ignore}} に設定してください。{{man|1|systemd-inhibit}} も参照してください。


==== xss-lock ====
=== xss-lock ===


{{pkg|xss-lock}} は systemd の {{ic|suspend}}、{{ic|hibernate}}、{{ic|lock-session}}、{{ic|unlock-session}} イベントで適切なアクションを実行します (ロッカーを実行し、ユーザがロッカーをアンロックまたは kill するまで待機する)。''xss-lock'' は [[DPMS]] イベントにも反応し、それに応じてロッカーを実行したり kill したりします。
{{pkg|xss-lock}} は systemd の {{ic|suspend}}、{{ic|hibernate}}、{{ic|lock-session}}、{{ic|unlock-session}} イベントで適切なアクションを実行します (ロッカーを実行し、ユーザがロッカーをアンロックまたは kill するまで待機する)。''xss-lock'' は [[DPMS]] イベントにも反応し、それに応じてロッカーを実行したり kill したりします。
109行目: 112行目:


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

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

''systemd'' は、カーネルのネイティブなサスペンド/レジューム機能を使用して、サスペンド (suspend to RAM) を行うコマンドや、ハイバネートを行うコマンドを提供しています。また、サスペンド前や後の動作をカスタマイズするためのフックを追加する機構も存在しています。

{{ic|systemctl suspend}} は何も設定しなくても動くはずですが、あなたの環境で {{ic|systemctl hibernate}} を使うには [[電源管理/サスペンドとハイバネート#ハイバネーション]] の指示に従う必要があります。

また、サスペンドとハイバネートを組み合わせたモードが 2 つ存在します:

* {{ic|systemctl hybrid-sleep}} は、システムを RAM とディスクの両方にサスペンドします。なので、電源が完全に失われても、データ損失が発生しません。このモードは [[電源管理/サスペンドとハイバネート|suspend to both]] とも呼ばれています。
* {{ic|systemctl suspend-then-hibernate}} は、最初は可能な限り長くシステムを RAM にサスペンドし、RTC アラームで復帰し、そしてハイバネートします。RTC アラームは {{man|5|systemd-sleep.conf}} 内の {{ic|HibernateDelaySec}} で設定します。デフォルトの値は、システムのバッテリーレベルが 5% に下がるまでの推定された時間に設定されます。システムにバッテリーが存在しない場合は、デフォルトで2時間に設定されます。推定時間は、{{man|5|systemd-sleep.conf}} 内の {{ic|SuspendEstimationSec}} によって指定された時間後のバッテリーレベルの変化から計算されます。{{ic|SuspendEstimationSec}} の時間後、システムは短い間サスペンドから復帰し、計測を行います (システムが手動でサスペンドから復帰された場合も、計測が行われます)。

==== サスペンドを無効化する ====

デバイスをサーバなどとして使用している場合、サスペンドは必要ないかもしれませんし、かえって望ましくない可能性もあります。
任意のスリープ状態を設定することができます:

{{hc|/etc/systemd/sleep.conf.d/disable-suspend.conf|2=
[Sleep]
AllowSuspend=no
AllowHibernation=no
AllowSuspendThenHibernate=no
AllowHybridSleep=no
}}

=== スリープフック ===

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

サービスファイルを ''suspend.target''、''hibernate.target''、''sleep.target''、''hybrid-sleep.target''、そして ''suspend-then-hibernate.target'' にフックすることで、サスペンド/ハイバネート前や後に行うアクションを設定できます。ユーザのアクションと root/システムのアクションを設定するには、別々のファイルを作成する必要があります。{{ic|suspend@''user''}} と {{ic|resume@''user''}} サービスを[[有効化]]してこれらをブート時に起動させてください。例:

{{hc|/etc/systemd/system/suspend@.service|2=
[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
ExecStart=/usr/bin/sflock
ExecStartPost=/usr/bin/sleep 1

[Install]
WantedBy=sleep.target
}}

{{hc|/etc/systemd/system/resume@.service|2=
[Unit]
Description=User resume actions
After=suspend.target

[Service]
User=%I
Type=simple
ExecStart=/usr/local/bin/ssh-connect.sh

[Install]
WantedBy=suspend.target
}}

{{Note|スクリーンが"ロックされる"前にスクリーンロックが返ってきてしまい、サスペンドから復帰するときに画面が点滅することがあります。{{ic|1=ExecStartPost=/usr/bin/sleep 1}} で小さな遅延を追加することでこれを防止できます。}}

root/システムのアクションの場合 ({{ic|root-resume}} と {{ic|root-suspend}} を[[有効化]]してこれらをブート時に起動させてください):

{{hc|/etc/systemd/system/root-suspend.service|2=
[Unit]
Description=Local system suspend actions
Before=sleep.target

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

[Install]
WantedBy=sleep.target
}}

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

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

[Install]
WantedBy=suspend.target
}}

{{Tip|サービスファイルについてのヒント (詳しくは {{man|5|systemd.service}}):
* {{ic|1=Type=oneshot}} の場合、複数の {{ic|1=ExecStart=}} 行を使うことができます。それ以外の場合は使える {{ic|ExecStart}} は一行だけです。{{ic|ExecStartPre}} を使ったりコマンドをセミコロンで分割することでコマンドを追加することができます (最初の例を見て下さい -- セミコロンの前後にはスペースが''必要''です)。
* コマンドの前に {{ic|-}} を付けると、0以外の終了ステータスは無視され、コマンドは成功したとして扱われます。
* サービスファイルのトラブルシューティングのときにエラーを見つけるには [[journalctl]] を使うのがベストです。
}}

==== サスペンド/レジュームのサービスファイルの統合 ====

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

例と説明:

{{hc|/etc/systemd/system/wicd-sleep.service|2=
[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
}}

* {{ic|1=RemainAfterExit=yes}}: 起動後、明示的に止められるまでサービスは常時 active とみなされます。
* {{ic|1=StopWhenUnneeded=yes}}: active 時、他のサービスから必要とされなくなった場合、サービスは停止されます。この例では、''sleep.target'' が停止されるとこのサービスは停止されます。
* ''sleep.target'' は ''suspend.target''、''hibernate.target''、''hybrid-sleep.target'' から呼ばれ、''sleep.target'' 自身は ''StopWhenUnneeded'' サービスなので、タスクごとにフックが正しく起動・停止することが保証されています。

===== 汎用のサービステンプレート =====

この例では、既存の systemd サービスを電源イベントにフックさせるために使用できる[https://0pointer.net/blog/projects/instances.html テンプレートサービス]を作ります:[https://narkive.com/mYzxSIDN.6]

{{hc|/etc/systemd/system/sleep@.service|2=
[Unit]
Description=%I sleep hook
Before=sleep.target
StopWhenUnneeded=yes

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=-/usr/bin/systemctl stop %i
ExecStop=-/usr/bin/systemctl start %i

[Install]
WantedBy=sleep.target
}}

次に、{{ic|@}} の後に既存の systemd サービスの basename を指定して、このテンプレートのインスタンスを[[有効化]]してください (つまり、{{ic|sleep@'''''service-file-basename'''''.service}})。テンプレートに関する詳細は {{man|5|systemd.unit|DESCRIPTION}} を参照してください。

{{Tip|テンプレートは systemd サービスに限らず、他のプログラムと一緒に使うこともできます。例は [https://fedoramagazine.org/systemd-template-unit-files/] を見てください。}}

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

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

* 引数 1: {{ic|pre}} か {{ic|post}}。マシンがスリープしようとしているのか、復帰しようとしているのかによります。
* 引数 2: {{ic|suspend}} か {{ic|hibernate}} か {{ic|hybrid-sleep}}。どれが行われようとしているのかによります。

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

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

# journalctl -b -u systemd-suspend.service

{{Note|カスタムスクリプトを使うかわりに ''sleep.target''、''suspend.target''、''hibernate.target''、''hybrid-sleep.target'' を使ってユニットをスリープステートロジックにフックさせることもできます。}}

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

{{hc|/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
}}

スクリプトを[[実行可能属性|実行可能]]にするのを忘れないで下さい。

詳しくは {{man|7|systemd.special}} や {{man|8|systemd-sleep}} を見てください。

=== トラブルシューティング ===

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

短期間に連続してフタのスイッチが反応した場合、''logind'' はドッキングを検出するために90秒までサスペンドを遅延します。[https://lists.freedesktop.org/archives/systemd-devel/2015-January/027131.html] この遅延時間は systemd v220 から設定できるようになりました:[https://github.com/systemd/systemd/commit/9d10cbee89ca7f82d29b9cb27bef11e23e3803ba]

{{hc|/etc/systemd/logind.conf|2=
...
HoldoffTimeoutSec=30s
...
}}

==== ノートパソコンをサスペンドする 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)

キーボードデバイスが出力に無いことに注意してください。以下のようにして、キーボードデバイスを一覧表示してみてください:

{{hc|$ stat -c%N /dev/input/by-id/*-kbd|2=
...
/dev/input/by-id/usb-SIGMACHIP_USB_Keyboard-event-kbd -> '''../event6'''
...
}}

次に、親キーボードデバイスの {{ic|ATTRS{name}<nowiki/>}} の値を調べます [https://systemd-devel.freedesktop.narkive.com/Rbi3rjNN/patch-1-2-logind-add-support-for-tps65217-power-button]。例えば、上記のコマンドの出力から、このキーボードデバイスのデバイス入力イベントは {{ic|'''event6'''}} であることがわかるので、このイベント名を使って {{ic|ATTRS{name}<nowiki/>}} 属性の値を検索することができます:

{{hc|# udevadm info -a /dev/input/'''event6'''|2=
...
KERNEL=="event6"
...
ATTRS{name}=="SIGMACHIP USB Keyboard"
}}

カスタムの udev ルールを作成して、"power-switch" タグを追加してください:

{{hc|/etc/udev/rules.d/70-power-switch-my.rules|2=
ACTION=="remove", GOTO="power_switch_my_end"
SUBSYSTEM=="input", KERNEL=="event*", ATTRS{name}=="SIGMACHIP USB Keyboard", TAG+="power-switch"
LABEL="power_switch_my_end"
}}

{{ic|systemd-udevd.service}} を[[再起動]]し、{{ic|udevadm trigger}} を root として実行してルールを再読み込みし、そして {{ic|systemd-logind.service}} を[[再起動]]してください。

これで、syslog に {{ic|Watching system buttons on /dev/input/event6}} と表示されるようになるはずです。

==== A520I および B550I マザーボードで PC がスリープから復帰しない ====

A520i および B550i チップセットを搭載した一部のマザーボードでは、システムが完全にスリープ状態に入らない、またはスリープ状態から復帰しないことがあります。症状は、システムがスリープ状態に入り、マザーボード上の内部 LED または電源 LED が点灯したまま、モニターの電源が切れるというものです。その後、システムはこの状態から復帰することができず、ハードパワーオフが必要となります。AMD で同様の問題が発生した場合、まずシステムが完全にアップデートされていることを確認し、AMD [[マイクロコード]] パッケージがインストールされているかどうかをチェックしてください。

{{ic|GPP0}} で始まる行のステータスが有効になっていることを確認します:

{{hc|$ cat /proc/acpi/wakeup|
Device S-state Status Sysfs node
GP12 S4 *enabled pci:0000:00:07.1
GP13 S4 *enabled pci:0000:00:08.1
XHC0 S4 *enabled pci:0000:0b:00.3
GP30 S4 *disabled
GP31 S4 *disabled
PS2K S3 *disabled
'''GPP0''' S4 '''*enabled''' pci:0000:00:01.1
GPP8 S4 *enabled pci:0000:00:03.1
PTXH S4 *enabled pci:0000:05:00.0
PT20 S4 *disabled
PT24 S4 *disabled
PT26 S4 *disabled
PT27 S4 *disabled
PT28 S4 *enabled pci:0000:06:08.0
PT29 S4 *enabled pci:0000:06:09.0
}}

これが有効になっている場合は、次のコマンドを実行できます:

# echo GPP0 > /proc/acpi/wakeup

{{ic|systemctl suspend}} を実行してテストし、システムをスリープ状態にします。次に、数秒後にシステムを起動してみてください。うまくいく場合は、回避策を永続的にすることができます。systemd [[systemd#ユニットファイル|ユニットファイル]]を[[作成]]します。:

{{hc|/etc/systemd/system/toggle-gpp0-to-fix-wakeup.service|2=
[Unit]
Description="Disable GPP0 to fix suspend issue"

[Service]
ExecStart=/bin/sh -c "/bin/echo GPP0 > /proc/acpi/wakeup"

[Install]
WantedBy=multi-user.target
}}

[[daemon-reload]] するか、新しく作成したユニットを[[起動/有効化]]してください。

あるいは、[[udev]] ルールを作成することもできます。先の例のように {{ic|GPP0}} の sysfs ノードが {{ic|pci:0000:00:01.1}} である場合、関連する情報は {{ic|udevadm info -a -p /sys/bus/pci/devices/0000\:00\:01.1}} を実行することで得られ、以下のような udev ルールを作成すれば良いことになります:

{{hc|/etc/udev/rules.d/10-gpp0-acpi-fix.rules|2=
KERNEL=="0000:00:01.1", SUBSYSTEM=="pci", DRIVERS=="pcieport", ATTR{vendor}=="0x1022", ATTR{device}=="0x1483", ATTR{power/wakeup}="disabled"
}}

デフォルトで、udev デーモンはシステム内の (ルールの) 変更を監視する用に設定されています。必要であれば、{{ic|udevadm control --reload}} を実行してルールを再読み込みさせることもできます。

{{Note|上記の {{ic|--reload}} オプションは '''systemd-udevd''' にシグナルを発行することで、システムの再起動やログアウトをする必要なくルールや他のデータベースを再読み込みします。しかし、既存のデバイスに対しては変更は適用されません。{{man|8|udevadm}} を参照。}}


== 省電力 ==
== 省電力 ==
405行目: 121行目:
コンピュータが AC 電源またはバッテリーで動作しているかに関わらず、ここに記載されているほとんど全ての機能には使用する価値があります。ここで挙げている機能のほとんどは、パフォーマンスへの影響は無視できるレベルであり、大抵、壊れているハードウェアやドライバのせいでデフォルトで有効化されていないだけです。電力の使用量を減らすことは発熱を減らすことでもあり、[[Wikipedia:ja:インテル ターボ・ブースト・テクノロジー|動的なオーバークロック]]によって、最近の Intel や AMD の CPU ではパフォーマンスの向上につながることもあります。
コンピュータが AC 電源またはバッテリーで動作しているかに関わらず、ここに記載されているほとんど全ての機能には使用する価値があります。ここで挙げている機能のほとんどは、パフォーマンスへの影響は無視できるレベルであり、大抵、壊れているハードウェアやドライバのせいでデフォルトで有効化されていないだけです。電力の使用量を減らすことは発熱を減らすことでもあり、[[Wikipedia:ja:インテル ターボ・ブースト・テクノロジー|動的なオーバークロック]]によって、最近の Intel や AMD の CPU ではパフォーマンスの向上につながることもあります。


=== Intel HWP (Intel Hardware P-state) をサポートする CPU ===
=== Intel Hardware P-state をサポートする CPU ===


HWP 対応プロセッサで利用可能なエネルギー設定は、{{ic|default}}、{{ic|performance}}、{{ic|balance_performance}}、{{ic|balance_power}}、{{ic|power}} です。
Intel Hardware P-state (HWP) 対応プロセッサで利用可能なエネルギー設定は、{{ic|default}}、{{ic|performance}}、{{ic|balance_performance}}、{{ic|balance_power}}、{{ic|power}} です。


以下を実行することで、利用可能な設定を確認できます:
以下を実行することで、利用可能な設定を確認できます:
423行目: 139行目:
=== オーディオ ===
=== オーディオ ===


省電力がデフォルトでオンになっているかどうかは、ドライバによります (例えば HD Audio ではオンです)。使用しているモジュールを[[Advanced Linux Sound Architecture#ロードされているモジュールの特定|特定]]し、{{ic|modinfo ''module_name''}} を実行して、省電力機能を調整あるいは無効化する ({{ic|power_save}} のような) [[カーネルモジュールパラメータ]] を探してください。
==== カーネル ====


{{Note|省電力機能はクリックノイズ (ポップ音) や他の問題を引き起こすかもしれません。それらの解決策は専用のページを参照してください:
デフォルトでは、オーディオの省電力機能はほとんどのドライバーで無効になっています。{{ic|power_save}} パラメータを設定することで有効にすることができます。アイドルモードに移行するまでの時間を秒数で指定します。1秒後にオーディオカードをアイドル状態にするには、Intel のサウンドカードの場合、以下のファイルを作成してください:


* [[Advanced Linux Sound Architecture/トラブルシューティング#省電力]]
{{hc|/etc/modprobe.d/audio_powersave.conf|2=
* [[PipeWire#再生開始時に明らかな音声の遅延やポップノイズ/音割れが発生する]]
options snd_hda_intel power_save=1
* [[PulseAudio/トラブルシューティング#音声の再生時と停止時に破裂音]]
}}
}}

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

options snd_ac97_codec power_save=1

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

HDMI の音声出力を無効化することで、オーディの電力要件を下げることもできます。適切なカーネルモジュール (例: Intel のハードウェアの場合は {{ic|snd_hda_codec_hdmi}}) を[[ブラックリスト|ブラックリスト化]]することで可能です。

==== PulseAudio ====

PulseAudio はデフォルトで、長時間アイドル状態になったオーディオソースを一時停止します。外部 USB マイクを使用する場合、録音がポップ音で開始されることがあります。回避策として、{{ic|/etc/pulse/default.pa}} の次の行をコメントアウトしてください:

load-module module-suspend-on-idle

その後、{{ic|systemctl restart --user pulseaudio}} で PulseAudio を再起動させてください。


=== バックライト ===
=== バックライト ===
458行目: 156行目:
[[Bluetooth]] を完全に無効化するには、{{ic|btusb}} と {{ic|bluetooth}} モジュールを[[ブラックリスト]]に入れてください。
[[Bluetooth]] を完全に無効化するには、{{ic|btusb}} と {{ic|bluetooth}} モジュールを[[ブラックリスト]]に入れてください。


あるいは、以下の udev ルールを作成してください:
一時的にだけ bluetooth をオフにするには、''rfkill'' を使用します:

# rfkill block bluetooth

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


{{hc|/etc/udev/rules.d/50-bluetooth.rules|2=
{{hc|/etc/udev/rules.d/50-bluetooth.rules|2=
468行目: 162行目:
SUBSYSTEM=="rfkill", ATTR{type}=="bluetooth", ATTR{state}="0"
SUBSYSTEM=="rfkill", ATTR{type}=="bluetooth", ATTR{state}="0"
}}
}}

Bluetooth を一時的にオフにしたい場合は、{{man|8|rfkill}} を使ってください:

# rfkill block bluetooth


=== ウェブカメラ ===
=== ウェブカメラ ===
563行目: 261行目:
}}
}}


ASPM は、しばしば以下の理由によって無効化されることがあります [https://wireless.wiki.kernel.org/en/users/documentation/ASPM]:
ASPM は、しばしば以下の理由によって無効化されることがあります [https://wireless.wiki.kernel.org/en/users/documentation/ASPM]{{Dead link|2024|10|12|status=404}}:


# BIOS が何らかの理由で ASPM を無効化した (コンフリクトが起こるから?)。
# BIOS が何らかの理由で ASPM を無効化した (コンフリクトが起こるから?)。
578行目: 276行目:
ASPM がサポートされており、かつ、有効化されていれば、現在のセッションに対して任意のポリシーを選択することができます。例えば、現在のセッションに対して {{ic|powersupersave}} を設定するには、以下を実行してください:
ASPM がサポートされており、かつ、有効化されていれば、現在のセッションに対して任意のポリシーを選択することができます。例えば、現在のセッションに対して {{ic|powersupersave}} を設定するには、以下を実行してください:


# echo powersave > /sys/module/pcie_aspm/parameters/policy
# echo powersupersave > /sys/module/pcie_aspm/parameters/policy


システムのブート時に特定の ASPM 状態 (例として {{ic|powersupersave}}) を有効化させるには、{{ic|1=pcie_aspm.policy=powersupersave}} を[[カーネルパラメータ]]に追加してください。
システムのブート時に特定の ASPM 状態 (例として {{ic|powersupersave}}) を有効化させるには、{{ic|1=pcie_aspm.policy=powersupersave}} を[[カーネルパラメータ]]に追加してください。
586行目: 284行目:
{{hc|/etc/udev/rules.d/pci_pm.rules|2=
{{hc|/etc/udev/rules.d/pci_pm.rules|2=
SUBSYSTEM=="pci", ATTR{power/control}="auto"
SUBSYSTEM=="pci", ATTR{power/control}="auto"
SUBSYSTEM=="ata_port", KERNEL=="ata*", ATTR{device/power/control}="auto"
}}
}}


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


最も単純でおそらく役に立たない、全て USB デバイスで自動サスペンドを有効にする例:
マウスとキーボード以外のUSB デバイスで自動サスペンドを有効にする例:


{{hc|/etc/udev/rules.d/50-usb_power_save.rules|2=
{{hc|/etc/udev/rules.d/50-usb_power_save.rules|2=
ACTION=="add", SUBSYSTEM=="usb", TEST=="power/control", ATTR{power/control}="auto"
ACTION=="add", SUBSYSTEM=="usb", ATTR{product}!="*Mouse", ATTR{product}!="*Keyboard", TEST=="power/control", ATTR{power/control}="auto"
}}
}}


646行目: 345行目:
==== SATA Active Link Power Management ====
==== SATA Active Link Power Management ====


現在の設定は {{ic|/sys/class/scsi_host/host*/link_power_management_policy}} で確認したり設定したりできます:
{{Warning|一部のデバイスでは、SATA Active Link Power Management によってデータの損失が発生する可能性があります。頻繁にバックアップを取っていない限り、この設定を有効化しないでください。}}


$ grep . /sys/class/scsi_host/host*/link_power_management_policy
{{Out of date|ここに書かれてある "新しい設定" や "デフォルトの設定になる予定です" といった文言は古くなっています。}}
$ echo "med_power_with_dipm" >/sys/class/scsi_host/host''N''/link_power_management_policy

Linux 4.15 から、{{ic|med_power_with_dipm}} と呼ばれる[https://hansdegoede.livejournal.com/18412.html 新しい設定]が存在しています。これは、Windows IRST ドライバ設定の動作と一致するものであり、最近の SSD や HDD ではデータの損失は発生しないはずです。[https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=ebb82e3c79d2a956366d0848304a53648bd6350b (アイドル状態で) 1.0 から 1.5 ワット]の節約になることもあります。これは、Linux 4.16 から Intel ベースのノート PC でデフォルトの設定になる予定です [https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=ebb82e3c79d2a956366d0848304a53648bd6350b]。

現在の設定は {{ic|/sys/class/scsi_host/host*/link_power_management_policy}} で確認できます:

$ cat /sys/class/scsi_host/host*/link_power_management_policy


{| class="wikitable"
{| class="wikitable"
671行目: 365行目:
|-
|-
| med_power_with_dipm
| med_power_with_dipm
| 推奨される設定
| 推奨される設定<sup>1</sup>
| 約 1.5 ワット
| 約 1.5 ワット
|-
|-
| min_power
| min_power
| '''警告: データ損失の可能性あり'''
| '''警告: データ損失の可能性あり'''<sup>2</sup>
| 約 1.5 ワット
| 約 1.5 ワット
|}
|}
# Linux 4.15 から、{{ic|med_power_with_dipm}} と呼ばれる[https://hansdegoede.livejournal.com/18412.html 設定]が存在しています。これは、Windows IRST ドライバ設定の動作と一致するものであり、最近の SSD や HDD ではデータの損失は発生しないはずです。[https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=ebb82e3c79d2a956366d0848304a53648bd6350b (アイドル状態で) 1.0 から 1.5 ワット]の節約になることもあります。これは、Linux 4.16 から Intel ベースのノート PC でデフォルトの設定となっています [https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=ebb82e3c79d2a956366d0848304a53648bd6350b]。
# {{Warning|{{ic|min_power}} SATA Active Link Power Management 設定は一部のデバイスでデータ損失が発生する可能性があります。バックアップを頻繁に取っていない限り、この設定を有効化しないでください。}}

[[udev]] ルールファイルを作成することで link_power_management_policy の設定を永続化させることができます。例えば:


{{hc|/etc/udev/rules.d/hd_power_save.rules|2=
{{hc|/etc/udev/rules.d/hd_power_save.rules|2=
683行目: 381行目:
}}
}}


{{Note|
{{Note|この設定を行うとアイドル状態になっているドライブにアクセスするときに遅延が発生するようになります。AC 電源を使用するかどうかによって変えるべき設定です。}}
* この設定を行うとアイドル状態になっているドライブにアクセスするときに遅延が発生するようになります。AC 電源を使用するかどうかによって変えるべき設定です。
* SATA ホストコントローラとストレージデバイスの組み合わせによっては、デフォルト設定の {{ic|med_power_with_dipm}} ではうまく動作しません。例えば:
** linux-6.8.1 の時点では、Intel 7 Series Chipset コントローラから Crucial M550 SSD に (MU02 ファームウェアで) アクセスするとタイムアウトとリンク速度の低下が発生します。
** linux-6.9.6 の時点では、AMD 600 Series Chipset SATA コントローラを HL-DT-ST BDDVDRW GGC-H20L 光学ディスクドライブに使用した際に、数分おきに再初期化して ROM ドライブが音を立てる問題が発生します。
::このような場合には、{{ic|medium_power}} に設定すると解決します。
}}


=== ハードディスクドライブ ===
=== ハードディスクドライブ ===
754行目: 458行目:
case $1 in
case $1 in
pre) /path/to/your/script false ;;
pre) /path/to/your/script false ;;
post)
post)
if cat /sys/class/power_supply/AC0/online {{!}} grep 0 > /dev/null 2>&1
if cat /sys/class/power_supply/AC0/online {{!}} grep 0 > /dev/null 2>&1
then
then
/path/to/your/script true
/path/to/your/script true
else
else
/path/to/your/script false
/path/to/your/script false
838行目: 542行目:
* [https://ivanvojtko.blogspot.sk/2016/04/how-to-get-longer-battery-life-on-linux.html How to get longer battery life on Linux]
* [https://ivanvojtko.blogspot.sk/2016/04/how-to-get-longer-battery-life-on-linux.html How to get longer battery life on Linux]


{{TranslationStatus|Power management|2024-01-11|796409}}
{{TranslationStatus|Power management|2024-12-27|823979}}

2025年4月6日 (日) 02:07時点における最新版

電源管理とは、アクティブでない時に電源を切ったりシステムのコンポーネントを低電力状態に切り替えたりする機能です。

Arch Linux では、電源管理は主に2つの部分からなります:

  1. Linux カーネルの設定。ハードウェアと対話します。
  2. ユーザスペースのツールの設定。カーネルと対話し、カーネルのイベントに応答します。ユーザスペースのツールの多くは、"ユーザフレンドリー"な方法でカーネルの設定を変更することもできます。利用可能なツールは #ユーザースペースツール を参照してください。

ユーザースペースツール

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

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

コンソール

  • acpid — ACPI の電源管理イベントを届けるデーモン。netlink をサポート。
https://sourceforge.net/projects/acpid2/ || acpid
  • Laptop Mode Tools — ノートパソコンの省電力設定をするユーティリティ。多少設定が要りますが省電力設定ユーティリティのデファクトスタンダードとされています。
https://github.com/rickysarraf/laptop-mode-tools || laptop-mode-toolsAUR
  • libsmbios — Dell SMBIOS テーブルと対話するためのライブラリおよびツール。
https://github.com/dell/libsmbios || libsmbios
  • powertop — 消費電力や電源管理の問題を診断して省電力設定を補助するツール。
https://github.com/fenrus75/powertop || powertop
  • powerstat — ACPI や Intel RAPL インターフェイスを使用して電力消費量を測定するツール。
https://github.com/ColinIanKing/powerstat || powerstatAUR
  • systemd — システムおよびサービスマネージャ。
https://systemd.io/ || systemd
  • TLP — Linux 向けの先進的な電源管理。
https://linrunner.de/tlp || tlp
  • TuneD — システム上のデバイスの監視と状況に応じた設定を行うデーモン。
https://tuned-project.org || tuned
  • UPower — 電源デバイスの列挙、デバイスイベントの監視、履歴と統計のクエリを行う抽象化レイヤー。
https://upower.freedesktop.org || upower
https://gitlab.freedesktop.org/upower/power-profiles-daemon || power-profiles-daemon

グラフィカル

  • batsignal — libnotify を使用してバッテリレベルの低下を警告する軽量バッテリモニタ。
https://github.com/electrickite/batsignal || batsignal
  • cbatticon — 軽量で高速なバッテリアイコンをシステムトレイに表示。
https://github.com/valr/cbatticon || cbatticon
  • GNOME Power Statistics — GNOME のシステム電力情報および統計。
https://gitlab.gnome.org/GNOME/gnome-power-manager || gnome-power-manager
  • KDE Power Devil — Plasma 用の電源管理モジュール。
https://invent.kde.org/plasma/powerdevil || powerdevil
  • LXQt Power Management — LXQt 用の電源管理モジュール。
https://github.com/lxqt/lxqt-powermanagement || lxqt-powermanagement
  • MATE Power Management — MATE 用電源管理ツール。
https://github.com/mate-desktop/mate-power-manager || mate-power-manager
  • MATE Power Statistics — MATE のシステム電力情報と統計。
https://github.com/mate-desktop/mate-power-manager || mate-power-manager
  • poweralertd — UPower 通知を伝播するデーモン。
https://git.sr.ht/~kennylevinsen/poweralertd || poweralertdAUR
  • powerkit — デスクトップに依存しない電源マネージャー。
https://github.com/rodlie/powerkit || powerkitAUR
  • Xfce Power Manager — Xfce 用の電源マネージャ。
https://docs.xfce.org/xfce/xfce4-power-manager/start || xfce4-power-manager
  • vattery — システムトレイ内のラップトップバッテリのステータスを表示する、 Vala で書かれたバッテリ監視アプリケーション。
https://www.jezra.net/projects/vattery.html || vatteryAUR

ACPI イベント

systemd は一部の電源関連の ACPI イベントを処理します。これらのイベントの動作は /etc/systemd/logind.conf/etc/systemd/logind.conf.d/*.conf で設定できます (logind.conf(5) を参照)。専用の電源マネージャを持たないシステムでは、この方法は acpid デーモンの代わりになりえます。ちなみに、acpid は通常、ACPI イベントに対応するために使われるデーモンです。

イベントの動作には、ignorepoweroffreboothaltsuspendhibernatehybrid-sleepsuspend-then-hibernatelockkexec のいずれかを指定することができます。ハイバーネートとサスペンドの場合は、適切にセットアップしなければなりません。イベントが設定されていない場合、systemd はデフォルトの動作を使用します。

イベントハンドラ 説明 デフォルトの動作
HandlePowerKey 電源キー/ボタンが押された時にトリガされます。 poweroff
HandleSuspendKey サスペンドキー/ボタンが押された時にトリガされます。 suspend
HandleHibernateKey ハイバネートキー/ボタンが押された時にトリガされます。 hibernate
HandleLidSwitch ラップトップPCなどの蓋が閉じられた時に (以下のケースを除いて) トリガされます。 suspend
HandleLidSwitchDocked システムがドッキングステーションに繋がれている場合や、複数のディスプレイに繋がれている場合に蓋が閉じられるとトリガされます。 ignore
HandleLidSwitchExternalPower システムが外部電源に接続されている状況で蓋が閉じられた時にトリガされます。 HandleLidSwitch に対して設定されている動作

変更を適用するには、systemd-logind.service再読み込みしてください。

ノート
  • systemd は AC とバッテリの ACPI イベントを処理することができません。なので、Laptop Mode Tools や他の似たようなツールを使用している場合、acpid が依然として必要です。
  • 蓋のスイッチを短い間隔で動作させると、logind は、ドックが存在するかどうかを検出するために 90 秒までサスペンドアクションを遅らせます。[1] この遅延は systemd v220 で設定可能になりました。[2] logind.conf か、このファイルのドロップインファイルで HoldoffTimeoutSec=30s のように設定できます。

電源マネージャ

一部のデスクトップ環境には、systemd の ACPI 設定の一部あるいは全てを inhibit する (一時的にオフにする) 電源マネージャが含まれています。そのような電源マネージャが実行されている場合、電源マネージャだけで ACPI イベントに対する動作を設定することができます。/etc/systemd/logind.conf/etc/systemd/logind.conf.d/*.conf を変更する必要があるのは、電源マネージャによって inhibit されていないイベントに対する挙動を設定したい場合のみです。

注意点として、電源マネージャが適切なイベントに対して systemd を inhibit しないと、systemd がシステムをサスペンドし、その後サスペンドから復帰すると今度は電源マネージャがシステムを再びサスペンドしてしまうという状況に陥る可能性があります。GNOMEMATEPlasma、そして Xfce の電源マネージャは、必要な inhibited コマンドを発行します。inhibited コマンドが発行されない場合 (acpid などを使って ACPI イベントを処理している場合)、Handle オプションを ignore に設定してください。systemd-inhibit(1) も参照してください。

xss-lock

xss-lock は systemd の suspendhibernatelock-sessionunlock-session イベントで適切なアクションを実行します (ロッカーを実行し、ユーザがロッカーをアンロックまたは kill するまで待機する)。xss-lockDPMS イベントにも反応し、それに応じてロッカーを実行したり kill したりします。

例えば、以下のコマンドを自動起動します:

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

省電力

ノート ノート PC 固有の電源管理 (バッテリーモニタリングなど) については ノートパソコン#電源管理 を参照してください。また、使用している CPU と GPU に関するページも参照してください (例: RyzenAMDGPU)。

このセクションは、カスタムスクリプトや udev ルールなどの省電力設定をの作成するためのリファレンスです。競合を避けるために、設定が他のユーティリティによって管理されていないことを確認してください。

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

Intel Hardware P-state をサポートする CPU

Intel Hardware P-state (HWP) 対応プロセッサで利用可能なエネルギー設定は、defaultperformancebalance_performancebalance_powerpower です。

以下を実行することで、利用可能な設定を確認できます:

$ cat /sys/devices/system/cpu/cpufreq/policy*/energy_performance_available_preferences

以下のファイルを作成することで、より多くのエネルギーを節約するように設定できます:

/etc/tmpfiles.d/energy_performance_preference.conf
w /sys/devices/system/cpu/cpufreq/policy*/energy_performance_preference - - - - balance_power

Intel プロセッサの電力とパフォーマンスのポリシーに関する詳細は x86_energy_perf_policy(8) man ページを参照してください。一時ファイル/ディレクトリに関する詳細は man ページ systemd-tmpfiles(8)tmpfiles.d(5) も参照してください。

オーディオ

省電力がデフォルトでオンになっているかどうかは、ドライバによります (例えば HD Audio ではオンです)。使用しているモジュールを特定し、modinfo module_name を実行して、省電力機能を調整あるいは無効化する (power_save のような) カーネルモジュールパラメータ を探してください。

ノート 省電力機能はクリックノイズ (ポップ音) や他の問題を引き起こすかもしれません。それらの解決策は専用のページを参照してください:

バックライト

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

Bluetooth

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

あるいは、以下の udev ルールを作成してください:

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

Bluetooth を一時的にオフにしたい場合は、rfkill(8) を使ってください:

# rfkill block bluetooth

ウェブカメラ

内蔵のウェブカメラを使わない場合、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 を使用します。

この値は、以下の Laptop Mode 設定の副作用として変更されてしまうことに注意してください。また、I/O パフォーマンスと省電力に影響を与える他のパラメータは sysctl#仮想メモリ を参照してください。

Laptop Mode

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

/etc/sysctl.d/laptop.conf
vm.laptop_mode = 5
ノート この設定は主に回転ディスクドライブに関連しています。

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

Wake-on-LAN は便利な機能ですが、利用しない場合はサスペンド中にマジックパケットが来るのを待つのに無駄な電力を消耗するだけです。Wake-on-LAN#udev ルールを調整することで、全てのイーサネットインターフェイスに対してこの機能を無効化することができます。iw を使って全てのワイヤレスインターフェイスで省電力を有効化するには:

/etc/udev/rules.d/81-wifi-powersave.rules
ACTION=="add", SUBSYSTEM=="net", KERNEL=="wl*", RUN+="/usr/bin/iw dev $name set power_save on"

この設定ファイルの名前は重要です。Systemd の永続的なデバイス名を使用することで、上記のネットワークルールは、辞書順で 80-net-setup-link.rulesに来るので、ネットワークデバイスの名前が永続的な名前に変更 (例: wlan0 から wlp3s0) された後で適用されます。RUN のコマンドは、全てのルールが処理された後で実行され、永続的な名前 (マッチするデバイスは $name で利用できます) を使用する必要があることに注意してください。

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

iwlwifi ドライバによる Intel ワイヤレスカードの追加の省電力機能は、適切なパラメータをカーネルモジュールに渡すことで有効化できます。/etc/modprobe.d/iwlwifi.conf ファイルに以下の記述を追加することで、パラメータを永続化させることができます:

options iwlwifi power_save=1

以下のオプションは、レイテンシの中央値を増加させる可能性があります:

options iwlwifi uapsd_disable=0

5.4 より前のカーネルでは、以下のオプションを使用できますが、スループットの最大値を減少させる可能性があります:

options iwlwifi d0i3_disable=0

ワイヤレスカードによっては、以下の2つのオプションのうちいずれかが適用されます:

options iwlmvm power_scheme=3
options iwldvm force_cam=0

以下のコマンドで、どちらのモジュールが動作しているかを確認することで、どちらが関連しているかを確認できます:

# lsmod | grep '^iwl.vm'

これらの省電力オプションは実験的であり、システムを不安定にする可能性があることに注意してください。

バスパワーの管理

Active State Power Management

Wikipedia から:

Active-state power management (ASPM) とは、PCI Express デバイスが完全にアクティブな状態にある時に電力を節約するための電源管理メカニズムです。主に、active-state link power management を介して行われます。つまり、PCI Express シリアルリンクは、トラフィックが存在しない時にパワーダウンされます。これは通常、ノート PC や他のモバイルインターネットデバイスでバッテリーの寿命を伸ばすために使用されます。

ブート時に BIOS は、ハードウェアのサポートが存在するかどうかに応じて ASPM を有効化または無効化します。サポートの有無を確認するには以下を実行してください:

# lspci -vv | grep 'ASPM.*abled;'

利用可能な ASPM ポリシーと、現在のデフォルトのポリシーを調べるには、以下を実行してください:

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

ASPM は、しばしば以下の理由によって無効化されることがあります [3][リンク切れ 2024-10-12]:

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

上記で ASPM がサポートされていないと報告されたが、ハードウェアが ASPM をサポートしていると思われる場合は、カーネルが ASPM を管理できるようにするために pcie_aspm=force カーネルパラメータで ASPM を強制的に有効化できます。

警告
  • ASPM を、サポートされていないシステム上で強制的に有効化すると、電力消費量が増加する場合があります。さらに、システムのフリーズやカーネルパニックの危険性もあります。なので、そのような場合に備えてこのオプションをもとに戻す手段を確保しておくべきです。
  • ASPM の強制はカーネル内で行われます。なので、ハードウェアで無効化されている場合には、有効化できません。ハードウェアで ASPM が無効化されているかどうか確認するには、root として dmesg | grep ASPM と実行してください。あなたのハードウェア固有の情報については、対応する Wiki の記事を参照してください (もし存在すれば)。

ASPM がサポートされており、かつ、有効化されていれば、現在のセッションに対して任意のポリシーを選択することができます。例えば、現在のセッションに対して powersupersave を設定するには、以下を実行してください:

# echo powersupersave > /sys/module/pcie_aspm/parameters/policy

システムのブート時に特定の ASPM 状態 (例として powersupersave) を有効化させるには、pcie_aspm.policy=powersupersaveカーネルパラメータに追加してください。

PCI Runtime Power Management

/etc/udev/rules.d/pci_pm.rules
SUBSYSTEM=="pci", ATTR{power/control}="auto"
SUBSYSTEM=="ata_port", KERNEL=="ata*", ATTR{device/power/control}="auto"

上記のルールは未使用のデバイスを全てパワーダウンしますが、一部のデバイスが復帰しなくなってしまいます。サポートしていることが分かっているデバイスのみに対して Runtime Power Management を有効化するには、ベンダ ID とデバイス ID を使って、特定のデバイスにだけマッチするようにしてください (ID を入手するには lspci -nn を使ってください):

/etc/udev/rules.d/pci_pm.rules
# whitelist for pci autosuspend
SUBSYSTEM=="pci", ATTR{vendor}=="0x1234", ATTR{device}=="0x1234", ATTR{power/control}="auto"

または、PCI Runtime Power Management が機能しないデバイスを除外して、その他の全てのデバイスに対して有効化するには:

/etc/udev/rules.d/pci_pm.rules
# blacklist for pci runtime power management
SUBSYSTEM=="pci", ATTR{vendor}=="0x1234", ATTR{device}=="0x1234", ATTR{power/control}="on", GOTO="pci_pm_end"

SUBSYSTEM=="pci", ATTR{power/control}="auto"
LABEL="pci_pm_end"

USB の自動サスペンド

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

マウスとキーボード以外のUSB デバイスで自動サスペンドを有効にする例:

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

自動サスペンドが動作するデバイスにだけ自動サスペンドを有効にするには、ベンダー ID とプロダクト ID でマッチングを行います (これらの 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秒に設定するには、以下のカーネルパラメータを追加してください:

usbcore.autosuspend=5

power/control と同じように、power/autosuspend 属性を設定することで遅延時間はデバイスごとに細かく設定することができます。また、power/autosuspend を -1 (つまり、自動サスペンドしない) に設定することで、自動サスペンドを無効化することができます:

/etc/udev/rules.d/50-usb_power_save.rules
ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="05c6", ATTR{idProduct}=="9205", ATTR{power/autosuspend}="-1"

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

現在の設定は /sys/class/scsi_host/host*/link_power_management_policy で確認したり設定したりできます:

$ grep . /sys/class/scsi_host/host*/link_power_management_policy
$ echo "med_power_with_dipm" >/sys/class/scsi_host/hostN/link_power_management_policy
利用可能な ALPM 設定
設定 説明 省電力効果
max_performance 現在のデフォルト 無し
medium_power - 約 1.0 ワット
med_power_with_dipm 推奨される設定1 約 1.5 ワット
min_power 警告: データ損失の可能性あり2 約 1.5 ワット
  1. Linux 4.15 から、med_power_with_dipm と呼ばれる設定が存在しています。これは、Windows IRST ドライバ設定の動作と一致するものであり、最近の SSD や HDD ではデータの損失は発生しないはずです。(アイドル状態で) 1.0 から 1.5 ワットの節約になることもあります。これは、Linux 4.16 から Intel ベースのノート PC でデフォルトの設定となっています [4]
  2. 警告 min_power SATA Active Link Power Management 設定は一部のデバイスでデータ損失が発生する可能性があります。バックアップを頻繁に取っていない限り、この設定を有効化しないでください。

udev ルールファイルを作成することで link_power_management_policy の設定を永続化させることができます。例えば:

/etc/udev/rules.d/hd_power_save.rules
ACTION=="add", SUBSYSTEM=="scsi_host", KERNEL=="host*", ATTR{link_power_management_policy}="med_power_with_dipm"
ノート
  • この設定を行うとアイドル状態になっているドライブにアクセスするときに遅延が発生するようになります。AC 電源を使用するかどうかによって変えるべき設定です。
  • SATA ホストコントローラとストレージデバイスの組み合わせによっては、デフォルト設定の med_power_with_dipm ではうまく動作しません。例えば:
    • linux-6.8.1 の時点では、Intel 7 Series Chipset コントローラから Crucial M550 SSD に (MU02 ファームウェアで) アクセスするとタイムアウトとリンク速度の低下が発生します。
    • linux-6.9.6 の時点では、AMD 600 Series Chipset SATA コントローラを HL-DT-ST BDDVDRW GGC-H20L 光学ディスクドライブに使用した際に、数分おきに再初期化して ROM ドライブが音を立てる問題が発生します。
このような場合には、medium_power に設定すると解決します。

ハードディスクドライブ

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

多数のプログラムがディスクに頻繁に書き込みをおこなう場合は省電力は効率的ではありません。全てのプログラムを調査して、いつどのようにプログラムがディスクに書き込むを行うのか調べるのがディスクの使用量を減らす道です。iotop を使えばどのプログラムがディスクに頻繁に書き込みしているかわかります。他のヒントは パフォーマンスの向上#ストレージデバイス を見て下さい。

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

PowerChoice テクノロジーを搭載した Seagate ドライブの場合、EPC (Extended Power Conditions) 機能により hdparm から APM を設定するテクニックはうまく行きません。APM を設定する代わりに、openseachestAUR パッケージをインストールし、ドライブの EPC を完全に無効化することができます (X は実際のドライブレターに置き換えてください):

# openSeaChest_PowerControl --scan
# openSeaChest_PowerControl -d /dev/sdX -i
# openSeaChest_PowerControl -d /dev/sdX --showEPCSettings
# openSeaChest_PowerControl -d /dev/sdX --EPCfeature disable
# openSeaChest_PowerControl -d /dev/sdX --showEPCSettings

最後のコマンドでは、以下が出力されます:

==========================================================================================
 openSeaChest_PowerControl - openSeaChest drive utilities - NVMe Enabled
 Copyright (c) 2014-2023 Seagate Technology LLC and/or its Affiliates, All Rights Reserved
 openSeaChest_PowerControl Version: 3.3.1-4_1_1 X86_64
 Build Date: Jul  4 2023
 Today: Tue Jul  4 17:49:36 2023        User: root
==========================================================================================

/dev/sdX - ST1000NM0008-2F2100 - ZFA19JG2 - SN02 - ATA


===EPC Settings===
        * = timer is enabled
        C column = Changeable
        S column = Savable
        All times are in 100 milliseconds

Name       Current Timer Default Timer Saved Timer   Recovery Time C S
Idle A      0            *10           *10           1             Y Y
Idle B      0            *1200         *1200         3             Y Y
Idle C      0             6000          6000         16            Y Y
Standby Z   0             9000          9000         46            Y Y

最初の列の 0 は、パーキングとスピンダウンが正常に無効化されたことを意味します。

ツールとスクリプト

スクリプトと 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 スクリプトのサンプル:

上記の 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

ユーザにシャットダウンを許可する

ボタンと蓋スイッチのイベント

サスペンド、電源オフ、そしてハイバネートのボタンのイベントと、蓋を閉じた時のイベントは、#ACPI イベント で説明されているように logind によって処理されます。

systemd-logind を使う

polkit を使用している場合、非リモートセッションのユーザは、セッションが壊れていない限り、電源関連のコマンドを発行することができます。

セッションがアクティブであることを確認するには:

$ loginctl show-session $XDG_SESSION_ID --property=Active

アクティブであるならば、ユーザはコマンドラインで systemctl のコマンドを使用したり、メニューに追加したりできます:

$ systemctl poweroff
$ systemctl reboot

systemctl suspendsystemctl hibernate といった他のコマンドも使用できます。systemctl(1)System Commands セクションを参照してください。

sudo を使う

sudoインストールし、sudo 権限をユーザに与えてください。sudo 権限が与えられたユーザは、sudo systemctl コマンド (例: sudo systemctl poweroffsudo systemctl rebootsudo systemctl suspendsudo systemctl hibernate) を使用できるようになります。systemctl(1)System Commands セクションを参照してください。

sudo 権限の無いユーザ

ユーザにシャットダウンコマンドのみを使用できるようにし、sudo 権限を与えないようにする必要がある場合、visudo コマンドを root として使って /etc/sudoers の末尾に以下を追加してください。user の部分は適切なユーザ名に、hostname の部分はマシンのホスト名に置き換えてください。

user hostname =NOPASSWD: /usr/bin/systemctl poweroff,/usr/bin/systemctl halt,/usr/bin/systemctl reboot

ここで設定したユーザは、sudo systemctl poweroff でシャットダウンを、sudo systemctl reboot で再起動を行うことができるようになります。システムをシャットダウンしたいユーザは、sudo systemctl halt も使用できます。パスワードのプロンプトを表示させたくない場合は、NOPASSWD: タグを使用してください。

参照

翻訳ステータス: このページは en:Power management の翻訳バージョンです。最後の翻訳日は 2024-12-27 です。もし英語版に 変更 があれば、翻訳の同期を手伝うことができます。