电源管理
电源管理 是一项在系统组件不活动时关闭电源或将其切换到低功耗状态的功能。
在 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 Hardware P-state 的处理器
支持 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
有关 Intel 处理器中能源-性能策略的更多详细信息,请参阅 x86_energy_perf_policy(8) 手册页。另请参阅 systemd-tmpfiles(8) 和 tmpfiles.d(5) 手册页,了解有关临时文件/目录的详细信息。
音频
电源管理是否默认开启取决于具体的驱动程序,例如,对于 HD Audio 它是开启的。确定正在使用的模块,然后运行
$ 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 中使用持久设备名称,上述网络规则(按字典顺序命名在 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
根据您的无线网卡,将应用这两个选项中的一个。
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 和设备 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 和产品 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 版本中,当访问 Crucial M550 SSD(固件为 MU02)时,Intel 7 系列芯片组控制器会遇到超时和链路降级问题。
- 在 linux-6.9.6 版本中,与 HL-DT-ST BDDVDRW GGC-H20L 光盘驱动器一起使用的 AMD 600 系列芯片组 SATA 控制器有一个烦人的问题,即光驱每隔几分钟就会发出噪音并重新初始化。
- 在这种情况下,使用
medium_power
设置可以解决问题。
- 在这种情况下,使用
硬盘驱动器
有关可以设置的驱动器参数,请参阅 hdparm#电源管理配置。
当太多程序频繁写入磁盘时,电源管理效果不佳。跟踪所有程序以及它们如何以及何时写入磁盘是限制磁盘使用率的方法。使用 iotop 查看哪些程序频繁使用磁盘。有关其他提示,请参阅 Improving performance#存储设备。
诸如设置 noatime 选项之类的小调整也可能会有所帮助。如果有足够的 RAM 可用,请考虑禁用或限制 swappiness,因为它有可能限制大量的磁盘写入。
对于使用 PowerChoice 技术的希捷硬盘,通过 hdparm 设置 APM 的技巧将不起作用,因为它们具有 EPC(扩展电源条件)功能。您可以安装 openseachestAUR 而不是设置 APM,并像这样完全禁用 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:
标签。