电源管理
电源管理 是一项在系统组件不活动时关闭电源或将其切换到低功耗状态的功能。
在 Arch Linux 中,电源管理由两个主要部分组成
用户空间工具
这些工具允许您更改许多设置,而无需手动编辑配置文件。仅运行其中一个工具以避免可能发生的冲突,因为它们的工作方式或多或少相似。查看电源管理类别以大致了解 Arch Linux 中存在的电源管理选项。
以下是更流行的旨在帮助节能的脚本和工具
控制台
- acpid — 用于传递 ACPI 电源管理事件并支持 netlink 的守护进程。
- Laptop Mode Tools — 用于配置笔记本电脑节能设置的实用程序,被许多人认为是事实上的节能实用程序,尽管可能需要进行一些配置。
- libsmbios — 用于与 Dell SMBIOS 表交互的库和工具。
- 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 设置的操作 |
要应用更改,重新加载 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 的电源管理器发出必要的抑制命令。如果未发出抑制命令,例如在使用 acpid 或其他程序来处理 ACPI 事件时,请将 Handle
选项设置为 ignore
。另请参阅 systemd-inhibit(1)。
xss-lock
xss-lock 订阅 systemd 事件 suspend
、hibernate
、lock-session
和 unlock-session
,并执行适当的操作(运行锁屏程序并等待用户解锁或杀死锁屏程序)。xss-lock 还会响应 DPMS 事件,并运行或杀死锁屏程序作为响应。
例如自动启动以下内容
$ xss-lock -- i3lock -n -i background_image.png &
节能
本节是创建自定义脚本和节能设置(例如通过 udev 规则)的参考。确保这些设置不受其他实用程序管理,以避免冲突。
此处列出的大多数功能都值得使用,无论计算机是否使用交流电源或电池电源。大多数功能对性能的影响可以忽略不计,只是由于常见的硬件/驱动程序损坏而默认未启用。降低功耗意味着减少热量,这甚至可以提高现代 Intel 或 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" "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
支持 Intel 硬件 P 状态的处理器
支持 Intel 硬件 P 状态 (HWP) 的处理器的可用能源偏好设置为 default
、performance
、balance_performance
、balance_power
、power
。
可以通过运行以下命令进行验证
$ cat /sys/devices/system/cpu/cpufreq/policy*/energy_performance_available_preferences
为了节省更多能源,您可以通过创建以下文件来编辑配置
/etc/tmpfiles.d/energy_performance_preference.conf
w /sys/devices/system/cpu/cpufreq/policy*/energy_performance_preference - - - - balance_power
有关 Intel 处理器中能量-性能策略的更多详细信息,请参阅 x86_energy_perf_policy(8) 手册页。另请参阅 systemd-tmpfiles(8) 和 tmpfiles.d(5) 手册页,了解临时文件/目录的详细信息。
音频
是否默认启用节能取决于给定的驱动程序,例如,对于高清音频,它是启用的。识别正在使用的模块,然后运行
$ modinfo --field=parm module_name | column --separator=':' --table --table-columns-limit=2
并查找调整或禁用节能功能的内核模块参数(如 power_save
)。
背光
请参阅 背光。
蓝牙
要完全禁用蓝牙,请列入黑名单 btusb
和 bluetooth
模块。
或者,创建以下 udev 规则
/etc/udev/rules.d/50-bluetooth.rules
# disable bluetooth SUBSYSTEM=="rfkill", ATTR{type}=="bluetooth", ATTR{state}="0"
要仅临时关闭蓝牙,请使用 rfkill(8)
# rfkill block bluetooth
网络摄像头
如果您不使用集成网络摄像头,请列入黑名单 uvcvideo
模块。
内核参数
本节使用 /etc/sysctl.d/
中的配置,它是“内核 sysctl 参数的 drop-in 目录”。有关更多信息,请参阅 The New Configuration Files,更具体地说,请参阅 sysctl.d(5)。
禁用 NMI 监视器
NMI 监视器是一种调试功能,用于捕获导致内核崩溃的硬件挂起。在某些系统上,它可能会生成大量中断,导致功耗显着增加。要列出自上次启动以来每个 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
网络接口
网络唤醒可能是一项有用的功能,但如果您不使用它,那么它只是在挂起时消耗额外的电量等待魔术数据包。您可以调整 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 中的持久设备名称的使用,在设备使用持久名称(例如,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 可能会导致功耗增加。此外,它可能会导致系统冻结或内核崩溃,因此请确保您有一种方法可以在不合适的情况下撤消该选项。
- 强制 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"
上面的规则关闭了所有未使用的设备,但有些设备将无法再次唤醒。要仅允许对已知可用的设备进行运行时电源管理,请使用针对供应商和设备 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 运行时电源管理不兼容的设备列入黑名单,并为所有其他设备启用它
/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 鼠标/键盘常见)。基于白名单或黑名单过滤的 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
参数控制。要将延迟设置为 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"
有关 USB 电源管理的更多信息,请参阅Linux 内核文档。
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]。 - 警告:
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 光盘驱动器一起使用时,会产生 ROM 驱动器每隔几分钟就会发出噪音并重新初始化的烦人效果。
- 在这种情况下,使用
medium_power
设置可以解决问题。
- 在这种情况下,使用
硬盘驱动器
有关可以设置的驱动器参数,请参阅 hdparm#电源管理配置。
当太多程序频繁写入磁盘时,节能效果不佳。跟踪所有程序以及它们如何以及何时写入磁盘是限制磁盘使用率的方法。使用 iotop 查看哪些程序频繁使用磁盘。有关其他技巧,请参阅 提高性能#存储设备。
诸如设置 noatime 选项之类的小调整也有助于提高性能。如果有足够的 RAM 可用,请考虑禁用或限制 交换性,因为它有可能限制大量磁盘写入。
对于具有 PowerChoice 技术的 Seagate 驱动器,通过 hdparm 设置 APM 的技巧将不起作用,因为使用了 EPC(扩展电源条件)功能。您可以安装 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
第一列中的零确认已成功禁用停车和停转
工具和脚本
使用脚本和 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 事件中所述。
使用 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:
标签。