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

提供: ArchWiki
ナビゲーションに移動 検索に移動
(文字列「http://superuser.com/」を「https://superuser.com/」に置換)
(同期)
 
(7人の利用者による、間の46版が非表示)
2行目: 2行目:
 
[[en:Power management]]
 
[[en:Power management]]
 
[[es:Power management]]
 
[[es:Power management]]
[[it:Shutdown Pressing Power Button]]
+
[[pt:Power management]]
  +
[[ru:Power management]]
 
[[zh-hans:Power management]]
 
[[zh-hans:Power management]]
 
{{Related articles start}}
 
{{Related articles start}}
{{Related|サスペンドとハイバネート}}
+
{{Related|電源管理/サスペンドとハイバネート}}
  +
{{Related|電源管理/復帰トリガー}}
 
{{Related|Display Power Management Signaling}}
 
{{Related|Display Power Management Signaling}}
 
{{Related|CPU 周波数スケーリング}}
 
{{Related|CPU 周波数スケーリング}}
13行目: 15行目:
 
{{Related|udev}}
 
{{Related|udev}}
 
{{Related articles end}}
 
{{Related articles end}}
  +
[[Wikipedia:Power management|電源管理]]とは、アクティブでない時に電源を切ったりシステムのコンポーネントを低電力状態に切り替えたりする機能です。
   
  +
Arch Linux では、電源管理は主に2つの部分からなります:
電源管理とはシステムが使われていない場合に電力の供給を切ったり低電力状態にする機能のことです。このページでは Arch Linux における電源管理の全体的な外観を説明します。
 
   
  +
# Linux カーネルの設定。ハードウェアと対話します。
ハードウェアの電源管理の設定を直接変更するときはカーネルの設定を使います:
 
* [[カーネルパラメータ]]
+
#* [[カーネルパラメータ]]
* [[カーネルモジュール]]
+
#* [[カーネルモジュール]]
* [[udev]] ルール
+
#* [[udev]] ルール
  +
# ユーザスペースのツールの設定。カーネルと対話し、カーネルのイベントに応答します。ユーザスペースのツールの多くは、"ユーザフレンドリー"な方法でカーネルの設定を変更することもできます。利用可能なツールは [[#ユーザースペースツール]] を参照してください。
 
また、カーネルと対話してイベントを処理する電源管理ツールが多数あります: [[#ユーザースペースツール]] を参照。
 
 
{{Note|ひとつの設定箇所・ツールで設定した電力設定が他の設定箇所・ツールで上書きされる可能性もあるので注意してください。}}
 
   
 
== ユーザースペースツール ==
 
== ユーザースペースツール ==
   
以下のツールを使うことで手動で多数の設定を行うかわりにます。どのツールも多かれ少なかれ同じような動作をするので、衝突をけるためにツールはどれか一つだけを実行してください。[[:Category:電源管理|電源管理カテゴリ]]を見ることで Arch Linux にどんな電源管理の選択肢が存在するかわかります。
+
以下のツールを使うことで、大量の設定を手動で設定くて済みます。どのツールも多かれ少なかれ同じような動作をするので、衝突をけるためにツールはどれか'''一つだけ'''を実行してください。[[:Category:電源管理|電源管理カテゴリ]]を見れば、Arch Linux にどんな電源管理の選択肢が存在するかわかります。
   
 
以下は省電力設定をするために作られた人気のあるスクリプトやツールです:
 
以下は省電力設定をするために作られた人気のあるスクリプトやツールです:
  +
  +
=== コンソール ===
   
 
* {{App|[[acpid]]|ACPI の電源管理イベントを届けるデーモン。netlink をサポート。|https://sourceforge.net/projects/acpid2/|{{Pkg|acpid}}}}
 
* {{App|[[acpid]]|ACPI の電源管理イベントを届けるデーモン。netlink をサポート。|https://sourceforge.net/projects/acpid2/|{{Pkg|acpid}}}}
 
* {{App|[[Laptop Mode Tools]]|ノートパソコンの省電力設定をするユーティリティ。多少設定が要りますが省電力設定ユーティリティのデファクトスタンダードとされています。|https://github.com/rickysarraf/laptop-mode-tools|{{AUR|laptop-mode-tools}}}}
 
* {{App|[[Laptop Mode Tools]]|ノートパソコンの省電力設定をするユーティリティ。多少設定が要りますが省電力設定ユーティリティのデファクトスタンダードとされています。|https://github.com/rickysarraf/laptop-mode-tools|{{AUR|laptop-mode-tools}}}}
* {{App|[[powertop]]|消費電力や電源管理の問題を診断して省電力設定を補助するツール。|https://01.org/powertop/|{{Pkg|powertop}}}}
+
* {{App|libsmbios|Dell SMBIOS テーブルと対話するためのライブラリおよびツール。|https://github.com/dell/libsmbios|{{Pkg|libsmbios}}}}
  +
* {{App|[[powertop]]|消費電力や電源管理の問題を診断して省電力設定を補助するツール。|https://github.com/fenrus75/powertop|{{Pkg|powertop}}}}
* [[systemd]]
 
  +
* {{App|powerstat|ACPI や Intel RAPL インターフェイスを使用して電力消費量を測定するツール。|https://github.com/ColinIanKing/powerstat|{{AUR|powerstat}}}}
* {{App|[[TLP]]|Linux 向けの先進的な電源管理。|http://linrunner.de/tlp|{{Pkg|tlp}}}}
 
  +
* {{App|[[systemd]]|システムおよびサービスマネージャ。|https://systemd.io/|{{Pkg|systemd}}}}
  +
* {{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}}}}
   
  +
=== グラフィカル ===
== systemd による電源管理 ==
 
   
  +
* {{App|batsignal|libnotify を使用してバッテリレベルの低下を警告する軽量バッテリモニタ。|https://github.com/electrickite/batsignal|{{AUR|batsignal}}}}
=== ACPI イベント ===
 
  +
* {{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|KDE Power Devil|Plasma 用の電源管理モジュール。|https://invent.kde.org/plasma/powerdevil|{{Pkg|powerdevil}}}}
  +
* {{App|LXQt Power Management|LXQt 用の電源管理モジュール。|https://github.com/lxqt/lxqt-powermanagement|{{Pkg|lxqt-powermanagement}}}}
  +
* {{App|MATE Power Management|MATE 用電源管理ツール。|https://github.com/mate-desktop/mate-power-manager|{{Pkg|mate-power-manager}}}}
  +
* {{App|MATE Power Statistics|MATE のシステム電力情報と統計。|https://github.com/mate-desktop/mate-power-manager|{{Pkg|mate-power-manager}}}}
  +
* {{App|poweralertd|UPower 通知を伝播するデーモン。|https://git.sr.ht/~kennylevinsen/poweralertd|{{AUR|poweralertd}}}}
  +
* {{App|powerkit|デスクトップに依存しない電源マネージャー。|https://github.com/rodlie/powerkit|{{AUR|powerkit}}}}
  +
* {{App|Xfce Power Manager|Xfce 用の電源マネージャ。|https://docs.xfce.org/xfce/xfce4-power-manager/start|{{Pkg|xfce4-power-manager}}}}
  +
* {{App|vattery|システムトレイ内のラップトップバッテリのステータスを表示する、 Vala で書かれたバッテリ監視アプリケーション。|https://www.jezra.net/projects/vattery.html|{{AUR|vattery}}}}
   
  +
== ACPI イベント ==
systemd は電源関連の [[Wikipedia:Advanced_Configuration_and_Power_Interface|ACPI]] イベントを扱えます。{{ic|/etc/systemd/logind.conf}} や {{ic|/etc/systemd/logind.conf.d/*.conf}} のオプションを使って設定できます:
 
   
  +
''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 イベントに対応するために使われるデーモンです。
* {{ic|HandlePowerKey}}: パワーキーが押された時に行う動作を定めます。
 
* {{ic|HandleSuspendKey}}: サスペンドキーが押された時に行う動作を定めます。
 
* {{ic|HandleHibernateKey}}: ハイバネートキーが押された時に行う動作を定めます。
 
* {{ic|HandleLidSwitch}}: フタが閉じられた時に行う動作を定めます。
 
   
定めることができる動作は {{ic|ignore}}, {{ic|poweroff}}, {{ic|reboot}}, {{ic|halt}}, {{ic|suspend}}, {{ic|hibernate}}, {{ic|hybrid-sleep}}, {{ic|lock}}, {{ic|kexec}} のいずれかです。
+
イベントの動作{{ic|ignore}}{{ic|poweroff}}{{ic|reboot}}{{ic|halt}}{{ic|suspend}}{{ic|hibernate}}{{ic|hybrid-sleep}}、{{ic|suspend-then-hibernate}}、{{ic|lock}}{{ic|kexec}} のいずれかを指定することがきます。ハイバーネートとサスペンドの場合は、適切に[[電源管理/サスペンドとハイバネート|セットアップ]]しなければなりません。イベントが設定されていない場合、''systemd'' はデフォルトの動作を使用します。
   
  +
{| class="wikitable sortable"
オプションが設定されていない場合、systemd が使うデフォルトは: {{ic|1=HandlePowerKey=poweroff}}, {{ic|1=HandleSuspendKey=suspend}}, {{ic|1=HandleHibernateKey=hibernate}}, {{ic|1=HandleLidSwitch=suspend}}。
 
  +
!イベントハンドラ
  +
!説明
  +
!デフォルトの動作
  +
|-
  +
|{{ic|HandlePowerKey}}
  +
|電源キー/ボタンが押された時にトリガされます。
  +
|{{ic|poweroff}}
  +
|-
  +
|{{ic|HandleSuspendKey}}
  +
|サスペンドキー/ボタンが押された時にトリガされます。
  +
|{{ic|suspend}}
  +
|-
  +
|{{ic|HandleHibernateKey}}
  +
|ハイバネートキー/ボタンが押された時にトリガされます。
  +
|{{ic|hibernate}}
  +
|-
  +
|{{ic|HandleLidSwitch}}
  +
|ラップトップPCなどの蓋が閉じられた時に (以下のケースを除いて) トリガされます。
  +
|{{ic|suspend}}
  +
|-
  +
|{{ic|HandleLidSwitchDocked}}
  +
|システムがドッキングステーションに繋がれている場合や、複数のディスプレイに繋がれている場合に蓋が閉じられるとトリガされます。
  +
|{{ic|ignore}}
  +
|-
  +
|{{ic|HandleLidSwitchExternalPower}}
  +
|システムが外部電源に接続されている状況で蓋が閉じられた時にトリガされます。
  +
|{{ic|HandleLidSwitch}} に対して設定されている動作
  +
|}
   
  +
変更を適用するには、{{ic|systemd-logind.service}} を[[リロード|再読み込み]]してください。
グラフィカルセットアップを走らせていなかったり [[i3]] や [[awesome]] などシンプルなウィンドウマネージャしか使っていないシステムでは、これで ACPI イベントに反応するものとして使っている [[acpid]] デーモンを置き換えることが可能です。
 
   
 
{{Note|
 
{{Note|
  +
* ''systemd'' は AC とバッテリの ACPI イベントを処理することができません。なので、[[Laptop Mode Tools]] や他の似たようなツールを使用している場合、[[acpid]] が依然として必要です。
* 変更を適用するには {{ic|systemctl restart systemd-logind}} を実行してください。
 
  +
* 蓋のスイッチを短い間隔で動作させると、''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 は AC やバッテリの ACPI イベントを取り扱うことはできません、[[Laptop Mode Tools]] などのツールを使うには、依然として [[acpid]] が必要になります。
 
* 外付けモニターが接続されている場合、フタが閉じられても {{ic|HandleLidSwitch}} オプションはアクションを実行しません。
 
 
}}
 
}}
{{Warning|1=[[systemd]] バージョン 211 と 212 では、{{ic|HandleLidSwitch}} オプションは [[NVIDIA]] バイナリドライバーがインストールされている環境では使用できません。この問題はバージョン 213 で修正されています。[https://bugs.freedesktop.org/show_bug.cgi?id=76267 systemd のバグトラッカー]や [https://bbs.archlinux.org/viewtopic.php?pid=1410252#p1410252 BBS のトピック]を参照してください。}}
 
   
==== 電源マネージャ ====
+
=== 電源マネージャ ===
   
[[デスクトップ環境]]には電源マネージャが含まれていることがあります。現在ージョンの systemdは、{{ic|Handle*}} オプションは電源マネージャによって "inhibited" (一時的にオフ) にされない限りシステム全体適用されま。停止されなければ、systemd がシステムサスペンドした状態で終わることができ、立ち上がった時に他電源マネージャによってもう一度停止されます。
+
一部の[[デスクトップ環境]]には、''systemd'' の ACPI 設定の一部あるいは全てを [https://systemd.io/INHIBITOR_LOCKS/ inhibit] する (一時的にオフにする) 電源マネージャが含まれています。ような電源マネージャが実行されている場合、電源マネージャだけで ACPI イベントに対する動作を設定することがきます。{{ic|/etc/systemd/logind.conf}} や {{ic|/etc/systemd/logind.conf.d/*.conf}} を変更する必要があるの電源マネージャによって inhibit されていないイベントる挙動設定したい場合みです。
   
最新の [[KDE]], [[GNOME]], [[Xfce]] の電源マネージャは "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 ====
+
=== xss-lock ===
   
{{pkg|xss-lock}} は systemd の {{ic|suspend}}, {{ic|hibernate}}, {{ic|lock-session}}, {{ic|unlock-session}} イベントで適切なアクションを実行します (ロッカーの起動など)。''xss-lock'' は [[DPMS]] イベントにも反応します。
+
{{pkg|xss-lock}} は systemd の {{ic|suspend}}{{ic|hibernate}}{{ic|lock-session}}{{ic|unlock-session}} イベントで適切なアクションを実行します (ロッカーを実行し、ユーザがロッカーをアンロックまたは kill するまで待機する)。''xss-lock'' は [[DPMS]] イベントにも反応し、それに応じてロッカーを実行したり kill したりします。
   
xss-lock を[[自動起動]]するときは以下のようなコマンドを使います:
+
例えば、以下のコマンドを[[自動起動]]ます:
   
xss-lock -- i3lock -n -i ''background_image.png'' &
+
$ xss-lock -- i3lock -n -i ''background_image.png'' &
   
  +
== 省電力 ==
xss-lock によってサスペンド時に CPU 消費率が 100% になる場合、[https://bitbucket.org/raymonad/xss-lock/commits/1e158fb20108058dbd62bd51d8e8c003c0a48717 commit 1e158f] にあるように {{AUR|xss-lock-git}} を使うことで問題が解決します。
 
   
  +
{{Note|ノート PC 固有の電源管理 (バッテリーモニタリングなど) については [[ノートパソコン#電源管理]] を参照してください。また、使用している CPU と GPU に関するページも参照してください (例: [[Ryzen]]、[[AMDGPU]])。}}
=== サスペンドとハイバネート ===
 
   
  +
このセクションは、カスタムスクリプトや udev ルールなどの省電力設定をの作成するためのリファレンスです。競合を避けるために、設定が[[#ユーザースペースツール|他のユーティリティ]]によって管理されていないことを確認してください。
''systemd'' はカーネルに入っているサスペンド・レジューム機能を使ってサスペンド (suspend to RAM)・ハイバネート・ハイブリッドサスペンドを行うコマンドを提供しています。また、サスペンドの前後の行動をカスタマイズするフックを追加する仕組みも存在します。
 
   
  +
コンピュータが AC 電源またはバッテリーで動作しているかに関わらず、ここに記載されているほとんど全ての機能には使用する価値があります。ここで挙げている機能のほとんどは、パフォーマンスへの影響は無視できるレベルであり、大抵、壊れているハードウェアやドライバのせいでデフォルトで有効化されていないだけです。電力の使用量を減らすことは発熱を減らすことでもあり、[[Wikipedia:ja:インテル ターボ・ブースト・テクノロジー|動的なオーバークロック]]によって、最近の Intel や AMD の CPU ではパフォーマンスの向上につながることもあります。
{{Note|''systemd'' はデフォルトの''カーネル''バックエンドに加えて、他のサスペンドバックエンド ([[Uswsusp]]) を使ってコンピュータをサスペンドしたりハイバネートすることもできます。例えば [[Uswsusp#systemd を使う]] を見て下さい。}}
 
   
  +
=== Intel HWP (Intel Hardware P-state) をサポートする CPU ===
{{ic|systemctl suspend}} は何も設定しなくても動きますが、あなたの環境で {{ic|systemctl hibernate}} を使うには[[サスペンドとハイバネート#ハイバネーション]]の指示に従う必要があります。
 
   
  +
HWP 対応プロセッサで利用可能なエネルギー設定は、{{ic|default}}、{{ic|performance}}、{{ic|balance_performance}}、{{ic|balance_power}}、{{ic|power}} です。
==== ハイブリッドスリープ ====
 
   
  +
以下を実行することで、利用可能な設定を確認できます:
{{ic|systemctl hybrid-sleep}} はハイバネートとサスペンドを同時に行います。サスペンドとハイバネートのメリット・デメリットを組み合わせたものになります。突然コンピュータの電源が喪失 (コンセントが抜けたりバッテリーが切れる) しても、ハイバネートから復帰するため便利です。電源喪失がない場合、サスペンドから復帰するため、ハイバネートから復帰するよりも高速に復帰します。ただし、"hybrid-sleep" はハイバネートを機能させるためにメモリをスワップする必要があるので、普通の {{ic|systemctl suspend}} よりもスリープするのにかかる時間が長くなります。ハイブリッドスリープの別の方法として[[#遅延ハイバネーション|遅延ハイバネーション]]があります。
 
   
  +
$ cat /sys/devices/system/cpu/cpufreq/policy*/energy_performance_available_preferences
==== サスペンドやハイバネーションの代わりに常にハイブリッドスリープを使う ====
 
   
サスペンドやハバネートが要求されたもハイブリッドスリ行うように systemd を設定することができます
+
以下のファルを作成することで、より多くのエネルギーを節約するように設定できます:
   
  +
{{hc|/etc/tmpfiles.d/energy_performance_preference.conf|
デフォルトのサスペンドとハイバネートのアクションは {{ic|/etc/systemd/sleep.conf}} ファイルで設定します。両方ともハイブリッドスリープを実行するように設定するには:
 
  +
w /sys/devices/system/cpu/cpufreq/policy*/energy_performance_preference - - - - balance_power
 
{{hc|/etc/systemd/sleep.conf|2=
 
[Sleep]
 
# suspend=hybrid-sleep
 
SuspendMode=suspend
 
SuspendState=disk
 
# hibernate=hybrid-sleep
 
HibernateMode=suspend
 
HibernateState=disk
 
 
}}
 
}}
   
  +
Intel プロセッサの電力とパフォーマンスのポリシーに関する詳細は {{man|8|x86_energy_perf_policy}} man ページを参照してください。一時ファイル/ディレクトリに関する詳細は man ページ {{man|8|systemd-tmpfiles}} や {{man|5|tmpfiles.d}} も参照してください。
詳しくは {{man|5|sleep.conf.d}} のマニュアルページを読んでください。
 
   
=== スリプフック ===
+
=== ディオ ===
   
===== サスペンド/リジュム サービスファイ=====
+
==== ル ====
   
  +
デフォルトでは、オーディオの省電力機能はほとんどのドライバーで無効になっています。{{ic|power_save}} パラメータを設定することで有効にすることができます。アイドルモードに移行するまでの時間を秒数で指定します。1秒後にオーディオカードをアイドル状態にするには、Intel のサウンドカードの場合、以下のファイルを作成してください:
サービスファイルを suspend.target, hibernate.target, sleep.target にフックすることでサスペンド・ハイバネート前後に行うアクションを設定できます。ユーザー・システムアクションを行うにはファイルを分割する必要があります。ユーザーサービスファイルを作動させるには、{{ic|# systemctl enable suspend@<user> && systemctl enable resume@<user>}}。例:
 
   
{{hc|/etc/systemd/system/suspend@.service|2=<nowiki>
+
{{hc|/etc/modprobe.d/audio_powersave.conf|2=
  +
options snd_hda_intel power_save=1
[Unit]
 
Description=User suspend actions
 
Before=sleep.target
 
 
[Service]
 
User=%I
 
Type=forking
 
Environment=DISPLAY=:0
 
ExecStartPre= -/usr/bin/pkill -u %u unison ; /usr/local/bin/music.sh stop ; /usr/bin/mysql -e 'slave stop'
 
ExecStart=/usr/bin/sflock
 
ExecStartPost=/usr/bin/sleep 1
 
 
[Install]
 
WantedBy=sleep.target</nowiki>}}
 
 
{{hc|/etc/systemd/system/resume@.service|2=<nowiki>
 
[Unit]
 
Description=User resume actions
 
After=suspend.target
 
 
[Service]
 
User=%I
 
Type=simple
 
ExecStartPre=/usr/local/bin/ssh-connect.sh
 
ExecStart=/usr/bin/mysql -e 'slave start'
 
 
[Install]
 
WantedBy=suspend.target</nowiki>}}
 
 
{{Note|
 
* [[アプリケーション一覧/セキュリティ#スクリーンロック|slock]] を使用する場合、スリープする前にサービスを起動してはいけません。デフォルトの simple サービスタイプを使って下さい。でないと、先に ''slock'' が起動して、ロックを解除しないとスリープに入らないようになってしまいます。forking タイプを指定しても解決しません。
 
* スクリーンがロックされる前にスクリーンロックが返ってきてしまい、サスペンドから復帰するときに画面が点滅することがあります。{{ic|1=ExecStartPost=/usr/bin/sleep 1}} で遅延を追加することで解決します。}}
 
 
root アクションでは ({{ic|# systemctl enable root-suspend}} で有効にしてください):
 
 
{{hc|/etc/systemd/system/root-resume.service|2=<nowiki>
 
[Unit]
 
Description=Local system resume actions
 
After=suspend.target
 
 
[Service]
 
Type=simple
 
ExecStart=/usr/bin/systemctl restart mnt-media.automount
 
 
[Install]
 
WantedBy=suspend.target</nowiki>}}
 
 
{{hc|/etc/systemd/system/root-suspend.service|2=<nowiki>
 
[Unit]
 
Description=Local system suspend actions
 
Before=sleep.target
 
 
[Service]
 
Type=simple
 
ExecStart=-/usr/bin/pkill sshfs
 
 
[Install]
 
WantedBy=sleep.target</nowiki>}}
 
 
サービスファイルについてのヒント (詳しくは {{man|5|systemd.service}}):
 
* {{ic|1=<nowiki>Type=oneshot</nowiki>}} の場合、複数の {{ic|1=<nowiki>ExecStart=</nowiki>}} 行を使うことができます。それ以外の場合は使える ExecStart は一行だけです。{{ic|ExecStartPre}} を使ったりコマンドをセミコロンで分割することでコマンドを追加することができます(最初の例を見て下さい -- セミコロンの前後にはスペースが必要です)。
 
* コマンドの前に '-' を付けるとエラーが起こっても(終了ステータスが0以外でも)無視され、コマンドは成功したとして扱われます。
 
* サービスファイルのトラブルシューティングのときにエラーを見つけるには [[Systemd#Journal|journalctl]] を使うのがベストです。
 
 
===== サスペンド/レジューム サービスファイルの統合 =====
 
 
サスペンド/レジューム サービスファイルを統合すれば、様々なフェイズ(スリープ・レジューム)やターゲット(サスペンド・ハイバネート・ハイブリッドスリープ)でやることをひとつのフックで行うことができます。
 
 
例と説明:
 
 
{{hc|/etc/systemd/system/wicd-sleep.service|2=<nowiki>
 
[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</nowiki>}}
 
 
* {{ic|1=<nowiki>RemainAfterExit=yes</nowiki>}}: 起動後、明示的に止められるまでサービスは常時 active になります。
 
* {{ic|1=<nowiki>StopWhenUnneeded=yes</nowiki>}}: active のとき、サービスは sleep.target が停止した後に止められます。
 
* sleep.target は suspend.target, hibernate.target, hybrid-sleep.target から呼ばれ sleep.target 自身は StopWhenUnneeded サービスなので、タスクごとにフックが正しく起動・停止することが保証されています。
 
 
==== 遅延ハイバネーション ====
 
 
遅延ハイバネーションではスリープフックを利用して通常通りにサスペンドしますが、その後にハイバネーションを実行するタイマーをセットします。ハイバネーションを最初に実行しないためスリープに入るのが {{ic|systemctl hybrid-sleep}} よりも早くなります。ただし、"hybrid-sleep" とは違って、サスペンド中にハイバネーションを使うことで電源喪失から保護するようなことはできません。そのため遅延ハイバネーションはデスクトップなどよりもノートパソコンで使うほうが適しています。ハイバネーションが遅延されるため、サスペンド中はノートパソコンのバッテリーだけが使われ、それからハイバネーションが実行されます。バッテリーがなくなるまでサスペンドし続ける "hybrid-sleep" よりも消費電力を抑えることが可能です。ノートパソコンにハードディスクが搭載されている場合、ハイバネートするためにサスペンドから復帰したとき、ノートパソコンを数秒間は動かさないほうがよいでしょう。遅延ハイバネーションは消費電力だけでなくセキュリティに関しても利点があります (例: 完全なディスク暗号化を使っている場合)。サンプルスクリプトは [https://superuser.com/questions/298672/linuxhow-to-hibernate-after-a-period-of-sleep こちら] にあります。systemd のスリープフックについては [https://bbs.archlinux.org/viewtopic.php?pid=1420279#p1420279 こちらの投稿] も参照してください。
 
 
{{hc|/etc/systemd/system/suspend-to-hibernate.service|<nowiki>
 
[Unit]
 
Description=Delayed hibernation trigger
 
Documentation=https://bbs.archlinux.org/viewtopic.php?pid=1420279#p1420279
 
Documentation=https://wiki.archlinux.org/index.php/Power_management
 
Conflicts=hibernate.target hybrid-sleep.target
 
Before=sleep.target
 
StopWhenUnneeded=true
 
 
[Service]
 
Type=oneshot
 
RemainAfterExit=yes
 
Environment="WAKEALARM=/sys/class/rtc/rtc0/wakealarm"
 
Environment="SLEEPLENGTH=+2hour"
 
ExecStart=-/usr/bin/sh -c 'echo -n "alarm set for "; date +%%s -d$SLEEPLENGTH | tee $WAKEALARM'
 
ExecStop=-/usr/bin/sh -c '\
 
alarm=$(cat $WAKEALARM); \
 
now=$(date +%%s); \
 
if [ -z "$alarm" ] || [ "$now" -ge "$alarm" ]; then \
 
echo "hibernate triggered"; \
 
systemctl hibernate; \
 
else \
 
echo "normal wakeup"; \
 
fi; \
 
echo 0 > $WAKEALARM; \
 
'
 
 
[Install]
 
WantedBy=sleep.target
 
</nowiki>
 
 
}}
 
}}
 
{{ic|Before}} と {{ic|Conflicts}} オプションはハイバネートでは動作させないようにするために必要です。そうしないと遅延ハイバネーションが実行されたときにサービスが2回実行されてしまいます。{{ic|WantedBy}} と {{ic|StopWhenUnneeded}} オプションはスリープの前に実行して復帰時に停止するように設定しています。サービスを[[有効化]]してください。
 
 
==== /usr/lib/systemd/system-sleep のフック ====
 
 
Systemd は {{ic|/usr/lib/systemd/system-sleep/}} 内の全ての実行可能ファイルを実行するときに、2つの引数を渡します:
 
 
* 引数 1: {{ic|pre}} か {{ic|post}}。マシンが停止するときと起動するとき。
 
* 引数 2: {{ic|suspend}} か {{ic|hibernate}} か {{ic|hybrid-sleep}}。呼び出されるものによる。
 
 
systemd はスクリプトを(ひとつずつではなく)同時に実行します。
 
 
カスタムスクリプトの出力は {{ic|systemd-suspend.service}}, {{ic|systemd-hibernate.service}}, {{ic|systemd-hybrid-sleep.service}} によって記録されます。出力を見るには systemd の [[Systemd#Journal|journal]] を使って下さい:
 
# journalctl -b -u systemd-suspend
 
 
{{Note|カスタムスクリプトを使うかわりに {{ic|sleep.target}}, {{ic|suspend.target}}, {{ic|hibernate.target}}, {{ic|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}}
 
 
スクリプトを実行可能にするのを忘れないで下さい:
 
# chmod a+x /usr/lib/systemd/system-sleep/example.sh
 
 
詳しくは {{man|7|systemd.special}} や {{man|8|systemd-sleep}} を見てください。
 
 
== 省電力設定 ==
 
 
{{Note|[[ノートパソコン#電源管理]]ではノートパソコンでの電源管理(特にバッテリー状態の監視)を説明しています。}}
 
 
このセクションでは省電力機能を使用するのに必要な設定を扱います。コンピュータが AC 電源またはバッテリーで動作しているかに関わらず、ここに記載されているほとんど全ての機能には使用する価値があります。パフォーマンスへの影響は軽微ですが、大抵壊れているハードウェアやドライバーのためにデフォルトでは有効になっていません。電力の使用量を減らすことは熱を減らすことでもあり、[[Wikipedia:ja:インテル ターボ・ブースト・テクノロジー|動的なオーバークロック]]によって、最近の Intel や AMD の CPU ではパフォーマンスの向上につながることもあります。
 
 
udev ルールなどを使ってスクリプトや省電力設定を自分で作成したい場合は以下の設定を参考にすることができます。
 
 
{{Note|以下で記述しているルールのほとんどは [[TLP]] などのツールで管理することもでき、ツールを使いながら自分でも管理するのは不得策です。}}
 
 
=== オーディオ ===
 
 
デフォルトでは、オーディオの省電力機能はほとんどのドライバーで無効になっています。{{ic|power_save}} パラメータを設定することで有効にすることができます。アイドルモードに移行するまでの時間を秒数で指定します。1秒後にサウンドカードをアイドル状態にするには、Intel の場合、以下を作成:
 
 
{{hc|/etc/modprobe.d/audio_powersave.conf|2=options snd_hda_intel power_save=1}}
 
   
 
ac97 の場合は以下を使って下さい:
 
ac97 の場合は以下を使って下さい:
295行目: 154行目:
 
{{Note|
 
{{Note|
 
* サウンドカードの製造者や使われているカーネルドライバーの情報を取得するには、{{ic|lspci -k}} を実行してください。
 
* サウンドカードの製造者や使われているカーネルドライバーの情報を取得するには、{{ic|lspci -k}} を実行してください。
* サウンドカードの電源状態を変更すると壊れたハードウェアでポップノイズがまじったり著しい遅延が発生することがあります。
+
* サウンドカードの電源状態を変更すると壊れたハードウェアでポップノイズがまじったり著しい遅延が発生することがあります。
 
}}
 
}}
   
HDMI の音声出力を無効化することで消費電力を下げることもできます。適切なカーネルモジュールを[[ブラックリスト]]に追加してください (例: {{ic|snd_hda_codec_hdmi}})。
+
HDMI の音声出力を無効化することで、オーディの電力要件を下げることもできます。適切なカーネルモジュール (例: Intel のハードウェアの場合は {{ic|snd_hda_codec_hdmi}}) を[[ブラックリスト|ブラックリスト化]]することで可能です
  +
  +
==== 音声の再生開始時や停止時にポップノイズ ====
  +
  +
デフォルトでは、長時間アイドル状態にあるオーディオソースはサスペンドされます。この時に音声を再生したりマイクを使用し始めたりすると、ポップノイズが発生することがあります。解決策はそれぞれ対応するページを見てください:
  +
  +
* [[Advanced Linux Sound Architecture/トラブルシューティング#再生を開始・停止するとポップノイズが鳴る]]
  +
* [[PulseAudio/トラブルシューティング#音声の再生時と停止時に破裂音]]
  +
* [[PipeWire#再生開始時に明らかな音声の遅延やポップノイズ/音割れが発生する]]
   
 
=== バックライト ===
 
=== バックライト ===
306行目: 173行目:
 
=== Bluetooth ===
 
=== Bluetooth ===
   
[[Bluetooth]] を完全に無効化するには、{{ic|btusb}} と {{ic|bluetooth}} モジュールを[[カーネルモジュール#ブラックリスト|ブラックリスト]]に入れてください。
+
[[Bluetooth]] を完全に無効化するには、{{ic|btusb}} と {{ic|bluetooth}} モジュールを[[ブラックリスト]]に入れてください。
   
  +
あるいは、以下の udev ルールを作成してください:
一時的にだけ bluetooth をオフにするには、''rfkill'' を使用します:
 
   
# rfkill block bluetooth
+
{{hc|/etc/udev/rules.d/50-bluetooth.rules|2=
 
もしくは udev ルールを使って:
 
 
{{hc|/etc/udev/rules.d/50-bluetooth.rules|<nowiki>
 
 
# disable bluetooth
 
# disable bluetooth
 
SUBSYSTEM=="rfkill", ATTR{type}=="bluetooth", ATTR{state}="0"
 
SUBSYSTEM=="rfkill", ATTR{type}=="bluetooth", ATTR{state}="0"
  +
}}
</nowiki>}}
 
  +
  +
Bluetooth を一時的にオフにしたい場合は、{{man|8|rfkill}} を使ってください:
  +
  +
# rfkill block bluetooth
   
 
=== ウェブカメラ ===
 
=== ウェブカメラ ===
   
内蔵のウェブカメラを使わない場合、{{ic|uvcvideo}} モジュールを[[カーネルモジュール#ブラックリスト|ブラックリスト]]に入れてください。
+
内蔵のウェブカメラを使わない場合、{{ic|uvcvideo}} モジュールを[[ブラックリスト]]に入れてください。
   
 
=== カーネルパラメータ ===
 
=== カーネルパラメータ ===
   
このセクションでは {{ic|/etc/sysctl.d/}} の設定を使います。このディレクトリはカーネルの sysctl パラメータと対応するディレクトリです。詳しく [http://0pointer.de/blog/projects/the-new-configuration-files The New Configuration Files] や、より正確な {{man|5|sysctl.d}} を見てください。
+
このセクションでは {{ic|/etc/sysctl.d/}} の設定を使います。このディレクトリは、''"カーネルの sysctl パラメータ用のドロップインディレクトリです"''。詳[http://0pointer.de/blog/projects/the-new-configuration-files The New Configuration Files] や、より詳しい {{man|5|sysctl.d}} を見てください。
   
 
==== NMI watchdog の無効化 ====
 
==== NMI watchdog の無効化 ====
   
[[Wikipedia:Non-maskable interrupt|NMI]] watchdog はカーネルパニックを引き起こすハードウェアのハングアップをキャッチするデバッグ機能です。システムによっては大量の割り込みが発生するため、消費電力の増加につながっていることがあります:
+
[[Wikipedia:Non-maskable interrupt|NMI]] watchdog はカーネルパニックを引き起こすハードウェアのハングアップをキャッチするデバッグ機能です。システムによっては大量の割り込みが発生するため、消費電力の増加につながっていることがあります:
   
{{hc|/etc/sysctl.d/disable_watchdog.conf|2=kernel.nmi_watchdog = 0}}
+
{{hc|/etc/sysctl.d/disable_watchdog.conf|2=
  +
kernel.nmi_watchdog = 0
  +
}}
   
もしくは起動の初期で完全に無効化するには[[カーネルパラメータ|カーネル]]に {{ic|1=nmi_watchdog=0}} を追加してください。
+
もしくは起動の初期で完全に無効化するには[[カーネルパラメータ|カーネルライン]]に {{ic|1=nmi_watchdog=0}} を追加してください。
   
 
==== ライトバック時間 ====
 
==== ライトバック時間 ====
   
仮想メモリのダーティライトバック時間を増やすことでディスク I/O がまとめられて、断続的なディスクの書き込みが減って、消費電力が抑えられます。この値を60秒に設定するには (デフォルトは5秒です):
+
仮想メモリのダーティライトバック時間を増やすことでディスク I/O がまとめられて、断続的なディスクの書き込みが減って、消費電力が抑えられます。この値を60秒に設定するには (デフォルトは5秒です):
   
{{hc|/etc/sysctl.d/dirty.conf|2=vm.dirty_writeback_centisecs = 6000}}
+
{{hc|/etc/sysctl.d/dirty.conf|2=
  +
vm.dirty_writeback_centisecs = 6000
  +
}}
   
 
ジャーナルをサポートしているファイルシステム (ext4 や btrfs など) でジャーナルコミットでも同じことをするには、[[fstab]] でオプションとして {{ic|1=commit=60}} を使用します。
 
ジャーナルをサポートしているファイルシステム (ext4 や btrfs など) でジャーナルコミットでも同じことをするには、[[fstab]] でオプションとして {{ic|1=commit=60}} を使用します。
   
I/O パフォーマンス省電力に影響る他のパラメータは [[sysctl#仮想メモリ]] を参照。
+
この値は、以下の Laptop Mode 設定の副作用として変更されてしまうことに注意してください。また、I/O パフォーマンス省電力に影響を与える他のパラメータは [[sysctl#仮想メモリ]] を参照してください
   
 
==== Laptop Mode ====
 
==== Laptop Mode ====
   
ラップトップモードの'ノブ'については[https://www.kernel.org/doc/Documentation/laptops/laptop-mode.txt カーネルドキュメント]を見て下さい。''"このノブの適切な値は5秒です。"''
+
ラップトップモードの"ノブ"については[https://docs.kernel.org/admin-guide/laptops/laptop-mode.html カーネルドキュメント]を見て下さい。''"このノブの妥当な値は5秒です。"''
   
{{hc|/etc/sysctl.d/laptop.conf|2=vm.laptop_mode = 5}}
+
{{hc|/etc/sysctl.d/laptop.conf|2=
  +
vm.laptop_mode = 5
  +
}}
  +
  +
{{Note|この設定は主に回転ディスクドライブに関連しています。}}
   
 
=== ネットワークインターフェイス ===
 
=== ネットワークインターフェイス ===
   
[[Wake-on-LAN]] は便利な機能ですが、利用しない場合はサスペンド中にマジックパケットが来るのを待つのに無駄な電力を消耗するだけです。全ての Ethernet インターフェイスで Wake-on-LAN効化:
+
[[Wake-on-LAN]] は便利な機能ですが、利用しない場合はサスペンド中にマジックパケットが来るのを待つのに無駄な電力を消耗するだけです。[[Wake-on-LAN#udev]] ルールを調整することで、全てのイーサネットインターフェイスに対してこの機能を無効化することがきます。{{Pkg|iw}}使って全てのワイヤレスインターフェイスで省電力を有効化するには:
   
{{hc|/etc/udev/rules.d/70-disable_wol.rules|2=ACTION=="add", SUBSYSTEM=="net", KERNEL=="eth*", RUN+="/usr/bin/ethtool -s %k wol d"}}
+
{{hc|/etc/udev/rules.d/'''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 power_save=1 d0i3_disable=0 uapsd_disable=0
 
   
  +
options iwlwifi d0i3_disable=0
そして {{ic|/etc/modprobe.d/iwldvm.conf}} ファイルに以下を追加してください:
 
  +
  +
ワイヤレスカードによっては、以下の2つのオプションのうちいずれかが適用されます:
  +
  +
options iwlmvm power_scheme=3
   
 
options iwldvm force_cam=0
 
options iwldvm force_cam=0
   
  +
以下のコマンドで、どちらのモジュールが動作しているかを確認することで、どちらが関連しているかを確認できます:
上記の省電力オプションは実験的であり、システムが不安定になる可能性があります。
 
  +
  +
# lsmod | grep '^iwl.vm'
  +
  +
これらの省電力オプションは実験的であり、システムを不安定にする可能性があることに注意してください。
   
 
=== バスパワーの管理 ===
 
=== バスパワーの管理 ===
381行目: 266行目:
 
==== Active State Power Management ====
 
==== Active State Power Management ====
   
コンピュータが [[Wikipedia:Active State Power Management|ASPM]] をサポートしているという信頼が得られなった場合、起動時に無効化されます:
+
[[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 を有効化または無効化します。サポートの有無を確認するには以下を実行してください:
ASPM は BIOS によって扱われるため、ASPM が無効化される理由は以下の通りです [http://wireless.kernel.org/en/users/Documentation/ASPM]:
 
   
  +
# lspci -vv | grep 'ASPM.*abled;'
# BIOS が何らかの理由で ASPM を無効化した (コンフリクトが起こるから?)。
 
# PCIE が L0s 以外の ASPM を必要とする (L0s は無効化され L1 だけが有効化される)。
 
# ASPM について BIOS がプログラムされていない。
 
# BIOS にバグが存在する。
 
   
  +
利用可能な ASPM ポリシーと、現在のデフォルトのポリシーを調べるには、以下を実行してください:
コンピュータが ASPM をサポートしていると信じられる場合は、{{ic|1=pcie_aspm=force}} [[カーネルパラメータ]]を使うことで強制的にオンにすることができます。
 
   
  +
{{hc|$ cat /sys/module/pcie_aspm/parameters/policy|
{{Warning|
 
  +
[default] performance powersave powersupersave
* ASPM を強制するとフリーズやパニックが発生することがあります。ASPM が動作しなかったときにオプションを戻す手段があるか確認してください。
 
* ASPM をサポートしていないシステムで強制させると消費電力が逆に上昇することがあります。
 
 
}}
 
}}
   
  +
ASPM は、しばしば以下の理由によって無効化されることがあります [https://wireless.wiki.kernel.org/en/users/documentation/ASPM]:
{{ic|powersave}} に調整するには次を実行 (以下のコマンドは ASPM が有効になっていないと機能しません):
 
  +
  +
# BIOS が何らかの理由で ASPM を無効化した (コンフリクトが起こるから?)。
  +
# PCIE が ASPM を必要とするが、L0s は任意である (なので、L0s は無効化され、L1 だけが有効化されるかもしれません)。
  +
# ASPM 用に BIOS がプログラムされていないか、BIOS にバグが存在する。
  +
  +
上記で ASPM がサポートされていないと報告されたが、ハードウェアが ASPM をサポートしていると思われる場合は、カーネルが ASPM を管理できるようにするために {{ic|1=pcie_aspm=force}} [[カーネルパラメータ]]で ASPM を強制的に有効化できます。
  +
  +
{{Warning|
  +
* ASPM を、サポートされていないシステム上で強制的に有効化すると、電力消費量が増加する場合があります。さらに、システムのフリーズやカーネルパニックの危険性もあります。なので、そのような場合に備えてこのオプションをもとに戻す手段を確保しておくべきです。
  +
* ASPM の強制はカーネル内で行われます。なので、ハードウェアで無効化されている場合には、有効化できません。ハードウェアで ASPM が無効化されているかどうか確認するには、root として {{ic|dmesg {{!}} grep ASPM}} と実行してください。あなたのハードウェア固有の情報については、対応する Wiki の記事を参照してください (もし存在すれば)。
  +
}}
   
  +
ASPM がサポートされており、かつ、有効化されていれば、現在のセッションに対して任意のポリシーを選択することができます。例えば、現在のセッションに対して {{ic|powersupersave}} を設定するには、以下を実行してください:
echo powersave | tee /sys/module/pcie_aspm/parameters/policy
 
   
  +
# 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=ACTION=="add", SUBSYSTEM=="pci", ATTR{power/control}="auto"}}
+
{{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 の自動サスペンド ====
434行目: 326行目:
 
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|<nowiki>
+
{{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|<nowiki>
+
{{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|<nowiki>
+
{{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"
455行目: 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秒に設定するには、以下の[[カーネルパラメータ]]を追加してください:
   
{{hc|/etc/modprobe.d/usb-autosuspend.conf|<nowiki>
+
{{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=
USB の電源管理に関する詳細は [https://www.kernel.org/doc/Documentation/usb/power-management.txt Linux カーネルドキュメント]を見て下さい。
 
  +
ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="05c6", ATTR{idProduct}=="9205", ATTR{power/autosuspend}="-1"
  +
}}
  +
  +
USB の電源管理に関する詳細は [https://docs.kernel.org/driver-api/usb/power-management.html Linux カーネルドキュメント]を見て下さい。
   
 
==== SATA Active Link Power Management ====
 
==== SATA Active Link Power Management ====
   
{{Note|以下設定を行うとアドル状態っているドライブにアクセスするときに遅延が発生するようになります。AC 電源使用するかどうかによって変えるべき設定で。}}
+
{{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}} を使えばどのプログラムがディスクに頻繁に書き込みしているかわかります。他のヒントは[[ソリッドトドラブ#SSD の読み書きを最小化するヒント]]を見て下さい、ほとんどのヒントは SSD に限ったものではありません
+
多数のプログラムがディスクに頻繁に書き込みをおこなう場合は省電力は効率的ではありません。全てのプログラムを調査して、いつどのようにプログラムがディスクに書き込むを行うのか調べるのがディスクの使用量を減らす道です。{{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
[[udisks]] を使用してしばらくしてから CD/DVD ロムをスピンダウンさせるには:
 
  +
# 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 --inhibit-polling /dev/sr0
 
  +
  +
==========================================================================================
  +
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 は、パーキングとスピンダウンが正常に無効化されたことを意味します。
   
 
== ツールとスクリプト ==
 
== ツールとスクリプト ==
493行目: 456行目:
 
=== スクリプトと udev ルールを使う ===
 
=== スクリプトと udev ルールを使う ===
   
systemd ユーザーは {{ic|systemctl suspend}} や {{ic|systemctl hibernate}} でサスペンドとハイバネートを行うことができ、{{ic|/etc/systemd/logind.conf}} で acpi イベントを処理することができるので、[[pm-utils]] と [[acpid]] を削除するということに興味を引かれるかもしれません。systemd が行えないことがたったひとつだけ存在します (systemd-204 現在): システムが AC 電源またはバッテリーで動作しているのかで別れる電源管理です。このギャップをなくすには、AC アダプタが抜き差しされたときにスクリプトを実行する [[udev]] ルールを作成します:
+
systemd ユーザーは {{ic|systemctl suspend}} や {{ic|systemctl hibernate}} でサスペンドとハイバネートを行うことができ、{{ic|/etc/systemd/logind.conf}} で acpi イベントを処理することができるので、[[pm-utils]] と [[acpid]] を削除するということに興味を引かれるかもしれません。systemd が行えないことがたったひとつだけ存在します (systemd-204 現在): システムが AC 電源で動作しているのか、バッテリーで動作しているのかで条件分岐を行う電源管理です。このギャップをなくすには、AC アダプタが抜き差しされたときにスクリプトを実行する [[udev]] ルールを作成します:
   
{{hc|/etc/udev/rules.d/powersave.rules|2=<nowiki>
+
{{hc|/etc/udev/rules.d/powersave.rules|2=
 
SUBSYSTEM=="power_supply", ATTR{online}=="0", RUN+="/path/to/your/script true"
 
SUBSYSTEM=="power_supply", ATTR{online}=="0", RUN+="/path/to/your/script true"
 
SUBSYSTEM=="power_supply", ATTR{online}=="1", RUN+="/path/to/your/script false"
 
SUBSYSTEM=="power_supply", ATTR{online}=="1", RUN+="/path/to/your/script false"
  +
}}
</nowiki>}}
 
   
{{Note|''pm-powersave'' が使用しているのと同じスクリプトを使うことができます。実行可能属性を付与して別の所に保存する必要があります (例えば {{ic|/usr/local/bin/}})。}}
+
{{Note|''pm-powersave'' が使用しているのと同じスクリプトを使うことができます。[[実行可能属性]]を付与して別の所に保存する必要があります (例えば {{ic|/usr/local/bin/}})。}}
   
powersave スクリプトのサンプル: [[powerdown]], [https://github.com/Unia/powersave powersave]。
+
powersave スクリプトのサンプル:
  +
  +
* [https://github.com/supplantr/ftw ftw] (パッケージ: {{AUR|ftw-git}})
  +
* [https://github.com/Unia/powersave powersave]
  +
* [https://bbs.archlinux.org/viewtopic.php?id=180762 throttlectl] ({{AUR|throttlectl}})
   
 
上記の udev ルールはちゃんと動作するはずですが、電源設定がサスペンドやハイバネートをした後に更新されない場合、以下の内容で {{ic|/usr/lib/systemd/system-sleep/}} にスクリプトを追加してください:
 
上記の udev ルールはちゃんと動作するはずですが、電源設定がサスペンドやハイバネートをした後に更新されない場合、以下の内容で {{ic|/usr/lib/systemd/system-sleep/}} にスクリプトを追加してください:
   
{{hc|/usr/lib/systemd/system-sleep/00powersave|<nowiki>
+
{{hc|/usr/lib/systemd/system-sleep/00powersave|
 
#!/bin/sh
 
#!/bin/sh
   
512行目: 479行目:
 
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
521行目: 488行目:
 
esac
 
esac
 
exit 0
 
exit 0
  +
}}
</nowiki>}}
 
   
 
忘れずに実行可能属性を付与してください。
 
忘れずに実行可能属性を付与してください。
   
{{Note|あなたのノートパソコンは AC0 が異なっている可能性があります。その場合は変更してください。}}
+
{{Note|ノートパソコンによっては AC0 が異なっている可能性があります。その場合は変更してください。}}
   
 
=== 電源設定の表示 ===
 
=== 電源設定の表示 ===
531行目: 498行目:
 
以下のスクリプトは USB や PCI デバイスの電源設定などのプロパティを表示します。全ての設定を見るには root 権限が必要なので注意して下さい。
 
以下のスクリプトは USB や PCI デバイスの電源設定などのプロパティを表示します。全ての設定を見るには root 権限が必要なので注意して下さい。
   
{{bc|<nowiki>
+
{{bc|1=
 
#!/bin/bash
 
#!/bin/bash
   
545行目: 512行目:
 
for ff in $(find $busdir/power -type f ! -empty 2>/dev/null)
 
for ff in $(find $busdir/power -type f ! -empty 2>/dev/null)
 
do
 
do
v=$(cat $ff 2>/dev/null|tr -d "\n")
+
v=$(cat $ff 2>/dev/null{{!}}tr -d "\n")
 
[[ ${#v} -gt 0 ]] && echo -e " ${ff##*/}=$v";
 
[[ ${#v} -gt 0 ]] && echo -e " ${ff##*/}=$v";
 
v=;
 
v=;
done | sort -g;
+
done {{!}} sort -g;
 
done;
 
done;
   
 
printf "\n\n\n+++ %s\n" "Kernel Modules"
 
printf "\n\n\n+++ %s\n" "Kernel Modules"
for mod in $(lspci -k | sed -n '/in use:/s,^.*: ,,p' | sort -u)
+
for mod in $(lspci -k {{!}} sed -n '/in use:/s,^.*: ,,p' {{!}} sort -u)
 
do
 
do
 
echo "+ $mod";
 
echo "+ $mod";
systool -v -m $mod 2> /dev/null | sed -n "/Parameters:/,/^$/p";
+
systool -v -m $mod 2> /dev/null {{!}} sed -n "/Parameters:/,/^$/p";
 
done
 
done
  +
}}
</nowiki>}}
 
   
  +
== ユーザにシャットダウンを許可する ==
== トラブルシューティング ==
 
   
=== スイッチのアクショの遅延 ===
+
=== ンと蓋スイッチのイベ ===
   
  +
サスペンド、電源オフ、そしてハイバネートのボタンのイベントと、蓋を閉じた時のイベントは、[[#ACPI イベント]] で説明されているように ''logind'' によって処理されます。
短期間に連続してフタのスイッチが反応した場合、''logind'' はドッキングを検出するために90秒までサスペンドを遅延します [https://lists.freedesktop.org/archives/systemd-devel/2015-January/027131.html]。この遅延時間は systemd v220 から設定ができます [http://cgit.freedesktop.org/systemd/systemd/commit/?id=9d10cbee89ca7f82d29b9cb27bef11e23e3803ba]:
 
   
{{hc|/etc/systemd/logind.conf|<nowiki>
+
=== systemd-logind を使う ===
...
 
HoldoffTimeoutSec=30s
 
...
 
</nowiki>}}
 
   
  +
{{Pkg|polkit}} を使用している場合、非リモートセッションのユーザは、[[一般的なトラブルシューティング#セッションのパーミッション|セッションが壊れていない]]限り、電源関連のコマンドを発行することができます。
=== ノートパソコンをサスペンドする Fn キーが動作しない ===
 
   
  +
セッションがアクティブであることを確認するには:
{{ic|logind.conf}} をどう設定してもスリープボタンが動作しない場合 (ボタンを押しても syslog にメッセージすら表示されない)、おそらく logind がキーボードデバイスを監視していません [https://lists.freedesktop.org/archives/systemd-devel/2015-February/028325.html]。次のコマンドを実行してください:
 
  +
$ loginctl show-session $XDG_SESSION_ID --property=Active
# journalctl | grep "Watching system buttons"
 
  +
すると以下のような表示がされます:
 
  +
アクティブであるならば、ユーザはコマンドラインで ''systemctl'' のコマンドを使用したり、メニューに追加したりできます:
May 25 21:28:19 vmarch.lan systemd-logind[210]: Watching system buttons on /dev/input/event2 (Power Button)
 
  +
$ systemctl poweroff
May 25 21:28:19 vmarch.lan systemd-logind[210]: Watching system buttons on /dev/input/event3 (Sleep Button)
 
  +
$ systemctl reboot
May 25 21:28:19 vmarch.lan systemd-logind[210]: Watching system buttons on /dev/input/event4 (Video Bus)
 
  +
キーボードデバイスがないことに気づいて下さい。したがってキーボードデバイスの ATTRS{name} を取得します [http://systemd-devel.freedesktop.narkive.com/Rbi3rjNN/patch-1-2-logind-add-support-for-tps65217-power-button]:
 
  +
{{ic|systemctl suspend}} や {{ic|systemctl hibernate}} といった他のコマンドも使用できます。{{man|1|systemctl}} の ''System Commands'' セクションを参照してください。
# udevadm info -a /dev/input/by-path/*-kbd
 
  +
...
 
  +
=== sudo を使う ===
KERNEL=="event0"
 
  +
...
 
  +
{{Pkg|sudo}} を[[インストール]]し、[[sudo|sudo 権限]]をユーザに与えてください。sudo 権限が与えられたユーザは、{{ic|sudo systemctl}} コマンド (例: {{ic|sudo systemctl poweroff}}、{{ic|sudo systemctl reboot}}、{{ic|sudo systemctl suspend}}、{{ic|sudo systemctl hibernate}}) を使用できるようになります。{{man|1|systemctl}} の ''System Commands'' セクションを参照してください。
ATTRS{name}=="AT Translated Set 2 keyboard"
 
  +
カスタム udev ルールを作成して "power-switch" タグを追加:
 
  +
==== sudo 権限の無いユーザ ====
{{hc|/etc/udev/rules.d/70-power-switch-my.rules|<nowiki>
 
  +
ACTION=="remove", GOTO="power_switch_my_end"
 
  +
ユーザにシャットダウンコマンドのみを使用できるようにし、sudo 権限を与えないようにする必要がある場合、{{ic|visudo}} コマンドを root として使って {{ic|/etc/sudoers}} の末尾に以下を追加してください。''user'' の部分は適切なユーザ名に、''hostname'' の部分はマシンのホスト名に置き換えてください。
SUBSYSTEM=="input", KERNEL=="event*", ATTRS{name}=="AT Translated Set 2 keyboard", TAG+="power-switch"
 
  +
LABEL="power_switch_my_end"
 
  +
''user'' ''hostname'' =NOPASSWD: /usr/bin/systemctl poweroff,/usr/bin/systemctl halt,/usr/bin/systemctl reboot
</nowiki>}}
 
  +
サービスを再起動してルールをリロードしてください:
 
  +
ここで設定したユーザは、{{ic|sudo systemctl poweroff}} でシャットダウンを、{{ic|sudo systemctl reboot}} で再起動を行うことができるようになります。システムをシャットダウンしたいユーザは、{{ic|sudo systemctl halt}} も使用できます。パスワードのプロンプトを表示させたくない場合は、{{ic|NOPASSWD:}} タグを使用してください。
# systemctl restart systemd-udevd
 
# udevadm trigger
 
# systemctl restart systemd-logind
 
これで syslog に {{ic|Watching system buttons on /dev/input/event0}} と表示されるようになるはずです。
 
   
 
== 参照 ==
 
== 参照 ==
   
 
* [https://www.thinkwiki.org/wiki/How_to_reduce_power_consumption ThinkWiki:How to reduce power consumption]
 
* [https://www.thinkwiki.org/wiki/How_to_reduce_power_consumption ThinkWiki:How to reduce power consumption]
* [http://ivanvojtko.blogspot.sk/2016/04/how-to-get-longer-battery-life-on-linux.html How to get longer battery life on Linux]
+
* [https://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つの部分からなります:

  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 || tunedAUR
  • UPower — 電源デバイスの列挙、デバイスイベントの監視、履歴と統計のクエリを行う抽象化レイヤー。
https://upower.freedesktop.org || upower

グラフィカル

  • batsignal — libnotify を使用してバッテリレベルの低下を警告する軽量バッテリモニタ。
https://github.com/electrickite/batsignal || batsignalAUR
  • 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 がシステムをサスペンドし、その後サスペンドから復帰すると今度は電源マネージャがシステムを再びサスペンドしてしまうという状況に陥る可能性があります。KDEGNOMEXfce、そして MATE の電源マネージャは、必要な 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 HWP (Intel Hardware P-state) をサポートする CPU

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) も参照してください。

オーディオ

カーネル

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

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

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

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

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

音声の再生開始時や停止時にポップノイズ

デフォルトでは、長時間アイドル状態にあるオーディオソースはサスペンドされます。この時に音声を再生したりマイクを使用し始めたりすると、ポップノイズが発生することがあります。解決策はそれぞれ対応するページを見てください:

バックライト

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

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]:

  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"

上記のルールは未使用のデバイスを全てパワーダウンしますが、一部のデバイスが復帰しなくなってしまいます。サポートしていることが分かっているデバイスのみに対して 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

警告: 一部のデバイスでは、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
利用可能な ALPM 設定
設定 説明 省電力効果
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"
ノート:
  • この設定を行うとアイドル状態になっているドライブにアクセスするときに遅延が発生するようになります。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-07-19 です。もし英語版に 変更 があれば、翻訳の同期を手伝うことができます。