电源管理这个功能可以在系统组件不工作时切断其电源或将其切换到低耗电模式。
Arch 中的电源管理包含两个主要部分:
用户空间工具
这些工具允许你更改许多设置,而无需手动编辑配置文件。请勿同时运行多个程序,以避免冲突,因为它们的工作方式基本类似。更多电源管理选项请参考电源管理分类。
下面是一些比较流行的节能工具:
命令行工具
- acpid — 一个支持 netlink 的 ACPI 电源管理事件分发进程。
- Laptop Mode Tools — 配置笔记本电源设置的工具,很多人将其视为省电标准工具,需要的配置比较多。
- libsmbios — 和 Dell SMBIOS tables 交互的库和工具.
- powertop — 检查电源消耗和电源管理的工具,可以协助省电模式的配置。
- powerstat — 使用 ACPI 或 Intel RAPL 接口测量功耗的工具。
- systemd — 一个系统和服务管理器。
- TLP — Linux 高级电源管理
- TuneD — 执行设备监控和自适应配置的守护进程。
- UPower — 用于枚举电源设备、监听设备事件以及查询历史和统计信息的抽象层。
- power-profiles-daemon — 通过 D-Bus 提供电源配置文件处理功能。
图形化界面
- batsignal — 轻量级电池监视器,使用libnotify来警告电池电量不足。
- cbatticon — 一款在系统托盘中的轻量且快速的电池图标。
- GNOME Power Statistics — GNOME的电源信息统计工具。
- KDE Power Devil — Plasma的电源管理模块。
- LXQt Power Management — LXQt的电源管理模块。
- MATE Power Management — MATE的电源管理工具。
- MATE Power Statistics — MATE的电源信息统计工具。
- poweralertd — 用于传递 UPower 通知的守护进程。
- powerkit — 一个独立于桌面的轻量级全功能电源管理器。
- Xfce Power Manager — Xfce的电源管理工具。
- vattery — 用Vala编写的电池监控应用程序,它将在系统托盘中显示笔记本电脑电池的状态。
ACPI 事件
systemd 处理一些与电源相关的 ACPI 事件,这些事件的操作可以在 /etc/systemd/logind.conf
或 /etc/systemd/logind.conf.d/*.conf
中配置 — 参见 logind.conf(5)。在没有专用电源管理器的系统上,这可能会取代通常用于响应这些 ACPI 事件的 acpid 守护进程。
每个事件的指定操作可以是 ignore
、poweroff
、reboot
、halt
、suspend
、hibernate
、hybrid-sleep
、suspend-then-hibernate
、lock
或 kexec
。在休眠和挂起的情况下,必须正确 设置。如果事件未配置,systemd 将使用默认操作。
事件处理器 | 描述 | 默认操作 |
---|---|---|
HandlePowerKey
|
当电源键/按钮被按下时触发。 |
poweroff
|
HandleSuspendKey
|
当挂起键/按钮被按下时触发。 |
suspend
|
HandleHibernateKey
|
当休眠键/按钮被按下时触发。 |
hibernate
|
HandleLidSwitch
|
当盖子关闭时触发,以下情况除外。 |
suspend
|
HandleLidSwitchDocked
|
当系统插入扩展坞或连接了多个显示器时,盖子关闭时触发。 |
ignore
|
HandleLidSwitchExternalPower
|
当系统连接到外部电源时,盖子关闭时触发。 |
HandleLidSwitch 设置的操作
|
要应用更改,请 reload systemd-logind.service
。
- systemd 无法处理 AC 和电池 ACPI 事件,因此如果你使用 Laptop Mode Tools 或其他类似工具,仍然需要 acpid。
- 当连续快速进行盖子开关操作时,logind 会延迟挂起操作最多 90 秒以检测可能的扩展坞。[1] 从 systemd v220 开始,此延迟可配置。[2] 你可以在
logind.conf
或其 drop-in 文件中使用例如HoldoffTimeoutSec=30s
。
电源管理器
一些 桌面环境 包含电源管理器,这些管理器会 抑制(临时关闭)部分或所有 systemd ACPI 设置。如果此类电源管理器正在运行,则 ACPI 事件的操作可以仅在电源管理器中配置。只有在你想配置未被电源管理器抑制的特定事件的行为时,才需要更改 /etc/systemd/logind.conf
或 /etc/systemd/logind.conf.d/*.conf
。
请注意,如果电源管理器没有为适当的事件抑制 systemd,你可能会遇到 systemd 挂起系统,然后在系统唤醒时,另一个电源管理器再次挂起它的情况。GNOME、MATE、Plasma 和 Xfce 的电源管理器会发出必要的 inhibited 命令。如果没有发出 inhibited 命令,例如在使用 acpid 或其他工具处理 ACPI 事件时,请将 Handle
选项设置为 ignore
。另见 systemd-inhibit(1)。
xss-lock
xss-lock包 订阅 systemd 事件 suspend
、hibernate
、lock-session
和 unlock-session
,并执行适当的操作(运行锁屏程序并等待用户解锁或终止锁屏程序)。xss-lock 还会响应 DPMS 事件,并根据需要运行或终止锁屏程序。
例如,Autostart 以下内容:
$ xss-lock -- i3lock -n -i background_image.png &
节能
本节是创建自定义脚本和节能设置(如 udev 规则)的参考资料。确保设置不由其他实用程序管理,以避免冲突。
这里列出的几乎所有特性都值得使用,无论计算机使用交流电还是电池电源。其中大多数对性能的影响可以忽略不计,只是由于通常的硬件/驱动程序故障而在默认情况下没有启用。减少能源使用意味着减少热量,由于动态超频,在现代英特尔或 AMD CPU 上甚至可以获得更高的性能。
打印电源设置
此脚本打印 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" "内核模块" 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
支持 Intel HWP (Intel Hardware P-state) 的处理器
支持 HWP 的处理器的可用能源首选项有 default
, performance
, balance_performance
, balance_power
, power
。
这可以通过运行
$ cat /sys/devices/system/cpu/cpufreq/policy*/energy_performance_available_preferences
为了节省更多的能源,您可以通过创建以下文件进行配置:
/etc/tmpfiles.d/energy_performance_preference.conf
w /sys/devices/system/cpu/cpufreq/policy*/energy_performance_preference - - - - balance_power
参见 x86_energy_perf_policy(8) 手册页获取关于 Intel 处理器能源性能策略的更多信息。另见 systemd-tmpfiles(8) 和 tmpfiles.d(5) 手册页获取临时文件/目录的详细信息。
音频
默认情况下,音频节能功能是否开启取决于驱动程序,例如 HD Audio 默认开启。识别正在使用的模块,然后运行
$ modinfo --field=parm 模块名称 | column --separator=':' --table --table-columns-limit=2
并查找调整或禁用节能功能的内核模块参数(如 power_save
)。
背光
见背光。
蓝牙
要完全禁用蓝牙,请将 btusb
和 bluetooth
模块列入黑名单。
或者,创建以下 udev 规则:
/etc/udev/rules.d/50-bluetooth.rules
# 禁用蓝牙 SUBSYSTEM=="rfkill", ATTR{type}=="bluetooth", ATTR{state}="0"
要仅暂时关闭蓝牙,使用 rfkill(8):
# rfkill block bluetooth
网络摄像头
如果你不使用集成的网络摄像头,将 uvcvideo
模块加入黑名单。
内核参数
本节使用 /etc/sysctl.d/
中的配置,它是“内核 sysctl 参数的插入式目录”。有关更多信息,参见 The New Configuration Files 和更具体的 sysctl.d(5)。
禁用 NMI 看门狗
NMI(不可屏蔽中断)看门狗是一个调试特性,用于捕捉导致内核 panic 的硬件中断。在某些系统上,它会产生大量的中断,导致用电量明显增加。要列出自上次启动以来每个 CPU 核心的中断,可以使用:
$ grep NMI /proc/interrupts
NMI: 22 58 24 23 24 39 22 30 Non-maskable interrupts
要关闭硬锁检测器,请使用:
/etc/sysctl.d/disable_watchdog.conf
kernel.nmi_watchdog = 0
或者在内核参数中添加 nmi_watchdog=0
。
或者,在内核参数中添加 nowatchdog
以禁用硬锁和软锁检测器。参见 [3]
写回时间
增加虚拟内存脏写回时间有助于将硬盘 I/O 聚合在一起,从而减少跨硬盘写操作,并提高节能。要将值设置为60秒(默认值为5秒):
/etc/sysctl.d/dirty.conf
vm.dirty_writeback_centisecs = 6000
要对支持的文件系统(例如ext4, btrfs...)上的日志提交执行同样的操作,请在 fstab 中使用 commit=60
作为选项。
注意,这个值是作为下面笔记本模式设置的副作用而修改的。另请参阅 Sysctl#虚拟内存了解其他影响 I/O 性能和节能的参数。
笔记本电脑模式
参见笔记本电脑模式“旋钮”的内核文档-“旋钮的合理值为5秒”。
/etc/sysctl.d/laptop.conf
vm.laptop_mode = 5
网络接口
网络唤醒可能是一个有用的功能,但如果你不使用它,那么在挂起时等待魔术包只会消耗额外的电量。您可以调整网络唤醒#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 中使用持久设备名称,在设备重命名为持久名称(例如,wlan0
重命名为 wlp3s0
)后,将应用上述网络规则(以 80-net-setup-link.rules
的字典命名)。请注意,在处理完所有规则之后,将执行 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
根据您的无线网卡,这两个选项之一将适用。
options iwlmvm power_scheme=3
options iwldvm force_cam=0
您可以通过使用下列命令检查这些模块中的哪个模块正在运行来检查哪个模块是相关模块
# lsmod | grep '^iwl.vm'
请记住,这些节能选项是试验性的,可能会导致系统不稳定。
总线电源管理
活动状态电源管理
来自维基百科:
- 活动状态电源管理(ASPM)是 PCI Express 设备在完全活动状态下节省电源的一种机制。主要是通过活动状态链路电源管理实现的;即,当没有流量通过时,PCI Express 串行链路会关闭电源。它通常用于笔记本电脑和其他移动互联网设备以延长电池寿命。
在启动时,BIOS 根据硬件支持启用或禁用 ASPM。要检查支持情况:
# lspci -vv | grep 'ASPM.*abled;'
获取可用的 ASPM 策略和当前系统默认值:
$ cat /sys/module/pcie_aspm/parameters/policy
[default] performance powersave powersupersave
ASPM 可能由于以下原因被禁用 [4]:
- BIOS 确定需要这样做。
- PCIE 需要 ASPM,但 L0s 是可选的,因此您可能禁用了 L0s 而仅启用了 L1。
- 您有一个有问题的 BIOS。
- 您没有 BIOS,并且您的系统程序员尚未处理 ASPM。
如果您认为您的硬件支持 ASPM,尽管有上述情况,可以通过 pcie_aspm=force
内核参数强制启用它。
- 在不支持的系统上强制启用 ASPM 可能会导致功耗增加。此外,它可能会导致系统冻结或内核 panic,因此请确保如果该选项不合适,您有办法撤消它。
- 强制启用 ASPM 是在内核中进行的,因此它可能仍然在硬件中保持禁用状态并且不起作用。要检查是否是这种情况,请以 root 身份运行
dmesg | grep ASPM
。如果可能,请查阅特定于硬件的 Wiki 文章以获取更多信息。
只要 ASPM 支持并启用,就可以为当前会话选择所需的策略。例如,切换到 powersupersave
作为当前会话的策略:
# echo powersupersave > /sys/module/pcie_aspm/parameters/policy
要在系统启动时配置特定的 ASPM 状态(以 powersupersave
为例),请添加 pcie_aspm.policy=powersupersave
作为内核参数。
PCI 运行时电源管理
/etc/udev/rules.d/pci_pm.rules
SUBSYSTEM=="pci", ATTR{power/control}="auto" SUBSYSTEM=="ata_port", KERNEL=="ata*", ATTR{device/power/control}="auto"
上述规则会关闭所有未使用的设备。
某些设备不会再次唤醒。要仅对已知可以工作的设备进行运行时电源管理,请使用对应供应商和设备ID的简单匹配(使用 lspci -nn
获取这些值):
/etc/udev/rules.d/pci_pm.rules
# PCI 自动挂起的白名单 SUBSYSTEM=="pci", ATTR{vendor}=="0x1234", ATTR{device}=="0x1234", ATTR{power/control}="auto"
或者,将不能使用 PCI 运行时电源管理的设备列入黑名单,并为所有其他设备启用:
/etc/udev/rules.d/pci_pm.rules
# PCI 运行时电源管理的黑名单 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 自动挂起
当 USB 设备不使用时,Linux 内核可以自动挂起它们。这有时可以节省相当多的电量,但某些 USB 设备与 USB 节能不兼容,并开始出现错误行为(USB 鼠标/键盘常见)。基于白名单或黑名单过滤的 udev 规则可以帮助缓解问题。
以下示例为所有 USB 设备启用自动挂起,但键盘和鼠标除外:
/etc/udev/rules.d/50-usb_power_save.rules
ACTION=="add", SUBSYSTEM=="usb", ATTR{product}!="*Mouse", ATTR{product}!="*Keyboard", TEST=="power/control", ATTR{power/control}="auto"
要仅允许已知可以工作的设备进行自动挂起,请使用对应供应商和产品 ID 的简单匹配(使用 lsusb 获取这些值):
/etc/udev/rules.d/50-usb_power_save.rules
# USB 自动挂起的白名单 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
# USB 自动挂起的黑名单 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
参数控制。要将延迟设置为5秒而不是默认的2秒,请为引导加载程序添加以下内核参数。
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"
参见 Linux 内核文档获取关于 USB 电源管理的更多信息。
SATA 活动链路电源管理
当前设置可以从 /sys/class/scsi_host/host*/link_power_management_policy
读取或写入:
$ grep . /sys/class/scsi_host/host*/link_power_management_policy $ echo "med_power_with_dipm" >/sys/class/scsi_host/hostN/link_power_management_policy
设置 | 说明 | 节能 |
---|---|---|
max_performance | 当前默认值 | 无 |
medium_power | - | ~1.0瓦 |
med_power_with_dipm | 推荐设置1 | ~1.5瓦 |
min_power | 警告:可能丢失数据2 | ~1.5瓦 |
- 自 Linux 4.15 起,有一个名为
med_power_with_dipm
的设置,它与 Windows IRST 驱动程序设置的行为相匹配,并且不应导致最近的 SSD 或 HDD 数据丢失。节能效果显著,范围从1.0瓦到1.5瓦(空闲时)。它已成为 Linux 4.16 中基于 Intel 的笔记本电脑的默认设置 [5]。在 Linux 6.11 中,它成为默认设置 [6]。 - 警告:
min_power
SATA 活动链路电源管理设置可能会导致某些设备上的数据丢失。除非经常备份,否则不要启用此设置。
您可以通过添加 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"
- 这会增加访问闲置驱动器时的延迟,因此这是少数几个值得根据您是否使用交流电源进行切换的设置之一。
- 并非所有 SATA 主机控制器和存储设备的组合都能与默认的
med_power_with_dipm
设置良好配合。例如:- 截至 linux-6.8.1,Intel 7 系列芯片组控制器在访问 Crucial M550 SSD(固件 MU02)时会出现超时和链路退化。
- 截至 linux-6.9.6,AMD 600 系列芯片组 SATA 控制器与 HL-DT-ST BDDVDRW GGC-H20L 光盘驱动器一起使用时,会产生令人讨厌的效果,即每隔几分钟就会重新初始化光盘驱动器。
- 在这种情况下,使用
medium_power
设置可以解决问题。
- 在这种情况下,使用
硬盘驱动器
有关可以设置的驱动器参数,请参见hdparm#电源管理配置。
当有太多程序频繁写入硬盘时,节能效果不佳。跟踪所有程序,获取它们如何以及何时写入硬盘以限制磁盘使用。使用 iotop包 查看哪些程序经常使用磁盘。有关其他提示,请参见性能优化#存储设备。
诸如设置 noatime 选项之类的小事情也会有所帮助。如果有足够的 RAM 可用,请考虑禁用或限制交换值,因为它可能会限制大量的磁盘写操作。
对于具有 PowerChoice 技术的希捷驱动器,通过 hdparm 设置 APM 的技巧将不起作用,因为 EPC(扩展电源条件)功能。与其设置 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
Zeroes in the first column confirm that parking and spindown were disabled successfully
工具和脚本
使用脚本和 udev 规则
由于 systemd 用户可以通过 systemctl suspend
或 systemctl hibernate
来挂起和休眠,并能使用 /etc/systemd/logind.conf
处理 acpi 事件,因此删除 pm-utils 和 acpid 可能会很具吸引力。只有一件事 systemd 不能做(自 systemd-204):电源管理取决于系统是运行在交流电还是电池上。为了填补这个空白,您可以创建一个 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"
/usr/local/bin/
)。节能脚本示例:
- ftw, 包:ftw-gitAUR
- powersave
- throttlectl,来自 throttlectlAUR
上述 udev 规则应按预期工作,但如果在挂起或休眠周期后未更新电源设置,则应在 /usr/lib/systemd/system-sleep/
中添加一个脚本,其中包含以下内容:
/usr/lib/systemd/system-sleep/00powersave
#!/bin/sh case $1 in pre) /path/to/your/script false ;; post) if cat /sys/class/power_supply/AC0/online | grep 0 > /dev/null 2>&1 then /path/to/your/script true else /path/to/your/script false fi ;; esac exit 0
不要忘记使它可执行!
允许用户关机
按钮和笔记本盖事件
按挂起、关机、休眠按钮以及笔记本盖关闭事件由 logind 处理,请参考 #ACPI events。
使用 systemd-logind
如果正在使用 polkit包,只要会话未中断,具有非远程会话的用户就可以发出与电源相关的命令。
检查会话是否处于活动状态:
$ loginctl show-session $XDG_SESSION_ID --property=Active
然后,用户可以在命令行中使用 systemctl 命令,或者将它们添加到菜单中:
$ systemctl poweroff $ systemctl reboot
也可以使用 systemctl suspend
和 systemctl hibernate
等其它命令。请参见 systemctl(1) 中的系统命令章节。
使用 sudo
安装 sudo包,并授予用户 sudo 权限。用户就能够使用 sudo systemctl
命令(例如, sudo systemctl poweroff
, sudo systemctl reboot
, sudo systemctl suspend
和 sudo systemctl hibernate
)。请参见 systemctl(1) 中的系统命令章节。
没有 sudo 权限的用户
如果只允许用户使用关闭命令,而不允许用户拥有其他 sudo 权限,那么作为 root 用户,使用 visudo
命令将以下内容添加到 /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:
标签。