「電源管理」の版間の差分
(→カーネルパラメータ: 同期) |
(同期) |
||
(同じ利用者による、間の13版が非表示) | |||
2行目: | 2行目: | ||
[[en:Power management]] |
[[en:Power management]] |
||
[[es:Power management]] |
[[es:Power management]] |
||
+ | [[pt:Power management]] |
||
[[ru:Power management]] |
[[ru:Power management]] |
||
[[zh-hans:Power management]] |
[[zh-hans:Power management]] |
||
35行目: | 36行目: | ||
* {{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|libsmbios|Dell SMBIOS テーブルと対話するためのライブラリおよびツール。|https://github.com/dell/libsmbios|{{Pkg|libsmbios}}}} |
* {{App|libsmbios|Dell SMBIOS テーブルと対話するためのライブラリおよびツール。|https://github.com/dell/libsmbios|{{Pkg|libsmbios}}}} |
||
− | * {{App|[[powertop]]|消費電力や電源管理の問題を診断して省電力設定を補助するツール。|https:// |
+ | * {{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|{{AUR|tuned}}}} |
||
+ | * {{App|[[Wikipedia:UPower|UPower]]|電源デバイスの列挙、デバイスイベントの監視、履歴と統計のクエリを行う抽象化レイヤー。|https://upower.freedesktop.org|{{Pkg|upower}}}} |
||
=== グラフィカル === |
=== グラフィカル === |
||
53行目: | 57行目: | ||
* {{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 イベントに対応するために使われるデーモンです。 |
||
91行目: | 93行目: | ||
|} |
|} |
||
− | 変更を適用するには |
+ | 変更を適用するには、{{ic|systemd-logind.service}} を[[リロード|再読み込み]]してください。 |
+ | {{Note| |
||
− | # systemctl kill -s HUP systemd-logind |
||
+ | * ''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}} のように設定できます。 |
||
− | {{Note|''systemd'' は AC とバッテリの ACPI イベントを処理することができません。なので、[[Laptop Mode Tools]] や他の似たようなツールを使用している場合、[[acpid]] が依然として必要です。}} |
||
+ | }} |
||
− | + | === 電源マネージャ === |
|
− | 一部の[[デスクトップ環境]]には、''systemd'' の ACPI 設定の一部あるいは全てを [https:// |
+ | 一部の[[デスクトップ環境]]には、''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'' がシステムをサスペンドし、その後サスペンドから復帰すると今度は電源マネージャがシステムを再びサスペンドしてしまうという状況に陥る可能性があります。[[KDE]]、[[GNOME]]、[[Xfce]]、そして [[MATE]] の電源マネージャは、必要な ''inhibited'' コマンドを発行します。''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}} イベントで適切なアクションを実行します (ロッカーを実行し、ユーザがロッカーをアンロックまたは kill するまで待機する)。''xss-lock'' は [[DPMS]] イベントにも反応し、それに応じてロッカーを実行したり kill したりします。 |
{{pkg|xss-lock}} は systemd の {{ic|suspend}}、{{ic|hibernate}}、{{ic|lock-session}}、{{ic|unlock-session}} イベントで適切なアクションを実行します (ロッカーを実行し、ユーザがロッカーをアンロックまたは kill するまで待機する)。''xss-lock'' は [[DPMS]] イベントにも反応し、それに応じてロッカーを実行したり kill したりします。 |
||
110行目: | 113行目: | ||
$ 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}} の時間後、システムは短い間サスペンドから復帰し、計測を行います (システムが手動でサスペンドから復帰された場合も、計測が行われます)。 |
||
− | |||
− | {{Note|''systemd'' は、コンピュータをスリープまたはハイバネート状態に置くために、デフォルトの''カーネル''サスペンドバックエンドに加えて、他のサスペンドバックエンドを使用することもできます (例えば [[Uswsusp]])。例は [[Uswsusp#systemd を使う]] を参照してください。}} |
||
− | |||
− | ==== サスペンドやハイバネートのリクエスト時にハイブリッドスリープを行う ==== |
||
− | |||
− | ''サスペンド''や''ハイバネート''のリクエスト時にも、''ハイブリッドスリープ''を常に行うように systemd を設定することができます。 |
||
− | |||
− | ''サスペンド''と''ハイバネート''のデフォルトの動作は、{{ic|/etc/systemd/sleep.conf.d/}} 内の ''.conf'' ファイルで設定することができます。両方の動作を ''ハイブリッドスリープ'' に設定するには: |
||
− | |||
− | {{hc|/etc/systemd/sleep.conf.d/hybrid-sleep.conf|2= |
||
− | [Sleep] |
||
− | # suspend=hybrid-sleep |
||
− | SuspendMode=suspend |
||
− | SuspendState=disk |
||
− | # hibernate=hybrid-sleep |
||
− | HibernateMode=suspend |
||
− | HibernateState=disk |
||
− | }} |
||
− | |||
− | 詳細は {{man|5|sleep.conf.d}} man ページと [https://docs.kernel.org/admin-guide/pm/sleep-states.html#basic-sysfs-interfaces-for-system-suspend-and-hibernation linux カーネルの電源状態に関するドキュメント]を参照してください。 |
||
− | |||
− | ==== サスペンドを無効化する ==== |
||
− | |||
− | デバイスをサーバなどとして使用している場合、サスペンドは必要ないかもしれませんし、かえって望ましくない可能性もあります。 |
||
− | 任意のスリープ状態を設定することができます: |
||
− | |||
− | {{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 サービスを電源イベントにフックさせるために使用できる[http://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) |
||
− | |||
− | キーボードデバイスがないことに気づいて下さい。したがってキーボードデバイスの ATTRS{name} を取得します [https://systemd-devel.freedesktop.narkive.com/Rbi3rjNN/patch-1-2-logind-add-support-for-tps65217-power-button]: |
||
− | |||
− | {{hc|# udevadm info -a /dev/input/by-path/*-kbd|2= |
||
− | ... |
||
− | KERNEL=="event0" |
||
− | ... |
||
− | ATTRS{name}=="AT Translated Set 2 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}=="AT Translated Set 2 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/event0}} と表示されるようになるはずです。 |
||
− | |||
− | ==== 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]] および[[起動/有効化]]します。 |
||
− | |||
− | === ヒントとテクニック === |
||
− | |||
− | ==== ハイバネート専用のオンデマンドなスワップ ==== |
||
− | |||
− | セットアップによっては、ハイバネートの時にだけスワップ領域をアクティブ化させ、復帰後に非アクティブ化させることが望ましい場合があります。 |
||
− | |||
− | これは上記のフックを使って行うこともできますが、以下のようにスワップのユニット設定ファイル ({{man|5|systemd.swap}} を参照) を直接使うこともできます: |
||
− | |||
− | {{hc|/etc/systemd/system/path-to-swap.swap|2= |
||
− | [Unit] |
||
− | Before=systemd-hibernate.service |
||
− | StopWhenUnneeded=true |
||
− | |||
− | [Swap] |
||
− | What=/path/to/swap |
||
− | Options=noauto |
||
− | |||
− | [Install] |
||
− | RequiredBy=systemd-hibernate.service |
||
− | }} |
||
− | |||
− | ''注意点として、ユニットのファイル名はスワップデバイスのパスに対応していなければならず、さらに、{{ic|1=RequiredBy=}} が効果を持つにはユニットが有効化されていなければなりません。'' (訳注: 例えば、スワップデバイスが {{ic|/dev/sda5}} にある場合、ユニットファイル名は {{ic|dev-sda5.swap}} としなければなりません。) |
||
− | |||
− | {{ic|systemd-hibernate.service}} ではなく {{ic|hibernate.target}} に依存させることも可能ですが、その場合、{{ic|systemctl start systemd-hibernate.service}} を直接実行しても機能しません。 |
||
− | |||
− | 注意点として、デスクトップ環境はハイバネートのオプションを表示しない可能性があり、{{ic|systemctl hibernate}} は機能しません。なぜなら、これらは {{ic|systemd-logind}} にクエリして利用可能な省電力モードを調べますが、{{ic|systemd-logind}} はスワップ領域がアクティブでない場合はハイバネーションが利用可能であると報告しないからです。 |
||
− | |||
− | この問題は、{{ic|1=SYSTEMD_BYPASS_HIBERNATION_MEMORY_CHECK=1}} 環境変数を設定して {{ic|systemd-logind}} を開始することで回避できます。例えば、"ドロップイン" 設定ディレクトリ内で以下のようなファイルを作成します: |
||
− | |||
− | {{hc|/etc/systemd/system/systemd-logind.service.d/disable-hibernation-swap-check.conf|2= |
||
− | [Service] |
||
− | Environment="SYSTEMD_BYPASS_HIBERNATION_MEMORY_CHECK=1" |
||
− | }} |
||
== 省電力 == |
== 省電力 == |
||
448行目: | 128行目: | ||
以下を実行することで、利用可能な設定を確認できます: |
以下を実行することで、利用可能な設定を確認できます: |
||
− | $ cat /sys/devices/system/cpu/cpufreq/policy |
+ | $ cat /sys/devices/system/cpu/cpufreq/policy*/energy_performance_available_preferences |
以下のファイルを作成することで、より多くのエネルギーを節約するように設定できます: |
以下のファイルを作成することで、より多くのエネルギーを節約するように設定できます: |
||
{{hc|/etc/tmpfiles.d/energy_performance_preference.conf| |
{{hc|/etc/tmpfiles.d/energy_performance_preference.conf| |
||
− | w /sys/devices/system/cpu/cpufreq/policy |
+ | w /sys/devices/system/cpu/cpufreq/policy*/energy_performance_preference - - - - balance_power |
}} |
}} |
||
− | 詳細は {{man|8|systemd-tmpfiles}} |
+ | Intel プロセッサの電力とパフォーマンスのポリシーに関する詳細は {{man|8|x86_energy_perf_policy}} man ページを参照してください。一時ファイル/ディレクトリに関する詳細は man ページ {{man|8|systemd-tmpfiles}} や {{man|5|tmpfiles.d}} も参照してください。 |
=== オーディオ === |
=== オーディオ === |
||
479行目: | 159行目: | ||
HDMI の音声出力を無効化することで、オーディの電力要件を下げることもできます。適切なカーネルモジュール (例: Intel のハードウェアの場合は {{ic|snd_hda_codec_hdmi}}) を[[ブラックリスト|ブラックリスト化]]することで可能です。 |
HDMI の音声出力を無効化することで、オーディの電力要件を下げることもできます。適切なカーネルモジュール (例: Intel のハードウェアの場合は {{ic|snd_hda_codec_hdmi}}) を[[ブラックリスト|ブラックリスト化]]することで可能です。 |
||
+ | ==== 音声の再生開始時や停止時にポップノイズ ==== |
||
− | ==== PulseAudio ==== |
||
− | + | デフォルトでは、長時間アイドル状態にあるオーディオソースはサスペンドされます。この時に音声を再生したりマイクを使用し始めたりすると、ポップノイズが発生することがあります。解決策はそれぞれ対応するページを見てください: |
|
+ | * [[Advanced Linux Sound Architecture/トラブルシューティング#再生を開始・停止するとポップノイズが鳴る]] |
||
− | load-module module-suspend-on-idle |
||
+ | * [[PulseAudio/トラブルシューティング#音声の再生時と停止時に破裂音]] |
||
− | |||
+ | * [[PipeWire#再生開始時に明らかな音声の遅延やポップノイズ/音割れが発生する]] |
||
− | その後、{{ic|systemctl restart --user pulseaudio}} で PulseAudio を再起動させてください。 |
||
=== バックライト === |
=== バックライト === |
||
495行目: | 175行目: | ||
[[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= |
||
505行目: | 181行目: | ||
SUBSYSTEM=="rfkill", ATTR{type}=="bluetooth", ATTR{state}="0" |
SUBSYSTEM=="rfkill", ATTR{type}=="bluetooth", ATTR{state}="0" |
||
}} |
}} |
||
+ | |||
+ | Bluetooth を一時的にオフにしたい場合は、{{man|8|rfkill}} を使ってください: |
||
+ | |||
+ | # rfkill block bluetooth |
||
=== ウェブカメラ === |
=== ウェブカメラ === |
||
548行目: | 228行目: | ||
=== ネットワークインターフェイス === |
=== ネットワークインターフェイス === |
||
− | [[Wake-on-LAN]] は便利な機能ですが、利用しない場合はサスペンド中にマジックパケットが来るのを待つのに無駄な電力を消耗するだけです。全ての |
+ | [[Wake-on-LAN]] は便利な機能ですが、利用しない場合はサスペンド中にマジックパケットが来るのを待つのに無駄な電力を消耗するだけです。[[Wake-on-LAN#udev]] ルールを調整することで、全てのイーサネットインターフェイスに対してこの機能を無効化することができます。{{Pkg|iw}} を使って全てのワイヤレスインターフェイスで省電力を有効化するには: |
− | {{hc|/etc/udev/rules.d/ |
+ | {{hc|/etc/udev/rules.d/'''81'''-wifi-powersave.rules|2= |
+ | ACTION=="add", SUBSYSTEM=="net", KERNEL=="wl*", RUN+="/usr/bin/iw dev $name set power_save on" |
||
+ | }} |
||
+ | この設定ファイルの名前は重要です。Systemd の[[ネットワーク設定#インターフェイス名の変更|永続的なデバイス名]]を使用することで、上記のネットワークルールは、辞書順で {{ic|80-net-setup-link.rules}} の'''後'''に来るので、ネットワークデバイスの名前が永続的な名前に変更 (例: {{ic|wlan0}} から {{ic|wlp3s0}}) された後で適用されます。{{ic|RUN}} のコマンドは、全てのルールが処理された後で実行され、永続的な名前 (マッチするデバイスは {{ic|$name}} で利用できます) を使用する必要があることに注意してください。 |
||
− | 全ての無線インターフェイスで省電力機能を有効にするには: |
||
+ | ==== Intel ワイヤレスカード (iwlwifi) ==== |
||
− | {{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|iwlwifi}} ドライバによる Intel ワイヤレスカードの追加の省電力機能は、適切なパラメータをカーネルモジュールに渡すことで有効化できます。{{ic|/etc/modprobe.d/iwlwifi.conf}} ファイルに以下の記述を追加することで、パラメータを永続化させることができます: |
||
− | 上記の例では、{{ic|%k}} がマッチするデバイスのカーネル名を示します。例えば、ルールが {{ic|wlan0}} に適用可能とわかった場合、{{ic|%k}} は {{ic|wlan0}} に置き換えられます。特定のインターフェイスにだけルールを適用するには、パターン {{ic|eth*}} と修飾子 {{ic|%k}} を適当なインターフェイスの名前に置き換えて下さい。詳しくは、[http://www.reactivated.net/writing_udev_rules.html Writing udev rules] を参照。 |
||
+ | options iwlwifi power_save=1 |
||
− | {{Note|ここで、設定ファイルの名前は重要です。systemd v197 から {{ic|80-net-setup-link.rules}} によって[[ネットワーク設定#デバイス名|永続的なデバイス名]]が導入されたため、デバイスに {{ic|enp2s0}} というような名前で呼ばれるようになる前に適用されるように、ネットワークの powersave ファイルは辞書順で {{ic|80-net-setup-link.rules}} よりも前に来る名前を付けなくてはなりません。}} |
||
+ | 以下のオプションは、レイテンシの中央値を増加させる可能性があります: |
||
− | ==== Intel ワイヤレスカード (iwlwifi) ==== |
||
+ | options iwlwifi uapsd_disable=0 |
||
− | Intel 製ワイヤレスカードの省電力機能は {{ic|iwlwifi}} ドライバーに適切なパラメータを渡すことで有効にできます。{{ic|/etc/modprobe.d/iwlwifi.conf}} ファイルに以下の行を追加することで永続的に有効にできます: |
||
+ | |||
+ | 5.4 より前のカーネルでは、以下のオプションを使用できますが、スループットの最大値を減少させる可能性があります: |
||
+ | |||
+ | options iwlwifi d0i3_disable=0 |
||
+ | |||
+ | ワイヤレスカードによっては、以下の2つのオプションのうちいずれかが適用されます: |
||
+ | |||
+ | options iwlmvm power_scheme=3 |
||
− | options iwlwifi power_save=1 d0i3_disable=0 uapsd_disable=0 |
||
options iwldvm force_cam=0 |
options iwldvm force_cam=0 |
||
+ | 以下のコマンドで、どちらのモジュールが動作しているかを確認することで、どちらが関連しているかを確認できます: |
||
− | 上記の省電力オプションは実験的であり、システムが不安定になる可能性があります。 |
||
+ | |||
+ | # lsmod | grep '^iwl.vm' |
||
+ | |||
+ | これらの省電力オプションは実験的であり、システムを不安定にする可能性があることに注意してください。 |
||
=== バスパワーの管理 === |
=== バスパワーの管理 === |
||
573行目: | 266行目: | ||
==== Active State Power Management ==== |
==== Active State Power Management ==== |
||
− | + | [[Wikipedia:Active State Power Management|Wikipedia]] から: |
|
+ | : '''Active-state power management''' ('''ASPM''') とは、PCI Express デバイスが完全にアクティブな状態にある時に電力を節約するための電源管理メカニズムです。主に、active-state link power management を介して行われます。つまり、PCI Express シリアルリンクは、トラフィックが存在しない時にパワーダウンされます。これは通常、ノート PC や他のモバイルインターネットデバイスでバッテリーの寿命を伸ばすために使用されます。 |
||
− | $ lspci -vv | grep ASPM.*abled\; |
||
+ | |||
+ | ブート時に BIOS は、ハードウェアのサポートが存在するかどうかに応じて ASPM を有効化または無効化します。サポートの有無を確認するには以下を実行してください: |
||
+ | |||
+ | # lspci -vv | grep 'ASPM.*abled;' |
||
+ | |||
+ | 利用可能な ASPM ポリシーと、現在のデフォルトのポリシーを調べるには、以下を実行してください: |
||
+ | |||
+ | {{hc|$ cat /sys/module/pcie_aspm/parameters/policy| |
||
+ | [default] performance powersave powersupersave |
||
+ | }} |
||
− | ASPM は |
+ | ASPM は、しばしば以下の理由によって無効化されることがあります [https://wireless.wiki.kernel.org/en/users/documentation/ASPM]: |
# BIOS が何らかの理由で ASPM を無効化した (コンフリクトが起こるから?)。 |
# BIOS が何らかの理由で ASPM を無効化した (コンフリクトが起こるから?)。 |
||
− | # PCIE が |
+ | # PCIE が ASPM を必要とするが、L0s は任意である (なので、L0s は無効化され、L1 だけが有効化されるかもしれません)。 |
− | # ASPM に |
+ | # ASPM 用に BIOS がプログラムされていないか、BIOS にバグが存在する。 |
− | # BIOS にバグが存在する。 |
||
− | + | 上記で ASPM がサポートされていないと報告されたが、ハードウェアが ASPM をサポートしていると思われる場合は、カーネルが ASPM を管理できるようにするために {{ic|1=pcie_aspm=force}} [[カーネルパラメータ]]で ASPM を強制的に有効化できます。 |
|
{{Warning| |
{{Warning| |
||
− | * ASPM を強制するとフリーズやパニック |
+ | * ASPM を、サポートされていないシステム上で強制的に有効化すると、電力消費量が増加する場合があります。さらに、システムのフリーズやカーネルパニックの危険性もあります。なので、そのような場合に備えてこのオプションをもとに戻す手段を確保しておくべきです。 |
+ | * ASPM の強制はカーネル内で行われます。なので、ハードウェアで無効化されている場合には、有効化できません。ハードウェアで ASPM が無効化されているかどうか確認するには、root として {{ic|dmesg {{!}} grep ASPM}} と実行してください。あなたのハードウェア固有の情報については、対応する Wiki の記事を参照してください (もし存在すれば)。 |
||
− | * ASPM をサポートしていないシステムで強制させると消費電力が逆に上昇することがあります。 |
||
}} |
}} |
||
+ | ASPM がサポートされており、かつ、有効化されていれば、現在のセッションに対して任意のポリシーを選択することができます。例えば、現在のセッションに対して {{ic|powersupersave}} を設定するには、以下を実行してください: |
||
− | {{ic|powersave}} に調整するには次を実行 (以下のコマンドは ASPM が有効になっていないと機能しません): |
||
− | + | # echo powersupersave > /sys/module/pcie_aspm/parameters/policy |
|
+ | システムのブート時に特定の ASPM 状態 (例として {{ic|powersupersave}}) を有効化させるには、{{ic|1=pcie_aspm.policy=powersupersave}} を[[カーネルパラメータ]]に追加してください。 |
||
− | デフォルトでは以下のようになります: |
||
− | |||
− | {{hc|$ cat /sys/module/pcie_aspm/parameters/policy|[default] performance powersave}} |
||
==== PCI Runtime Power Management ==== |
==== PCI Runtime Power Management ==== |
||
− | {{hc|/etc/udev/rules.d/pci_pm.rules|2= |
+ | {{hc|/etc/udev/rules.d/pci_pm.rules|2= |
+ | SUBSYSTEM=="pci", ATTR{power/control}="auto" |
||
+ | }} |
||
+ | 上記のルールは未使用のデバイスを全てパワーダウンしますが、一部のデバイスが復帰しなくなってしまいます。サポートしていることが分かっているデバイスのみに対して Runtime Power Management を有効化するには、ベンダ ID とデバイス ID を使って、特定のデバイスにだけマッチするようにしてください (ID を入手するには {{ic|lspci -nn}} を使ってください): |
||
− | ==== デバイスの電源管理 ==== |
||
+ | {{hc|/etc/udev/rules.d/pci_pm.rules|2= |
||
− | ''USB を含む''、(ほぼ) 全てのデバイスの電源管理を有効化: |
||
+ | # whitelist for pci autosuspend |
||
+ | SUBSYSTEM=="pci", ATTR{vendor}=="0x1234", ATTR{device}=="0x1234", ATTR{power/control}="auto" |
||
+ | }} |
||
+ | または、PCI Runtime Power Management が機能しないデバイスを除外して、その他の全てのデバイスに対して有効化するには: |
||
− | {{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" |
||
+ | {{hc|/etc/udev/rules.d/pci_pm.rules|2= |
||
− | # Various subsystems power saving (by module) |
||
+ | # blacklist for pci runtime power management |
||
− | ACTION=="add", SUBSYSTEMS=="*", TEST=="parameters/power_save", ATTR{parameters/power_save}="1" </nowiki>}} |
||
+ | 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" |
||
− | 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 の自動サスペンド ==== |
==== USB の自動サスペンド ==== |
||
626行目: | 326行目: | ||
Linux カーネルは USB デバイスが使用されていないときに USB デバイスを自動的にサスペンドさせることができます。これによって電力を相当カットできるときもありますが、USB の省電力機能に対応していない USB デバイスではおかしな挙動が起こる可能性もあります (特に USB マウスやキーボード)。ホワイトリストとブラックリストでフィルタリングする [[udev]] ルールを使うことで問題は軽減されます。 |
Linux カーネルは USB デバイスが使用されていないときに USB デバイスを自動的にサスペンドさせることができます。これによって電力を相当カットできるときもありますが、USB の省電力機能に対応していない USB デバイスではおかしな挙動が起こる可能性もあります (特に USB マウスやキーボード)。ホワイトリストとブラックリストでフィルタリングする [[udev]] ルールを使うことで問題は軽減されます。 |
||
− | 最も単純で |
+ | 最も単純でおそらく役に立たない、全ての USB デバイスで自動サスペンドを有効にする例: |
− | {{hc|/etc/udev/rules.d/50-usb_power_save.rules| |
+ | {{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", TEST=="power/control", ATTR{power/control}="auto" |
||
+ | }} |
||
− | </nowiki>}} |
||
− | 自動サスペンドが動作するデバイスにだけ自動サスペンドを有効にするには、ベンダーとプロダクト ID でマッチングを行います (''lsusb'' を使って |
+ | 自動サスペンドが動作するデバイスにだけ自動サスペンドを有効にするには、ベンダー ID とプロダクト ID でマッチングを行います (これらの ID を入手するには ''lsusb'' を使ってください): |
− | {{hc|/etc/udev/rules.d/50-usb_power_save.rules| |
+ | {{hc|/etc/udev/rules.d/50-usb_power_save.rules|2= |
# whitelist for usb autosuspend |
# whitelist for usb autosuspend |
||
ACTION=="add", SUBSYSTEM=="usb", TEST=="power/control", ATTR{idVendor}=="05c6", ATTR{idProduct}=="9205", ATTR{power/control}="auto" |
ACTION=="add", SUBSYSTEM=="usb", TEST=="power/control", ATTR{idVendor}=="05c6", ATTR{idProduct}=="9205", ATTR{power/control}="auto" |
||
+ | }} |
||
− | </nowiki>}} |
||
もしくは、USB 自動サスペンドが使えないデバイスをブラックリストに入れて、他の全てのデバイスで自動サスペンドを有効にするには: |
もしくは、USB 自動サスペンドが使えないデバイスをブラックリストに入れて、他の全てのデバイスで自動サスペンドを有効にするには: |
||
− | {{hc|/etc/udev/rules.d/50-usb_power_save.rules| |
+ | {{hc|/etc/udev/rules.d/50-usb_power_save.rules|2= |
# blacklist for usb autosuspend |
# blacklist for usb autosuspend |
||
ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="05c6", ATTR{idProduct}=="9205", GOTO="power_usb_rules_end" |
ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="05c6", ATTR{idProduct}=="9205", GOTO="power_usb_rules_end" |
||
647行目: | 347行目: | ||
ACTION=="add", SUBSYSTEM=="usb", TEST=="power/control", ATTR{power/control}="auto" |
ACTION=="add", SUBSYSTEM=="usb", TEST=="power/control", ATTR{power/control}="auto" |
||
LABEL="power_usb_rules_end" |
LABEL="power_usb_rules_end" |
||
+ | }} |
||
− | </nowiki>}} |
||
− | 自動サスペンドに入るデフォルトのアイドル遅延時間は {{ic|usbcore}} [[カーネルモジュール]]の {{ic|autosuspend}} パラメータによって制御されています。遅延時間をデフォルトの2秒から5秒に設定するには: |
+ | 自動サスペンドに入るデフォルトのアイドル遅延時間は {{ic|usbcore}} 組み込み[[カーネルモジュール]]の {{ic|autosuspend}} パラメータによって制御されています。遅延時間をデフォルトの2秒から5秒に設定するには、以下の[[カーネルパラメータ]]を追加してください: |
− | {{ |
+ | {{bc|1=usbcore.autosuspend=5}} |
− | options usbcore autosuspend=5 |
||
− | </nowiki>}} |
||
− | {{ic|power/control}} と同じように、{{ic|power/autosuspend}} 属性を設定することで遅延時間はデバイスごとに細かく設定することができます。 |
+ | {{ic|power/control}} と同じように、{{ic|power/autosuspend}} 属性を設定することで遅延時間はデバイスごとに細かく設定することができます。また、{{ic|power/autosuspend}} を -1 (つまり、自動サスペンドしない) に設定することで、自動サスペンドを無効化することができます: |
+ | |||
+ | {{hc|/etc/udev/rules.d/50-usb_power_save.rules|2= |
||
+ | ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="05c6", ATTR{idProduct}=="9205", ATTR{power/autosuspend}="-1" |
||
+ | }} |
||
− | USB の電源管理に関する詳細は [https:// |
+ | USB の電源管理に関する詳細は [https://docs.kernel.org/driver-api/usb/power-management.html Linux カーネルドキュメント]を見て下さい。 |
==== SATA Active Link Power Management ==== |
==== SATA Active Link Power Management ==== |
||
− | {{ |
+ | {{Warning|一部のデバイスでは、SATA Active Link Power Management によってデータの損失が発生する可能性があります。頻繁にバックアップを取っていない限り、この設定を有効化しないでください。}} |
+ | 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]。 |
||
− | {{hc|/etc/udev/rules.d/hd_power_save.rules|2=ACTION=="add", SUBSYSTEM=="scsi_host", KERNEL=="host*", ATTR{link_power_management_policy}="min_power"}} |
||
+ | 現在の設定は {{ic|/sys/class/scsi_host/host*/link_power_management_policy}} で確認したり設定したりできます: |
||
− | {{Warning|デバイスによっては SATA Active Link Power Management でデータが消失する可能性があります (例: [[Lenovo ThinkPad T440s|Lenovo T440s]] はこの問題を抱えていることが[http://lkml.indiana.edu/hypermail/linux/kernel/1401.2/02171.html 知られています])。バックアップを取っていない場合は設定を有効にしないでください。}} |
||
+ | |||
+ | $ grep . /sys/class/scsi_host/host*/link_power_management_policy |
||
+ | $ echo "med_power_with_dipm" >/sys/class/scsi_host/host''N''/link_power_management_policy |
||
+ | |||
+ | {| class="wikitable" |
||
+ | |+ 利用可能な ALPM 設定 |
||
+ | ! 設定 |
||
+ | ! 説明 |
||
+ | ! 省電力効果 |
||
+ | |- |
||
+ | | max_performance |
||
+ | | 現在のデフォルト |
||
+ | | 無し |
||
+ | |- |
||
+ | | medium_power |
||
+ | | - |
||
+ | | 約 1.0 ワット |
||
+ | |- |
||
+ | | med_power_with_dipm |
||
+ | | 推奨される設定 |
||
+ | | 約 1.5 ワット |
||
+ | |- |
||
+ | | min_power |
||
+ | | '''警告: データ損失の可能性あり''' |
||
+ | | 約 1.5 ワット |
||
+ | |} |
||
+ | |||
+ | [[udev]] ルールファイルを作成することで link_power_management_policy の設定を永続化させることができます。例えば: |
||
+ | |||
+ | {{hc|/etc/udev/rules.d/hd_power_save.rules|2= |
||
+ | ACTION=="add", SUBSYSTEM=="scsi_host", KERNEL=="host*", ATTR{link_power_management_policy}="med_power_with_dipm" |
||
+ | }} |
||
+ | |||
+ | {{Note| |
||
+ | * この設定を行うとアイドル状態になっているドライブにアクセスするときに遅延が発生するようになります。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}} に設定すると解決します。 |
||
+ | }} |
||
=== ハードディスクドライブ === |
=== ハードディスクドライブ === |
||
− | 設定できるドライブのパラメータについては [[hdparm]] を見て下さい。 |
+ | 設定できるドライブのパラメータについては [[hdparm#電源管理の設定]] を見て下さい。 |
− | 多数のプログラムがディスクに頻繁に書き込みをおこなう場合は省電力は効率的ではありません。全てのプログラムを調査して、いつどのようにプログラムがディスクに書き込むを行うのか調べるのがディスクの使用量を減らす道です。{{Pkg|iotop}} を使えばどのプログラムがディスクに頻繁に書き込みしているかわかります。他のヒントは[[ |
+ | 多数のプログラムがディスクに頻繁に書き込みをおこなう場合は省電力は効率的ではありません。全てのプログラムを調査して、いつどのようにプログラムがディスクに書き込むを行うのか調べるのがディスクの使用量を減らす道です。{{Pkg|iotop}} を使えばどのプログラムがディスクに頻繁に書き込みしているかわかります。他のヒントは [[パフォーマンスの向上#ストレージデバイス]] を見て下さい。 |
[[Fstab#atime オプション|noatime]] オプションを設定するなどの小さなことも馬鹿にできません。十分な RAM がある場合、[[スワップ#Swappiness|swappiness]] を無効化したり制限することでディスクへの書き込みが減る可能性があります。 |
[[Fstab#atime オプション|noatime]] オプションを設定するなどの小さなことも馬鹿にできません。十分な RAM がある場合、[[スワップ#Swappiness|swappiness]] を無効化したり制限することでディスクへの書き込みが減る可能性があります。 |
||
+ | [https://www.seagate.com/files/docs/pdf/en-GB/whitepaper/tp608-powerchoice-tech-provides-gb.pdf PowerChoice] テクノロジーを搭載した Seagate ドライブの場合、''EPC'' (Extended Power Conditions) 機能により [[hdparm]] から APM を設定するテクニックはうまく行きません。APM を設定する代わりに、{{AUR|openseachest}} パッケージを[[インストール]]し、ドライブの EPC を完全に無効化することができます (''X'' は実際のドライブレターに置き換えてください): |
||
− | === CD/DVD のスピンダウン === |
||
+ | |||
+ | # openSeaChest_PowerControl --scan |
||
+ | # openSeaChest_PowerControl -d /dev/sd''X'' -i |
||
+ | # openSeaChest_PowerControl -d /dev/sd''X'' --showEPCSettings |
||
+ | # openSeaChest_PowerControl -d /dev/sd''X'' --EPCfeature disable |
||
+ | # openSeaChest_PowerControl -d /dev/sd''X'' --showEPCSettings |
||
+ | |||
+ | 最後のコマンドでは、以下が出力されます: |
||
+ | ========================================================================================== |
||
− | [[udisks]] を使用してしばらくしてから CD/DVD ロムをスピンダウンさせるには: |
||
+ | 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/sd''X'' - 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 は、パーキングとスピンダウンが正常に無効化されたことを意味します。 |
||
− | # udisks --inhibit-polling /dev/sr0 |
||
== ツールとスクリプト == |
== ツールとスクリプト == |
||
790行目: | 561行目: | ||
* [https://www.thinkwiki.org/wiki/How_to_reduce_power_consumption ThinkWiki:How to reduce power consumption] |
* [https://www.thinkwiki.org/wiki/How_to_reduce_power_consumption ThinkWiki:How to reduce power consumption] |
||
* [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-07-19|812542}} |
2024年7月19日 (金) 21:16時点における最新版
関連記事
電源管理とは、アクティブでない時に電源を切ったりシステムのコンポーネントを低電力状態に切り替えたりする機能です。
Arch Linux では、電源管理は主に2つの部分からなります:
- Linux カーネルの設定。ハードウェアと対話します。
- ユーザスペースのツールの設定。カーネルと対話し、カーネルのイベントに応答します。ユーザスペースのツールの多くは、"ユーザフレンドリー"な方法でカーネルの設定を変更することもできます。利用可能なツールは #ユーザースペースツール を参照してください。
目次
ユーザースペースツール
以下のツールを使うことで、大量の設定を手動で設定しなくて済みます。どのツールも多かれ少なかれ同じような動作をするので、衝突を避けるためにツールはどれか一つだけを実行してください。電源管理カテゴリを見れば、Arch Linux にどんな電源管理の選択肢が存在するかわかります。
以下は省電力設定をするために作られた人気のあるスクリプトやツールです:
コンソール
- acpid — ACPI の電源管理イベントを届けるデーモン。netlink をサポート。
- Laptop Mode Tools — ノートパソコンの省電力設定をするユーティリティ。多少設定が要りますが省電力設定ユーティリティのデファクトスタンダードとされています。
- libsmbios — Dell SMBIOS テーブルと対話するためのライブラリおよびツール。
- powertop — 消費電力や電源管理の問題を診断して省電力設定を補助するツール。
- powerstat — ACPI や Intel RAPL インターフェイスを使用して電力消費量を測定するツール。
- systemd — システムおよびサービスマネージャ。
- TLP — Linux 向けの先進的な電源管理。
- TuneD — システム上のデバイスの監視と状況に応じた設定を行うデーモン。
- UPower — 電源デバイスの列挙、デバイスイベントの監視、履歴と統計のクエリを行う抽象化レイヤー。
グラフィカル
- batsignal — libnotify を使用してバッテリレベルの低下を警告する軽量バッテリモニタ。
- cbatticon — 軽量で高速なバッテリアイコンをシステムトレイに表示。
- GNOME Power Statistics — GNOME のシステム電力情報および統計。
- KDE Power Devil — Plasma 用の電源管理モジュール。
- LXQt Power Management — LXQt 用の電源管理モジュール。
- MATE Power Management — MATE 用電源管理ツール。
- MATE Power Statistics — MATE のシステム電力情報と統計。
- poweralertd — UPower 通知を伝播するデーモン。
- powerkit — デスクトップに依存しない電源マネージャー。
- Xfce Power Manager — Xfce 用の電源マネージャ。
- vattery — システムトレイ内のラップトップバッテリのステータスを表示する、 Vala で書かれたバッテリ監視アプリケーション。
ACPI イベント
systemd は一部の電源関連の ACPI イベントを処理します。これらのイベントの動作は /etc/systemd/logind.conf
や /etc/systemd/logind.conf.d/*.conf
で設定できます (logind.conf(5) を参照)。専用の電源マネージャを持たないシステムでは、この方法は acpid デーモンの代わりになりえます。ちなみに、acpid は通常、ACPI イベントに対応するために使われるデーモンです。
イベントの動作には、ignore
、poweroff
、reboot
、halt
、suspend
、hibernate
、hybrid-sleep
、suspend-then-hibernate
、lock
、kexec
のいずれかを指定することができます。ハイバーネートとサスペンドの場合は、適切にセットアップしなければなりません。イベントが設定されていない場合、systemd はデフォルトの動作を使用します。
イベントハンドラ | 説明 | デフォルトの動作 |
---|---|---|
HandlePowerKey
|
電源キー/ボタンが押された時にトリガされます。 | poweroff
|
HandleSuspendKey
|
サスペンドキー/ボタンが押された時にトリガされます。 | suspend
|
HandleHibernateKey
|
ハイバネートキー/ボタンが押された時にトリガされます。 | hibernate
|
HandleLidSwitch
|
ラップトップPCなどの蓋が閉じられた時に (以下のケースを除いて) トリガされます。 | suspend
|
HandleLidSwitchDocked
|
システムがドッキングステーションに繋がれている場合や、複数のディスプレイに繋がれている場合に蓋が閉じられるとトリガされます。 | ignore
|
HandleLidSwitchExternalPower
|
システムが外部電源に接続されている状況で蓋が閉じられた時にトリガされます。 | HandleLidSwitch に対して設定されている動作
|
変更を適用するには、systemd-logind.service
を再読み込みしてください。
電源マネージャ
一部のデスクトップ環境には、systemd の ACPI 設定の一部あるいは全てを inhibit する (一時的にオフにする) 電源マネージャが含まれています。そのような電源マネージャが実行されている場合、電源マネージャだけで ACPI イベントに対する動作を設定することができます。/etc/systemd/logind.conf
や /etc/systemd/logind.conf.d/*.conf
を変更する必要があるのは、電源マネージャによって inhibit されていないイベントに対する挙動を設定したい場合のみです。
注意点として、電源マネージャが適切なイベントに対して systemd を inhibit しないと、systemd がシステムをサスペンドし、その後サスペンドから復帰すると今度は電源マネージャがシステムを再びサスペンドしてしまうという状況に陥る可能性があります。KDE、GNOME、Xfce、そして MATE の電源マネージャは、必要な inhibited コマンドを発行します。inhibited コマンドが発行されない場合 (acpid などを使って ACPI イベントを処理している場合)、Handle
オプションを ignore
に設定してください。systemd-inhibit(1) も参照してください。
xss-lock
xss-lock は systemd の suspend
、hibernate
、lock-session
、unlock-session
イベントで適切なアクションを実行します (ロッカーを実行し、ユーザがロッカーをアンロックまたは kill するまで待機する)。xss-lock は DPMS イベントにも反応し、それに応じてロッカーを実行したり kill したりします。
例えば、以下のコマンドを自動起動します:
$ xss-lock -- i3lock -n -i background_image.png &
省電力
このセクションは、カスタムスクリプトや udev ルールなどの省電力設定をの作成するためのリファレンスです。競合を避けるために、設定が他のユーティリティによって管理されていないことを確認してください。
コンピュータが AC 電源またはバッテリーで動作しているかに関わらず、ここに記載されているほとんど全ての機能には使用する価値があります。ここで挙げている機能のほとんどは、パフォーマンスへの影響は無視できるレベルであり、大抵、壊れているハードウェアやドライバのせいでデフォルトで有効化されていないだけです。電力の使用量を減らすことは発熱を減らすことでもあり、動的なオーバークロックによって、最近の Intel や AMD の CPU ではパフォーマンスの向上につながることもあります。
Intel HWP (Intel Hardware P-state) をサポートする CPU
HWP 対応プロセッサで利用可能なエネルギー設定は、default
、performance
、balance_performance
、balance_power
、power
です。
以下を実行することで、利用可能な設定を確認できます:
$ 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) も参照してください。
オーディオ
カーネル
デフォルトでは、オーディオの省電力機能はほとんどのドライバーで無効になっています。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 の音声出力を無効化することで、オーディの電力要件を下げることもできます。適切なカーネルモジュール (例: Intel のハードウェアの場合は snd_hda_codec_hdmi
) をブラックリスト化することで可能です。
音声の再生開始時や停止時にポップノイズ
デフォルトでは、長時間アイドル状態にあるオーディオソースはサスペンドされます。この時に音声を再生したりマイクを使用し始めたりすると、ポップノイズが発生することがあります。解決策はそれぞれ対応するページを見てください:
- Advanced Linux Sound Architecture/トラブルシューティング#再生を開始・停止するとポップノイズが鳴る
- PulseAudio/トラブルシューティング#音声の再生時と停止時に破裂音
- PipeWire#再生開始時に明らかな音声の遅延やポップノイズ/音割れが発生する
バックライト
バックライトを見て下さい。
Bluetooth
Bluetooth を完全に無効化するには、btusb
と bluetooth
モジュールをブラックリストに入れてください。
あるいは、以下の 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]:
- BIOS が何らかの理由で ASPM を無効化した (コンフリクトが起こるから?)。
- PCIE が ASPM を必要とするが、L0s は任意である (なので、L0s は無効化され、L1 だけが有効化されるかもしれません)。
- ASPM 用に BIOS がプログラムされていないか、BIOS にバグが存在する。
上記で ASPM がサポートされていないと報告されたが、ハードウェアが ASPM をサポートしていると思われる場合は、カーネルが ASPM を管理できるようにするために pcie_aspm=force
カーネルパラメータで ASPM を強制的に有効化できます。
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"
上記のルールは未使用のデバイスを全てパワーダウンしますが、一部のデバイスが復帰しなくなってしまいます。サポートしていることが分かっているデバイスのみに対して 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", 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 カーネルドキュメントを見て下さい。
SATA Active Link Power Management
Linux 4.15 から、med_power_with_dipm
と呼ばれる設定が存在しています。これは、Windows IRST ドライバ設定の動作と一致するものであり、最近の SSD や HDD ではデータの損失は発生しないはずです。(アイドル状態で) 1.0 から 1.5 ワットの節約になることもあります。これは、Linux 4.16 から Intel ベースのノート PC でデフォルトの設定となっています [4]。
現在の設定は /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
設定 | 説明 | 省電力効果 |
---|---|---|
max_performance | 現在のデフォルト | 無し |
medium_power | - | 約 1.0 ワット |
med_power_with_dipm | 推奨される設定 | 約 1.5 ワット |
min_power | 警告: データ損失の可能性あり | 約 1.5 ワット |
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"
ハードディスクドライブ
設定できるドライブのパラメータについては 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 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 スクリプトのサンプル:
- ftw (パッケージ: ftw-gitAUR)
- powersave
- throttlectl (throttlectlAUR)
上記の 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
ユーザにシャットダウンを許可する
ボタンと蓋スイッチのイベント
サスペンド、電源オフ、そしてハイバネートのボタンのイベントと、蓋を閉じた時のイベントは、#ACPI イベント で説明されているように logind によって処理されます。
systemd-logind を使う
polkit を使用している場合、非リモートセッションのユーザは、セッションが壊れていない限り、電源関連のコマンドを発行することができます。
セッションがアクティブであることを確認するには:
$ loginctl show-session $XDG_SESSION_ID --property=Active
アクティブであるならば、ユーザはコマンドラインで systemctl のコマンドを使用したり、メニューに追加したりできます:
$ systemctl poweroff $ systemctl reboot
systemctl suspend
や systemctl hibernate
といった他のコマンドも使用できます。systemctl(1) の System Commands セクションを参照してください。
sudo を使う
sudo をインストールし、sudo 権限をユーザに与えてください。sudo 権限が与えられたユーザは、sudo systemctl
コマンド (例: sudo systemctl poweroff
、sudo systemctl reboot
、sudo systemctl suspend
、sudo 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:
タグを使用してください。