コンテンツにスキップ

「省電力設定」の版間の差分

提供: ArchWiki
削除された内容 追加された内容
電源管理#省電力設定への転送ページ
1行目: 1行目:
[[Category:電源管理]]
#redirect[[電源管理#省電力設定]]
[[en:Power saving]]
{{Related articles start}}
{{Related|電源管理}}
{{Related|CPU 周波数スケーリング}}
{{Related|ハイブリッドグラフィック}}
{{Related|カーネルモジュール}}
{{Related|sysctl}}
{{Related|udev}}
{{Related articles end}}
この記事では省電力機能を使用するのに必要な設定を扱います。コンピュータが AC 電源またはバッテリーで動作しているかに関わらず、ここに記載されているほとんど全ての機能には使用する価値があります。パフォーマンスへの影響は軽微ですが、大抵壊れているハードウェアやドライバーのためにデフォルトでは有効になっていません。電力の使用量を減らすことは熱を減らすことでもあり、[[Wikipedia:ja:インテル ターボ・ブースト・テクノロジー|動的なオーバークロック]]によって、最近の Intel や AMD の CPU ではパフォーマンスの向上につながることもあります。

== 設定 ==

udev ルールなどを使ってスクリプトや省電力設定を自分で作成したい場合は以下の設定を参考にすることができます。

{{Note|以下で記述しているルールのほとんどは [[TLP|TLP]] などのツールで管理することもでき、ツールを使いながら自分でも管理するのは不得策です。}}

=== オーディオ ===

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

{{hc|/etc/modprobe.d/audio_powersave.conf|2=options snd_hda_intel power_save=1}}

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

options snd_ac97_codec power_save=1

{{Note|サウンドカードの電源状態を変更すると壊れたハードウェアでポップノイズがまじったり著しい遅延が発生することがあります。}}

=== バックライト ===

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

=== Bluetooth ===

