「電源管理」の版間の差分
28行目: | 28行目: | ||
== ユーザースペースツール == |
== ユーザースペースツール == |
||
− | 以下のツールを使うことで手動で多数の設定を行うかわりになります。どのツールも多かれ少なかれ同じような動作をするので、衝突をさけるためにツールはどれか一つだけを実行してください。[[:Category:電源管理|電源管理カテゴリ]]を見ることで |
+ | 以下のツールを使うことで手動で多数の設定を行うかわりになります。どのツールも多かれ少なかれ同じような動作をするので、衝突をさけるためにツールはどれか一つだけを実行してください。[[:Category:電源管理|電源管理カテゴリ]]を見ることで Arch Linux にどんな電源管理の選択肢が存在するかわかります。 |
以下は省電力設定をするために作られた人気のあるスクリプトやツールです: |
以下は省電力設定をするために作られた人気のあるスクリプトやツールです: |
||
38行目: | 38行目: | ||
* {{App|[[Powerdown]]|様々な設定によってコンピュータの消費電力を減らすスクリプト。|https://github.com/taylorchu/powerdown|{{Aur|powerdown-git}}}} |
* {{App|[[Powerdown]]|様々な設定によってコンピュータの消費電力を減らすスクリプト。|https://github.com/taylorchu/powerdown|{{Aur|powerdown-git}}}} |
||
* {{App|[[powertop]]|消費電力や電源管理の問題を診断して省電力設定を補助するツール。|https://01.org/powertop/|{{Pkg|powertop}}}} |
* {{App|[[powertop]]|消費電力や電源管理の問題を診断して省電力設定を補助するツール。|https://01.org/powertop/|{{Pkg|powertop}}}} |
||
+ | * [[systemd]] |
||
* {{App|[[TLP]]|Linux 向けの先進的な電源管理。|http://linrunner.de/en/tlp/docs/tlp-linux-advanced-power-management.html|{{Pkg|tlp}}}} |
* {{App|[[TLP]]|Linux 向けの先進的な電源管理。|http://linrunner.de/en/tlp/docs/tlp-linux-advanced-power-management.html|{{Pkg|tlp}}}} |
||
44行目: | 45行目: | ||
=== ACPI イベント === |
=== ACPI イベント === |
||
− | systemd は電源関連の [[Wikipedia:Advanced_Configuration_and_Power_Interface|ACPI]] イベントを扱えます。{{ic|/etc/systemd/logind.conf}} のオプションを使って設定できます: |
+ | systemd は電源関連の [[Wikipedia:Advanced_Configuration_and_Power_Interface|ACPI]] イベントを扱えます。{{ic|/etc/systemd/logind.conf}} や {{ic|/etc/systemd/logind.conf.d/*.conf}} のオプションを使って設定できます: |
* {{ic|HandlePowerKey}}: パワーキーが押された時に行う動作を定めます。 |
* {{ic|HandlePowerKey}}: パワーキーが押された時に行う動作を定めます。 |
||
64行目: | 65行目: | ||
{{Warning|1=[[systemd]] バージョン 211 と 212 では、{{ic|HandleLidSwitch}} オプションは [[NVIDIA]] バイナリドライバーがインストールされている環境では使用できません。この問題はバージョン 213 で修正されています。[https://bugs.freedesktop.org/show_bug.cgi?id=76267 systemd のバグトラッカー]や [https://bbs.archlinux.org/viewtopic.php?pid=1410252#p1410252 BBS のトピック]を参照してください。}} |
{{Warning|1=[[systemd]] バージョン 211 と 212 では、{{ic|HandleLidSwitch}} オプションは [[NVIDIA]] バイナリドライバーがインストールされている環境では使用できません。この問題はバージョン 213 で修正されています。[https://bugs.freedesktop.org/show_bug.cgi?id=76267 systemd のバグトラッカー]や [https://bbs.archlinux.org/viewtopic.php?pid=1410252#p1410252 BBS のトピック]を参照してください。}} |
||
+ | ==== 電源マネージャ ==== |
||
− | 現在のバージョンの systemd では、{{ic|Handle*}} オプションは(デスクトップ環境のパワーマネージャなどの)プログラムによって "inhibited" (一時的にオフ) にされない限りシステム全体に適用されます。停止されなければ、systemd がシステムをサスペンドした状態で終わることができ、立ち上がった時に他のパワーマネージャによってもう一度停止されます。 |
||
+ | [[デスクトップ環境]]には電源マネージャが含まれていることがあります。現在のバージョンの systemd では、{{ic|Handle*}} オプションは電源マネージャによって "inhibited" (一時的にオフ) にされない限りシステム全体に適用されます。停止されなければ、systemd がシステムをサスペンドした状態で終わることができ、立ち上がった時に他の電源マネージャによってもう一度停止されます。 |
||
− | {{Warning|現在、最新の [[KDE]] と [[GNOME]] の電源マネージャは "inhibited" コマンドを実行します。[[Xfce]] や、[[acpid]] など他のプログラムで ACPI イベントを管理したい場合は、{{ic|Handle}} オプションを {{ic|ignore}} に設定する必要があります。}} |
||
+ | |||
+ | 最新の [[KDE]], [[GNOME]], [[Xfce]] の電源マネージャは "inhibited" コマンドを実行します。[[acpid]] など他のプログラムで ACPI イベントを管理したい場合は、{{ic|Handle}} オプションを {{ic|ignore}} に設定する必要があります。詳しくは {{ic|man systemd-inhibit}} を参照。 |
||
=== サスペンドとハイバネート === |
=== サスペンドとハイバネート === |
||
75行目: | 78行目: | ||
{{ic|systemctl suspend}} は何も設定しなくても動きますが、あなたの環境で {{ic|systemctl hibernate}} を使うには[[サスペンドとハイバネート#ハイバネーション]]の指示に従う必要があります。 |
{{ic|systemctl suspend}} は何も設定しなくても動きますが、あなたの環境で {{ic|systemctl hibernate}} を使うには[[サスペンドとハイバネート#ハイバネーション]]の指示に従う必要があります。 |
||
+ | |||
+ | ==== ハイブリッドスリープ ==== |
||
+ | |||
+ | {{ic|systemctl hybrid-sleep}} はハイバネートとサスペンドを同時に行います。サスペンドとハイバネートのメリット・デメリットを組み合わせたものになります。突然コンピュータの電源が喪失 (コンセントが抜けたりバッテリーが切れる) しても、ハイバネートから復帰するため便利です。電源喪失がない場合、サスペンドから復帰するため、ハイバネートから復帰するよりも高速に復帰します。ただし、"hybrid-sleep" はハイバネートを機能させるためにメモリをスワップする必要があるので、普通の {{ic|systemctl suspend}} よりもスリープするのにかかる時間が長くなります。ハイブリッドスリープの別の方法として[[#遅延ハイバネーション|遅延ハイバネーション]]があります。 |
||
=== スリープフック === |
=== スリープフック === |
||
91行目: | 98行目: | ||
[Service] |
[Service] |
||
User=%I |
User=%I |
||
− | Type= |
+ | Type=simple |
Environment=DISPLAY=:0 |
Environment=DISPLAY=:0 |
||
ExecStartPre= -/usr/bin/pkill -u %u unison ; /usr/local/bin/music.sh stop ; /usr/bin/mysql -e 'slave stop' |
ExecStartPre= -/usr/bin/pkill -u %u unison ; /usr/local/bin/music.sh stop ; /usr/bin/mysql -e 'slave stop' |
||
ExecStart=/usr/bin/sflock |
ExecStart=/usr/bin/sflock |
||
+ | ExecStartPost=/usr/bin/sleep 1 |
||
[Install] |
[Install] |
||
112行目: | 120行目: | ||
[Install] |
[Install] |
||
WantedBy=suspend.target</nowiki>}} |
WantedBy=suspend.target</nowiki>}} |
||
+ | |||
+ | {{Note| |
||
+ | * [[アプリケーション一覧/セキュリティ#スクリーンロック|slock]] を使用する場合、スリープする前にサービスを起動してはいけません。デフォルトの simple サービスタイプを使って下さい。でないと、先に ''slock'' が起動して、ロックを解除しないとスリープに入らないようになってしまいます。forking タイプを指定しても解決しません。 |
||
+ | * スクリーンがロックされる前にスクリーンロックが返ってきてしまい、サスペンドから復帰するときに画面が点滅することがあります。{{ic|1=ExecStartPost=/usr/bin/sleep 1}} で遅延を追加することで解決します。}} |
||
root アクションでは ({{ic|# systemctl enable root-suspend}} で有効にしてください): |
root アクションでは ({{ic|# systemctl enable root-suspend}} で有効にしてください): |
||
169行目: | 181行目: | ||
* sleep.target は suspend.target, hibernate.target, hybrid-sleep.target から呼ばれ sleep.target 自身は StopWhenUnneeded サービスなので、タスクごとにフックが正しく起動・停止することが保証されています。 |
* sleep.target は suspend.target, hibernate.target, hybrid-sleep.target から呼ばれ sleep.target 自身は StopWhenUnneeded サービスなので、タスクごとにフックが正しく起動・停止することが保証されています。 |
||
+ | ==== 遅延ハイバネーション ==== |
||
− | ===== /usr/lib/systemd/system-sleep のフック ===== |
||
+ | |||
+ | 遅延ハイバネーションではスリープフックを利用して通常通りにサスペンドしますが、その後にハイバネーションを実行するタイマーをセットします。ハイバネーションを最初に実行しないためスリープに入るのが {{ic|systemctl hybrid-sleep}} よりも早くなります。ただし、"hybrid-sleep" とは違って、サスペンド中にハイバネーションを使うことで電源喪失から保護するようなことはできません。そのため遅延ハイバネーションはデスクトップなどよりもノートパソコンで使うほうが適しています。ハイバネーションが遅延されるため、サスペンド中はノートパソコンのバッテリーだけが使われ、それからハイバネーションが実行されます。バッテリーがなくなるまでサスペンドし続ける "hybrid-sleep" よりも消費電力を抑えることが可能です。ノートパソコンにハードディスクが搭載されている場合、ハイバネートするためにサスペンドから復帰したとき、ノートパソコンを数秒間は動かさないほうがよいでしょう。遅延ハイバネーションは消費電力だけでなくセキュリティに関しても利点があります (例: 完全なディスク暗号化を使っている場合)。サンプルスクリプトは [http://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 |
||
+ | Before=suspend.target |
||
+ | Conflicts=hibernate.target hybrid-suspend.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}} オプションはスリープの前に実行して復帰時に停止するように設定しています。サービスを[[有効化]]してください。 |
||
+ | |||
+ | {{Note|1=タイマー起動の後にハイバネートに問題が発生する場合は [https://bbs.archlinux.org/viewtopic.php?id=204346 suspend-to-hibernate broken since systemd-update] を見て下さい。}} |
||
+ | |||
+ | ==== /usr/lib/systemd/system-sleep のフック ==== |
||
− | Systemd は {{ic|/usr/lib/systemd/system-sleep/}} 内の全ての実行可能ファイルを実行するときに、 |
+ | Systemd は {{ic|/usr/lib/systemd/system-sleep/}} 内の全ての実行可能ファイルを実行するときに、2つの引数を渡します: |
* 引数 1: {{ic|pre}} か {{ic|post}}。マシンが停止するときと起動するとき。 |
* 引数 1: {{ic|pre}} か {{ic|post}}。マシンが停止するときと起動するとき。 |
2015年11月13日 (金) 17:05時点における版
関連記事
このページでは Arch Linux における電源管理の全体的な外観を説明します。
ハードウェアの電源管理の設定を直接変更するときはカーネルの設定を使います:
また、カーネルと対話してイベントを処理する電源管理ツールが多数あります: #ユーザースペースツール を参照。
目次
ユーザースペースツール
以下のツールを使うことで手動で多数の設定を行うかわりになります。どのツールも多かれ少なかれ同じような動作をするので、衝突をさけるためにツールはどれか一つだけを実行してください。電源管理カテゴリを見ることで Arch Linux にどんな電源管理の選択肢が存在するかわかります。
以下は省電力設定をするために作られた人気のあるスクリプトやツールです:
- acpid — ACPI の電源管理イベントを届けるデーモン。netlink をサポート。
- ftw — 節電のための udev ルールを設定するスクリプト。
- Laptop Mode Tools — ノートパソコンの省電力設定をするユーティリティ。多少設定が要りますが省電力設定ユーティリティのデファクトスタンダードとされています。
- pm-utils — サスペンドと電源状態設定のフレームワーク (今のところ大部分が開発途上)。
- Powerdown — 様々な設定によってコンピュータの消費電力を減らすスクリプト。
- powertop — 消費電力や電源管理の問題を診断して省電力設定を補助するツール。
systemd による電源管理
ACPI イベント
systemd は電源関連の ACPI イベントを扱えます。/etc/systemd/logind.conf
や /etc/systemd/logind.conf.d/*.conf
のオプションを使って設定できます:
HandlePowerKey
: パワーキーが押された時に行う動作を定めます。HandleSuspendKey
: サスペンドキーが押された時に行う動作を定めます。HandleHibernateKey
: ハイバネートキーが押された時に行う動作を定めます。HandleLidSwitch
: フタが閉じられた時に行う動作を定めます。
定めることができる動作は ignore
, poweroff
, reboot
, halt
, suspend
, hibernate
, hybrid-sleep
, lock
, kexec
のいずれかです。
オプションが設定されていない場合、systemd が使うデフォルトは: HandlePowerKey=poweroff
, HandleSuspendKey=suspend
, HandleHibernateKey=hibernate
, HandleLidSwitch=suspend
。
グラフィカルセットアップを走らせていなかったり i3 や awesome などシンプルなウィンドウマネージャしか使っていないシステムでは、これで ACPI イベントに反応するものとして使っている acpid デーモンを置き換えることが可能です。
電源マネージャ
デスクトップ環境には電源マネージャが含まれていることがあります。現在のバージョンの systemd では、Handle*
オプションは電源マネージャによって "inhibited" (一時的にオフ) にされない限りシステム全体に適用されます。停止されなければ、systemd がシステムをサスペンドした状態で終わることができ、立ち上がった時に他の電源マネージャによってもう一度停止されます。
最新の KDE, GNOME, Xfce の電源マネージャは "inhibited" コマンドを実行します。acpid など他のプログラムで ACPI イベントを管理したい場合は、Handle
オプションを ignore
に設定する必要があります。詳しくは man systemd-inhibit
を参照。
サスペンドとハイバネート
systemd はカーネルに入っているサスペンド・レジューム機能を使ってサスペンド (suspend to RAM)・ハイバネート・ハイブリッドサスペンドを行うコマンドを提供しています。また、サスペンドの前後の行動をカスタマイズするフックを追加する仕組みも存在します。
systemctl suspend
は何も設定しなくても動きますが、あなたの環境で systemctl hibernate
を使うにはサスペンドとハイバネート#ハイバネーションの指示に従う必要があります。
ハイブリッドスリープ
systemctl hybrid-sleep
はハイバネートとサスペンドを同時に行います。サスペンドとハイバネートのメリット・デメリットを組み合わせたものになります。突然コンピュータの電源が喪失 (コンセントが抜けたりバッテリーが切れる) しても、ハイバネートから復帰するため便利です。電源喪失がない場合、サスペンドから復帰するため、ハイバネートから復帰するよりも高速に復帰します。ただし、"hybrid-sleep" はハイバネートを機能させるためにメモリをスワップする必要があるので、普通の systemctl suspend
よりもスリープするのにかかる時間が長くなります。ハイブリッドスリープの別の方法として遅延ハイバネーションがあります。
スリープフック
systemctl suspend
, systemctl hibernate
, systemctl hybrid-sleep
が実行された時、Systemd はマシンをスリープ状態にするのに pm-utils を使いません; カスタムフックを含む、pm-utils フックは実行されません。ただし、こうしたイベントでカスタムスクリプトを動かすための仕組みを systemd は2つ提供しています。
サスペンド/リジューム サービスファイル
サービスファイルを suspend.target, hibernate.target, sleep.target にフックすることでサスペンド・ハイバネート前後に行うアクションを設定できます。ユーザー・システムアクションを行うにはファイルを分割する必要があります。ユーザーサービスファイルを作動させるには、# systemctl enable suspend@<user> && systemctl enable resume@<user>
。例:
/etc/systemd/system/suspend@.service
[Unit] Description=User suspend actions Before=sleep.target [Service] User=%I Type=simple Environment=DISPLAY=:0 ExecStartPre= -/usr/bin/pkill -u %u unison ; /usr/local/bin/music.sh stop ; /usr/bin/mysql -e 'slave stop' ExecStart=/usr/bin/sflock ExecStartPost=/usr/bin/sleep 1 [Install] WantedBy=sleep.target
/etc/systemd/system/resume@.service
[Unit] Description=User resume actions After=suspend.target [Service] User=%I Type=simple ExecStartPre=/usr/local/bin/ssh-connect.sh ExecStart=/usr/bin/mysql -e 'slave start' [Install] WantedBy=suspend.target
root アクションでは (# systemctl enable root-suspend
で有効にしてください):
/etc/systemd/system/root-resume.service
[Unit] Description=Local system resume actions After=suspend.target [Service] Type=simple ExecStart=/usr/bin/systemctl restart mnt-media.automount [Install] WantedBy=suspend.target
/etc/systemd/system/root-suspend.service
[Unit] Description=Local system suspend actions Before=sleep.target [Service] Type=simple ExecStart=-/usr/bin/pkill sshfs [Install] WantedBy=sleep.target
サービスファイルについてのヒント (詳しくは man systemd.service
):
Type=oneshot
の場合、複数のExecStart=
行を使うことができます。それ以外の場合は使える ExecStart は一行だけです。ExecStartPre
を使ったりコマンドをセミコロンで分割することでコマンドを追加することができます(最初の例を見て下さい -- セミコロンの前後にはスペースが必要です)。- コマンドの前に '-' を付けるとエラーが起こっても(終了ステータスが0以外でも)無視され、コマンドは成功したとして扱われます。
- サービスファイルのトラブルシューティングのときにエラーを見つけるには journalctl を使うのがベストです。
サスペンド/レジューム サービスファイルの統合
サスペンド/レジューム サービスファイルを統合すれば、様々なフェイズ(スリープ・レジューム)やターゲット(サスペンド・ハイバネート・ハイブリッドスリープ)でやることをひとつのフックで行うことができます。
例と説明:
/etc/systemd/system/wicd-sleep.service
[Unit] Description=Wicd sleep hook Before=sleep.target StopWhenUnneeded=yes [Service] Type=oneshot RemainAfterExit=yes ExecStart=-/usr/share/wicd/daemon/suspend.py ExecStop=-/usr/share/wicd/daemon/autoconnect.py [Install] WantedBy=sleep.target
RemainAfterExit=yes
: 起動後、明示的に止められるまでサービスは常時 active になります。StopWhenUnneeded=yes
: active のとき、サービスは sleep.target が停止した後に止められます。- sleep.target は suspend.target, hibernate.target, hybrid-sleep.target から呼ばれ sleep.target 自身は StopWhenUnneeded サービスなので、タスクごとにフックが正しく起動・停止することが保証されています。
遅延ハイバネーション
遅延ハイバネーションではスリープフックを利用して通常通りにサスペンドしますが、その後にハイバネーションを実行するタイマーをセットします。ハイバネーションを最初に実行しないためスリープに入るのが systemctl hybrid-sleep
よりも早くなります。ただし、"hybrid-sleep" とは違って、サスペンド中にハイバネーションを使うことで電源喪失から保護するようなことはできません。そのため遅延ハイバネーションはデスクトップなどよりもノートパソコンで使うほうが適しています。ハイバネーションが遅延されるため、サスペンド中はノートパソコンのバッテリーだけが使われ、それからハイバネーションが実行されます。バッテリーがなくなるまでサスペンドし続ける "hybrid-sleep" よりも消費電力を抑えることが可能です。ノートパソコンにハードディスクが搭載されている場合、ハイバネートするためにサスペンドから復帰したとき、ノートパソコンを数秒間は動かさないほうがよいでしょう。遅延ハイバネーションは消費電力だけでなくセキュリティに関しても利点があります (例: 完全なディスク暗号化を使っている場合)。サンプルスクリプトは こちら にあります。systemd のスリープフックについては こちらの投稿 も参照してください。
/etc/systemd/system/suspend-to-hibernate.service
[Unit] Description=Delayed hibernation trigger Documentation=https://bbs.archlinux.org/viewtopic.php?pid=1420279#p1420279 Documentation=https://wiki.archlinux.org/index.php/Power_management Before=suspend.target Conflicts=hibernate.target hybrid-suspend.target StopWhenUnneeded=true [Service] Type=oneshot RemainAfterExit=yes Environment="WAKEALARM=/sys/class/rtc/rtc0/wakealarm" Environment="SLEEPLENGTH=+2hour" ExecStart=-/usr/bin/sh -c 'echo -n "alarm set for "; date +%%s -d$SLEEPLENGTH | tee $WAKEALARM' ExecStop=-/usr/bin/sh -c '\ alarm=$(cat $WAKEALARM); \ now=$(date +%%s); \ if [ -z "$alarm" ] || [ "$now" -ge "$alarm" ]; then \ echo "hibernate triggered"; \ systemctl hibernate; \ else \ echo "normal wakeup"; \ fi; \ echo 0 > $WAKEALARM; \ ' [Install] WantedBy=sleep.target
Before
と Conflicts
オプションはハイバネートでは動作させないようにするために必要です。そうしないと遅延ハイバネーションが実行されたときにサービスが2回実行されてしまいます。WantedBy
と StopWhenUnneeded
オプションはスリープの前に実行して復帰時に停止するように設定しています。サービスを有効化してください。
/usr/lib/systemd/system-sleep のフック
Systemd は /usr/lib/systemd/system-sleep/
内の全ての実行可能ファイルを実行するときに、2つの引数を渡します:
- 引数 1:
pre
かpost
。マシンが停止するときと起動するとき。 - 引数 2:
suspend
かhibernate
かhybrid-sleep
。呼び出されるものによる。
pm-utils とは対照的に、systemd はスクリプトを(一つずつではなく)同時に実行します。
カスタムスクリプトの出力は systemd-suspend.service
, systemd-hibernate.service
, systemd-hybrid-sleep.service
によって記録されます。出力を見るには systemd の journal を使って下さい:
# journalctl -b -u systemd-suspend
カスタムスリープスクリプトの例:
/usr/lib/systemd/system-sleep/example.sh
#!/bin/sh case $1/$2 in pre/*) echo "Going to $2..." ;; post/*) echo "Waking up from $2..." ;; esac
スクリプトを実行可能にするのを忘れないで下さい:
# chmod a+x /usr/lib/systemd/system-sleep/example.sh
詳しくは man 7 systemd.special
や man 8 systemd-sleep
を見て下さい。
省電力設定
このセクションでは省電力機能を使用するのに必要な設定を扱います。コンピュータが AC 電源またはバッテリーで動作しているかに関わらず、ここに記載されているほとんど全ての機能には使用する価値があります。パフォーマンスへの影響は軽微ですが、大抵壊れているハードウェアやドライバーのためにデフォルトでは有効になっていません。電力の使用量を減らすことは熱を減らすことでもあり、動的なオーバークロックによって、最近の Intel や AMD の CPU ではパフォーマンスの向上につながることもあります。
udev ルールなどを使ってスクリプトや省電力設定を自分で作成したい場合は以下の設定を参考にすることができます。
オーディオ
デフォルトでは、オーディオの省電力機能はほとんどのドライバーで無効になっています。power_save
パラメータを設定することで有効にすることができます。アイドルモードに移行するまでの時間を秒数で指定します。1秒後にサウンドカードをアイドル状態にするには、Intel の場合、以下を作成:
/etc/modprobe.d/audio_powersave.conf
options snd_hda_intel power_save=1
ac97 の場合は以下を使って下さい:
options snd_ac97_codec power_save=1
バックライト
バックライトを見て下さい。
Bluetooth
Bluetooth を完全に無効化するには、btusb
と bluetooth
モジュールをブラックリストに入れてください。
一時的にだけ bluetooth をオフにするには、rfkill を使用します:
# rfkill block bluetooth
もしくは udev ルールを使って:
/etc/udev/rules.d/50-bluetooth.rules
# disable bluetooth SUBSYSTEM=="rfkill", ATTR{type}=="bluetooth", ATTR{state}="0"
または rfkill パッケージに入っている rfkill-block@bluetooth.service
を有効化してください。
ウェブカメラ
内蔵のウェブカメラを使わない場合、uvcvideo
モジュールをブラックリストに入れてください。
カーネルパラメータ
このセクションでは /etc/sysctl.d/
の設定を使います。このディレクトリはカーネルの sysctl パラメータと対応するディレクトリです。詳しくは The New Configuration Files や、より正確な systemd の sysctl.d man ページ を見て下さい。
NMI watchdog の無効化
NMI watchdog はカーネルパニックを引き起こすハードウェアのハングアップをキャッチするデバッグ機能です。システムによっては大量の割り込みが発生するため、消費電力の増加につながっていることがあります:
/etc/sysctl.d/disable_watchdog.conf
kernel.nmi_watchdog = 0
もしくは起動の初期で完全に無効化するにはカーネル行に nmi_watchdog=0
を追加してください。
ライトバック時間
仮想メモリのダーティなライトバック時間を増やすことでディスク I/O がまとめられて、断続的なディスクの書き込みが減って、消費電力が抑えられます。この値を60秒に設定するには (デフォルトは5秒です):
/etc/sysctl.d/dirty.conf
vm.dirty_writeback_centisecs = 6000
ジャーナルをサポートしているファイルシステム (ext4 や btrfs など) でジャーナルコミットでも同じことをするには、fstab でオプションとして commit=60
を使用します。
I/O パフォーマンスや省電力に影響する他のパラメータは sysctl#仮想メモリ を参照。
Laptop Mode
ラップトップモードの'ノブ'についてはカーネルドキュメントを見て下さい。"このノブの適切な値は5秒です。"
/etc/sysctl.d/laptop.conf
vm.laptop_mode = 5
ネットワークインターフェイス
Wake-on-LAN は便利な機能ですが、利用しない場合はサスペンド中にマジックパケットが来るのを待つのに無駄な電力を消耗するだけです。全ての Ethernet インターフェイスで Wake-on-LAN を無効化:
/etc/udev/rules.d/70-disable_wol.rules
ACTION=="add", SUBSYSTEM=="net", KERNEL=="eth*", RUN+="/usr/bin/ethtool -s %k wol d"
全ての無線インターフェイスで省電力機能を有効にするには:
/etc/udev/rules.d/70-wifi-powersave.rules
ACTION=="add", SUBSYSTEM=="net", KERNEL=="wlan*", RUN+="/usr/bin/iw dev %k set power_save on"
上記の例では、%k
がマッチするデバイスのカーネル名を示します。例えば、ルールが wlan0
に適用可能とわかった場合、%k
は wlan0
に置き換えられます。特定のインターフェイスにだけルールを適用するには、パターン eth*
と修飾子 %k
を適当なインターフェイスの名前に置き換えて下さい。詳しくは、Writing udev rules を参照。
ここで、設定ファイルの名前は重要です。systemd v197 から 80-net-name-slot.rules
によって永続的なデバイス名が導入されたため、デバイスに enp2s0
というような名前で呼ばれるようになる前に適用されるように、ネットワークの powersave ファイルは辞書順で 80-net-name-slot.rules
よりも前に来る名前を付けなくてはなりません。
バスパワーの管理
Active State Power Management
コンピュータが ASPM をサポートしているという信頼が得られなかった場合、起動時に無効化されます:
$ lspci -vv | grep ASPM.*abled\;
ASPM は BIOS によって扱われるため、ASPM が無効化される理由は以下の通りです [1]:
- BIOS が何らかの理由で ASPM を無効化した (コンフリクトが起こるから?)。
- PCIE が L0s 以外の ASPM を必要とする (L0s は無効化され L1 だけが有効化される)。
- ASPM について BIOS がプログラムされていない。
- BIOS にバグが存在する。
コンピュータが ASPM をサポートしていると信じられる場合は、pcie_aspm=force
カーネルパラメータを使うことで強制的にオンにすることができます。
powersave
に調整するには次を実行 (以下のコマンドは ASPM が有効になっていないと機能しません):
echo powersave | tee /sys/module/pcie_aspm/parameters/policy
デフォルトでは以下のようになります:
$ cat /sys/module/pcie_aspm/parameters/policy
[default] performance powersave
PCI Runtime Power Management
/etc/udev/rules.d/pci_pm.rules
ACTION=="add", SUBSYSTEM=="pci", ATTR{power/control}="auto"
デバイスの電源管理
USB を含む、(ほぼ) 全てのデバイスの電源管理を有効化:
/etc/udev/rules.d/dev_power_save.rules
# Various subsystems runtime power management (by bus or class) ACTION=="add", SUBSYSTEMS=="*", TEST=="power/control", ATTR{power/control}="auto" # Various subsystems power saving (by module) ACTION=="add", SUBSYSTEMS=="*", TEST=="parameters/power_save", ATTR{parameters/power_save}="1"
影響を受けるデバイスを表示するには:
ls /sys/bus/*/devices/*/power/control ls /sys/class/*/*/power/control ls /sys/module/*/parameters/power_save
USB を除く全てのシステムで電源管理を有効にするには、最初のルールをサブシステムごとのルールに置き換えます (/sys/bus/some_subsystem, /sys/class/some_subsystem):
ACTION=="add", SUBSYSTEM=="some_subsystem", TEST=="power/control", ATTR{power/control}="auto"
USB の自動サスペンド
Linux カーネルは USB デバイスが使用されていないときに USB デバイスを自動的にサスペンドさせることができます。これによって電力を相当カットできるときもありますが、USB の省電力機能に対応していない USB デバイスではおかしな挙動が起こる可能性もあります (特に USB マウスやキーボード)。ホワイトリストとブラックリストでフィルタリングする udev ルールを使うことで問題は軽減されます。
最も単純であまり役に立たない、全ての USB デバイスで自動サスペンドを有効にする例:
/etc/udev/rules.d/50-usb_power_save.rules
ACTION=="add", SUBSYSTEM=="usb", TEST=="power/control", ATTR{power/control}="auto"
自動サスペンドが動作するデバイスにだけ自動サスペンドを有効にするには、ベンダーとプロダクト ID でマッチングを行います (lsusb を使って値を取得):
/etc/udev/rules.d/50-usb_power_save.rules
# whitelist for usb autosuspend ACTION=="add", SUBSYSTEM=="usb", TEST=="power/control", ATTR{idVendor}=="05c6", ATTR{idProduct}=="9205", ATTR{power/control}="auto"
もしくは、USB 自動サスペンドが使えないデバイスをブラックリストに入れて、他の全てのデバイスで自動サスペンドを有効にするには:
/etc/udev/rules.d/50-usb_power_save.rules
# blacklist for usb autosuspend ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="05c6", ATTR{idProduct}=="9205", GOTO="power_usb_rules_end" ACTION=="add", SUBSYSTEM=="usb", TEST=="power/control", ATTR{power/control}="auto" LABEL="power_usb_rules_end"
自動サスペンドに入るデフォルトのアイドル遅延時間は usbcore
カーネルモジュールの autosuspend
パラメータによって制御されています。遅延時間をデフォルトの2秒から5秒に設定するには:
/etc/modprobe.d/usb-autosuspend.conf
options usbcore autosuspend=5
power/control
と同じように、power/autosuspend
属性を設定することで遅延時間はデバイスごとに細かく設定することができます。
USB の電源管理に関する詳細は Linux カーネルドキュメントを見て下さい。
SATA Active Link Power Management
/etc/udev/rules.d/hd_power_save.rules
ACTION=="add", SUBSYSTEM=="scsi_host", KERNEL=="host*", ATTR{link_power_management_policy}="min_power"
ハードディスクドライブ
設定できるドライブのパラメータについては hdparm を見て下さい。
多数のプログラムがディスクに頻繁に書き込みをおこなう場合は省電力は効率的ではありません。全てのプログラムを調査して、いつどのようにプログラムがディスクに書き込むを行うのか調べるのがディスクの使用量を減らす道です。iotop を使えばどのプログラムがディスクに頻繁に書き込みしているかわかります。他のヒントはソリッドステートドライブ#SSD の読み書きを最小化するヒントを見て下さい、ほとんどのヒントは SSD に限ったものではありません。
noatime オプションを設定するなどの小さなことも馬鹿にできません。十分な RAM がある場合、swappiness を無効化したり制限することでディスクへの書き込みが減る可能性があります。
CD/DVD のスピンダウン
udisks を使用してしばらくしてから CD/DVD ロムをスピンダウンさせるには:
# udisks --inhibit-polling /dev/sr0
ツールとスクリプト
スクリプトと udev ルールを使う
systemd ユーザーは systemctl suspend
や systemctl hibernate
でサスペンドとハイバネートを行うことができ、/etc/systemd/logind.conf
で acpi イベントを処理することができるので、pm-utils と acpid を削除するということに興味を引かれるかもしれません。systemd が行えないことがたったひとつだけ存在します (systemd-204 現在): システムが AC 電源またはバッテリーで動作しているのかで別れる電源管理です。このギャップをなくすには、AC アダプタが抜き差しされたときにスクリプトを実行する udev ルールを作成します:
/etc/udev/rules.d/powersave.rules
SUBSYSTEM=="power_supply", ATTR{online}=="0", RUN+="/path/to/your/script true" SUBSYSTEM=="power_supply", ATTR{online}=="1", RUN+="/path/to/your/script false"
powersave スクリプトのサンプル: powerdown, powersave。
上記の udev ルールはちゃんと動作するはずですが、電源設定がサスペンドやハイバネートをした後に更新されない場合、以下の内容で /usr/lib/systemd/system-sleep/
にスクリプトを追加してください:
/usr/lib/systemd/system-sleep/00powersave
#!/bin/sh case $1 in pre) /path/to/your/script false ;; post) if cat /sys/class/power_supply/AC0/online | grep 0 > /dev/null 2>&1 then /path/to/your/script true else /path/to/your/script false fi ;; esac exit 0
忘れずに実行可能属性を付与してください。
これで pm-utils はもう必要なくなりました。設定によっては、他のパッケージの依存パッケージになっている可能性はあります。それでも削除したい場合は、pacman -Rdd pm-utils
を実行してください。
電源設定の表示
以下のスクリプトは 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