[[Bluetooth|Bluetooth]] を完全に無効化するには、{{ic|btusb}} と {{ic|bluetooth}} モジュールを[[カーネルモジュール#ブラックリスト|ブラックリスト]]に入れてください。

一時的にだけ bluetooth をオフにするには、{{Pkg|rfkill}} を使用します:

# rfkill block bluetooth

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

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

または {{Pkg|rfkill}} パッケージに入っている {{ic|rfkill-block@bluetooth.service}} を[[systemd#ユニットを使う|有効化]]してください。

=== ウェブカメラ ===

内蔵のウェブカメラを使わない場合、{{ic|uvcvideo}} モジュールを[[カーネルモジュール#ブラックリスト|ブラックリスト]]に入れてください。

=== カーネルパラメータ ===

このセクションでは {{ic|/etc/sysctl.d/}} の設定を使います。このディレクトリはカーネルの sysctl パラメータと対応するディレクトリです。詳しくは [http://0pointer.de/blog/projects/the-new-configuration-files The New Configuration Files] や、より正確な [http://0pointer.de/public/systemd-man/sysctl.d.html systemd の sysctl.d man ページ] を見て下さい。

==== NMI watchdog の無効化 ====

[[Wikipedia:Non-maskable interrupt|NMI]] watchdog はカーネルパニックを引き起こすハードウェアのハングアップをキャッチするデバッグ機能です。システムによっては大量の割り込みが発生するため、消費電力の増加につながっていることがあります:

{{hc|/etc/sysctl.d/disable_watchdog.conf|2=kernel.nmi_watchdog = 0}}

もしくは起動の初期で完全に無効化するには[[カーネルパラメータ|カーネル行]]に {{ic|1=nmi_watchdog=0}} を追加してください。

==== ライトバック時間 ====

仮想メモリのダーティなライトバック時間を増やすことでディスク I/O がまとめられて、断続的なディスクの書き込みが減って、消費電力が抑えられます。この値を60秒に設定するには (デフォルトは5秒です):

{{hc|/etc/sysctl.d/dirty.conf|2=vm.dirty_writeback_centisecs = 6000}}

ジャーナルをサポートしているファイルシステム (ext4 や btrfs など) でジャーナルコミットでも同じことをするには、[[fstab|fstab]] でオプションとして {{ic|1=commit=60}} を使用します。

I/O パフォーマンスや省電力に影響する他のパラメータは [[sysctl#仮想メモリ]] を参照。

==== Laptop Mode ====

ラップトップモードの'ノブ'については[https://www.kernel.org/doc/Documentation/laptops/laptop-mode.txt カーネルドキュメント]を見て下さい。''"このノブの適切な値は5秒です。"''

{{hc|/etc/sysctl.d/laptop.conf|2=vm.laptop_mode = 5}}

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

[[Wikipedia:ja:Wake-on-LAN|Wake-on-LAN]] は便利な機能ですが、利用しない場合はサスペンド中にマジックパケットが来るのを待つのに無駄な電力を消耗するだけです。全ての Ethernet インターフェイスで Wake-on-LAN を無効化:

{{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/70-wifi-powersave.rules|2=ACTION=="add", SUBSYSTEM=="net", KERNEL=="wlan*", RUN+="/usr/bin/iw dev %k set power_save on"}}

上記の例では、{{ic|%k}} がマッチするデバイスのカーネル名を示します。例えば、ルールが {{ic|wlan0}} に適用可能とわかった場合、{{ic|%k}} は {{ic|wlan0}} に置き換えられます。特定のインターフェイスにだけルールを適用するには、パターン {{ic|eth*}} と修飾子 {{ic|%k}} を適当なインターフェイスの名前に置き換えて下さい。詳しくは、[http://www.reactivated.net/writing_udev_rules.html Writing udev rules] を参照。

ここで、設定ファイルの名前は重要です。systemd v197 から {{ic|80-net-name-slot.rules}} によって[[Network Configuration#デバイス名|永続的なデバイス名]]が導入されたため、デバイスに {{ic|enp2s0}} というような名前で呼ばれるようになる前に適用されるように、ネットワークの powersave ファイルは辞書順で {{ic|80-net-name-slot.rules}} よりも前に来る名前を付けなくてはなりません。

=== バスパワーの管理 ===

==== Active State Power Management ====

コンピュータが [[Wikipedia:Active State Power Management|ASPM]] をサポートしているという信頼が得られなかった場合、起動時に無効化されます:

$ lspci -vv | grep ASPM.*abled\;

ASPM は BIOS によって扱われるため、ASPM が無効化される理由は以下の通りです [http://wireless.kernel.org/en/users/Documentation/ASPM]:

# BIOS が何らかの理由で ASPM を無効化した (コンフリクトが起こるから?)。
# PCIE が L0s 以外の ASPM を必要とする (L0s は無効化され L1 だけが有効化される)。
# ASPM について BIOS がプログラムされていない。
# BIOS にバグが存在する。

コンピュータが ASPM をサポートしていると信じられる場合は、{{ic|1=pcie_aspm=force}} [[カーネルパラメータ]]を使うことで強制的にオンにすることができます。

{{Warning|
* ASPM を強制するとフリーズやパニックが発生することがあります。ASPM が動作しなかったときにオプションを戻す手段があるか確認してください。
* ASPM をサポートしていないシステムで強制させると消費電力が逆に上昇することがあります。
}}

{{ic|powersave}} に調整するには次を実行 (以下のコマンドは ASPM が有効になっていないと機能しません):

echo powersave | tee /sys/module/pcie_aspm/parameters/policy

デフォルトでは以下のようになります:

{{hc|$ cat /sys/module/pcie_aspm/parameters/policy|[default] performance powersave}}

==== PCI Runtime Power Management ====

{{hc|/etc/udev/rules.d/pci_pm.rules|2=ACTION=="add", SUBSYSTEM=="pci", ATTR{power/control}="auto"}}

==== デバイスの電源管理 ====

''USB を含む''、(ほぼ) 全てのデバイスの電源管理を有効化:

{{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"

# Various subsystems power saving (by module)
ACTION=="add", SUBSYSTEMS=="*", TEST=="parameters/power_save", ATTR{parameters/power_save}="1" </nowiki>}}

影響を受けるデバイスを表示するには:
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|udev]] ルールを使うことで問題は軽減されます。

最も単純であまり役に立たない、全ての USB デバイスで自動サスペンドを有効にする例:

{{hc|/etc/udev/rules.d/50-usb_power_save.rules|<nowiki>
ACTION=="add", SUBSYSTEM=="usb", TEST=="power/control", ATTR{power/control}="auto"
</nowiki>}}

自動サスペンドが動作するデバイスにだけ自動サスペンドを有効にするには、ベンダーとプロダクト ID でマッチングを行います (''lsusb'' を使って値を取得):

{{hc|/etc/udev/rules.d/50-usb_power_save.rules|<nowiki>
# whitelist for usb autosuspend
ACTION=="add", SUBSYSTEM=="usb", TEST=="power/control", ATTR{idVendor}=="05c6", ATTR{idProduct}=="9205", ATTR{power/control}="auto"
</nowiki>}}

もしくは、USB 自動サスペンドが使えないデバイスをブラックリストに入れて、他の全てのデバイスで自動サスペンドを有効にするには:

{{hc|/etc/udev/rules.d/50-usb_power_save.rules|<nowiki>
# 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"
</nowiki>}}

自動サスペンドに入るデフォルトのアイドル遅延時間は {{ic|usbcore}} [[カーネルモジュール]]の {{ic|autosuspend}} パラメータによって制御されています。遅延時間をデフォルトの2秒から5秒に設定するには:

{{hc|/etc/modprobe.d/usb-autosuspend.conf|<nowiki>
options usbcore autosuspend=5
</nowiki>}}

{{ic|power/control}} と同じように、{{ic|power/autosuspend}} 属性を設定することで遅延時間はデバイスごとに細かく設定することができます。

USB の電源管理に関する詳細は [https://www.kernel.org/doc/Documentation/usb/power-management.txt Linux カーネルドキュメント]を見て下さい。

==== SATA Active Link Power Management ====

{{Note|This adds latency when accessing a drive that has been idle, so it is one of the few settings that may be worth toggling based on whether you are on AC power.}}

{{hc|/etc/udev/rules.d/hd_power_save.rules|2=ACTION=="add", SUBSYSTEM=="scsi_host", KERNEL=="host*", ATTR{link_power_management_policy}="min_power"}}

{{Warning|デバイスによっては SATA Active Link Power Management でデータが消失する可能性があります (例: Lenovo T440s はこの問題を抱えていることが[http://lkml.indiana.edu/hypermail/linux/kernel/1401.2/02171.html 知られています] 。}}

=== ハードディスクドライブ ===

設定できるドライブのパラメータについては [[hdparm|hdparm]] を見て下さい。

多数のプログラムがディスクに頻繁に書き込みをおこなう場合は省電力は効率的ではありません。全てのプログラムを調査して、いつどのようにプログラムがディスクに書き込むを行うのか調べるのがディスクの使用量を減らす道です。{{Pkg|iotop}} を使えばどのプログラムがディスクに頻繁に書き込みしているかわかります。他のヒントは [[Solid State Drives#SSD の読み書きを最小化するヒント]] を見て下さい、ほとんどのヒントは SSD に限ったものではありません。

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

=== CD/DVD のスピンダウン ===

[[udisks|udisks]] を使用してしばらくしてから CD/DVD ロムをスピンダウンさせるには:

# udisks --inhibit-polling /dev/sr0

== ツールとスクリプト ==

=== パッケージ ===

以下のツールを使うことで手動で多数の設定を行うかわりになります。どのツールも多かれ少なかれ同じような動作をするので、衝突をさけるためにツールはどれか一つだけを実行してください。[[:Category:電源管理|電源管理カテゴリ]]を見ることで Archlinux にどんな電源管理の選択肢が存在するかわかります。

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

* {{App|[[acpid|acpid]]|ACPI の電源管理イベントを届けるデーモン。netlink をサポート。|http://sourceforge.net/projects/acpid2/|{{Pkg|acpid}}}}
* {{App|ftw|節電のための udev ルールを設定するスクリプト。|https://github.com/supplantr/ftw|{{AUR|ftw-git}}}}
* {{App|[[Laptop Mode Tools|Laptop Mode Tools]]|ノートパソコンの省電力設定をするユーティリティ。多少設定が要りますが省電力設定ユーティリティのデファクトスタンダードとされています。|https://github.com/rickysarraf/laptop-mode-tools|{{AUR|laptop-mode-tools}}}}
* {{App|[[pm-utils]]|サスペンドと電源状態設定のフレームワーク (今のところ大部分が開発途上)。|http://pm-utils.freedesktop.org/|{{Pkg|pm-utils}}}}
* {{App|[[Powerdown|Powerdown]]|様々な設定によってコンピュータの消費電力を減らすスクリプト。|https://github.com/taylorchu/powerdown|{{Aur|powerdown-git}}}}
* {{App|[[powertop|powertop]]|消費電力や電源管理の問題を診断して省電力設定を補助するツール。|https://01.org/powertop/|{{Pkg|powertop}}}}
* {{App|[[TLP|TLP]]|Linux 向けの先進的な電源管理。|http://linrunner.de/en/tlp/docs/tlp-linux-advanced-power-management.html|{{Pkg|tlp}}}}

=== スクリプトと udev ルールを使う ===

systemd ユーザーは {{ic|systemctl suspend}} や {{ic|systemctl hibernate}} でサスペンドとハイバネートを行うことができ、{{ic|/etc/systemd/logind.conf}} で acpi イベントを処理することができるので、[[pm-utils]] と [[acpid|acpid]] を削除するということに興味を引かれるかもしれません。systemd が行えないことがたったひとつだけ存在します (systemd-204 現在): システムが AC 電源またはバッテリーで動作しているのかで別れる電源管理です。このギャップをなくすには、AC アダプタが抜き差しされたときにスクリプトを実行する [[udev|udev]] ルールを作成します:

{{hc|/etc/udev/rules.d/powersave.rules|2=<nowiki>
SUBSYSTEM=="power_supply", ATTR{online}=="0", RUN+="/path/to/your/script true"
SUBSYSTEM=="power_supply", ATTR{online}=="1", RUN+="/path/to/your/script false"
</nowiki>}}

{{Note|''pm-powersave'' が使用しているのと同じスクリプトを使うことができます。実行可能属性を付与して別の所に保存する必要があります (例えば {{ic|/usr/local/bin/}})。}}

powersave スクリプトのサンプル: [[powerdown|powerdown]], [https://github.com/Unia/powersave powersave]。

上記の udev ルールはちゃんと動作するはずですが、電源設定がサスペンドやハイバネートをした後に更新されない場合、以下の内容で {{ic|/usr/lib/systemd/system-sleep/}} にスクリプトを追加してください:

{{hc|/usr/lib/systemd/system-sleep/00powersave|<nowiki>
#!/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
</nowiki>}}

忘れずに実行可能属性を付与してください。

{{Note|あなたのノートパソコンでは AC0 が異なっている可能性があります。その場合は変更してください。}}

これで pm-utils はもう必要なくなりました。設定によっては、他のパッケージの依存パッケージになっている可能性はあります。それでも削除したい場合は、{{ic|pacman -Rdd pm-utils}} を実行してください。

=== 電源設定の表示 ===

以下のスクリプトは USB や PCI デバイスの電源設定などのプロパティを表示します。全ての設定を見るには root 権限が必要なので注意して下さい。

{{bc|<nowiki>
#!/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
</nowiki>}}

== 参照 ==

* [http://www.thinkwiki.org/wiki/How_to_reduce_power_consumption ThinkWiki:How to reduce power consumption]
* [http://forum.manjaro.org/index.php?topic=1166.0 Manjro BBS topic]
* [https://wiki.ubuntu.com/Kernel/PowerManagement/PowerSavingTweaks Ubuntu Wiki's Power Saving Tweaks]

2015年11月13日 (金) 16:23時点における版