来自 Arch Linux 中文维基

电源管理这个功能可以在系统组件不工作时切断其电源或将其切换到低耗电模式。

Arch 中的电源管理包含两个主要部分:

  1. 配置与硬件交互的内核
  2. 配置用户空间工具,这些工具与内核交互并对其事件作出反应。许多用户空间工具还允许以“用户友好”的方式修改内核配置。有关选项,参见# 用户空间工具

用户空间工具

使用这些工具可以简化配置,因为它们的工作方式基本类似,所以请勿同时运行多个程序,以避免冲突。更多电源管理选项请参考 电源管理分类。 下面是一些比较流行的节能工具:

命令行工具

  • acpid — 一个支持 netlink 的 ACPI 电源管理事件分发进程。
https://sourceforge.net/projects/acpid2/ || acpid
  • Laptop Mode Tools — 配置笔记本电源设置的工具,很多人将其视为省电标准工具,需要的配置比较多。
https://github.com/rickysarraf/laptop-mode-tools || laptop-mode-toolsAUR
  • libsmbios — 和 Dell SMBIOS tables 交互的库和工具.
https://github.com/dell/libsmbios || libsmbios
  • powertop — 检查电源消耗和电源管理的工具,可以协助省电模式的配置。
https://01.org/powertop/ || powertop
  • systemd — 一个系统和服务管理器。
https://freedesktop.org/wiki/Software/systemd/ || systemd
  • TLP — Linux 高级电源管理
https://linrunner.de/tlp || tlp

图形化界面

  • batsignal — 轻量级电池监视器,使用libnotify来警告电池电量不足。
https://github.com/electrickite/batsignal || batsignalAUR
  • cbatticon — 一款在系统托盘中的轻量且快速的电池图标。
https://github.com/valr/cbatticon || cbatticon
  • GNOME Power Statistics — GNOME的电源信息统计工具。
https://gitlab.gnome.org/GNOME/gnome-power-manager || gnome-power-manager
  • KDE Power Devil — Plasma的电源管理模块。
https://invent.kde.org/plasma/powerdevil || powerdevil
  • LXQt Power Management — LXQt的电源管理模块。
https://github.com/lxqt/lxqt-powermanagement || lxqt-powermanagement
  • MATE Power Management — MATE的电源管理工具。
https://github.com/mate-desktop/mate-power-manager || mate-power-manager
  • MATE Power Statistics — MATE的电源信息统计工具。
https://github.com/mate-desktop/mate-power-manager || mate-power-manager
  • poweralertd — 用于传递 UPower 通知的守护进程。
https://git.sr.ht/~kennylevinsen/poweralertd || poweralertdAUR
  • powerkit — 一个独立于桌面的轻量级全功能电源管理器。
https://github.com/rodlie/powerkit || powerkitAUR
  • Xfce Power Manager — Xfce的电源管理工具。
https://docs.xfce.org/xfce/xfce4-power-manager/start || xfce4-power-manager
  • vattery — 用Vala编写的电池监控应用程序,它将在系统托盘中显示笔记本电脑电池的状态。
https://www.jezra.net/projects/vattery.html || vatteryAUR

电源管理

ACPI 事件

systemd 能够处理某些电源相关的 ACPI 事件,通过 /etc/systemd/logind.conf/etc/systemd/logind.conf.d/*.conf 进行配置,请参考 logind.conf(5). 如果系统没有专门的电源管理程序,systemd 可以替换掉原本用来响应这些 ACPI 事件的 acpid

事件的动作可以是 ignore, poweroff, reboot, halt, suspend, hibernate, hybrid-sleep, suspend-then-hibernate, lockkexec. 休眠或挂起动作需要被正确 设置. 如果没有配置事件动作,systemd 会使用默认动作。

事件处理程序 描述 默认动作
HandlePowerKey 按下电源键后的动作 poweroff
HandleSuspendKey 按下挂起键后的动作 suspend
HandleHibernateKey 按下休眠键后触发的动作 hibernate
HandleLidSwitch 笔记本翻盖后触发的动作,除了下面的情况 suspend
HandleLidSwitchDocked 如果笔记本放到了扩展坞或连接了多个显示器时,笔记本翻盖合上时触发的动作 ignore
HandleLidSwitchExternalPower 如果系统连接到外部电源,笔记本翻盖合上时触发。 HandleLidSwitch 的操作集

要应用修改,向 systemd-logind 发送 HUP 信号:

# systemctl kill -s HUP systemd-logind
注意: systemd 无法处理交流电源和电池 ACPI 事件,所以还得使用 Laptop Mode Toolsacpid 工具。

电源管理器

有些 桌面环境 包含的电源管理器会 禁用(临时关闭) 某些或全部 systemd ACPI 设置。这些电源管理器运行时,请在它们的设置中配置 ACPI 事件的动作,只有不被禁用的事件才能在 /etc/systemd/logind.conf/etc/systemd/logind.conf.d/*.conf 中配置。

如果电源管理器没有禁用 systemd 的事件动作,可能出现 systemd 挂起了系统,然后当系统被唤醒之后,电源管理器又再次将系统挂起的情况。KDE, GNOME, XfceMATE 的电源管理器会执行需要的禁用命令。在使用 acpid 或其它程序处理 ACPI 事件时,响应的 systemd 动作没有被禁用,可以将 Handle 设置为 ignore. 请参考 systemd-inhibit(1).

xss-lock

xss-lock 订阅 systemd 的 suspend, hibernate, lock-sessionunlock-session 事件,并执行对应的动作(运行屏幕锁定并等待用户解锁或停止锁定). xss-lock 还会响应 DPMS 事件并执行屏幕锁定和解锁动作。

下面命令可以 自动启动 xss-lock:

xss-lock -- i3lock -n -i background_image.png &

休眠和挂起

systemd 提供了挂起到内存或休眠命令,使用内核的原生挂起/恢复功能执行响应的动作。systemd 还可以添加钩子来在挂起前和后执行自定义动作。

systemctl suspend 应该不需要额外的配置,要使用 systemctl hibernate,需要先按照 挂起与休眠#休眠 进行设置。

此外,还有两种结合了挂起和休眠的模式:

  • systemctl hybrid-sleep 将系统同时挂起到 RAM 和硬盘上,因此完全断电不会导致数据丢失。这种模式也称为双重挂起
  • systemctl suspend-then-hibernate 首先尝试将系统挂起到 RAM,如果系统没有在 systemd-sleep.conf(5)HibernateDelaySec 所指定的延迟内中断,之后系统将被唤醒并使用 RTC 警报和休眠。
注意: 除了默认的 内核 后端之外,systemd 也可以使用其他挂起后端(比如 Uswsusp英语Uswsusp),以使电脑进入睡眠或休眠状态。相关示例,请参见 Uswsusp#使用 systemd英语Uswsusp#With systemd

挂起或休眠请求时的混合睡眠

即使在 挂起休眠 请求时,也可以将 systemd 配置为始终执行 混合睡眠

默认的 挂起休眠 动作能在 /etc/systemd/sleep.conf 文件进行配置。配置这两项动作到 混合睡眠

/etc/systemd/sleep.conf
[Sleep]
# suspend=hybrid-sleep
SuspendMode=suspend
SuspendState=disk
# hibernate=hybrid-sleep
HibernateMode=suspend
HibernateState=disk

详细信息请参见 sleep.conf.d(5) 手册页和 关于电源状态的内核文档

禁用挂起

当使用设备作为(比如)服务器时,可能不需要挂起,甚至可能不希望挂起。 任何睡眠状态都可以配置:

/etc/systemd/sleep.conf
[Sleep]
AllowSuspend=no
AllowHibernation=no
AllowSuspendThenHibernate=no
AllowHybridSleep=no

睡眠钩子

挂起/恢复服务文件

可以将服务文件附在 suspend.target, hibernate.target, sleep.target, hybrid-sleep.targetsuspend-then-hibernate.target 中,这样就能在挂起/休眠前后执行某些操作。用户级操作和 root/系统级操作应该使用不同的服务文件。启用 suspend@userresume@user 服务,以便在开机时启动它们。例如:

/etc/systemd/system/suspend@.service
[Unit]
Description=User suspend actions
Before=sleep.target

[Service]
User=%I
Type=forking
Environment=DISPLAY=:0
ExecStartPre= -/usr/bin/pkill -u %u unison ; /usr/local/bin/music.sh 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
ExecStart=/usr/local/bin/ssh-connect.sh

[Install]
WantedBy=suspend.target
注意: 由于屏幕锁定器可能会在屏幕“锁定”之前返回,因此屏幕可能会在从挂起状态恢复时闪烁。通过 ExecStartPost=/usr/bin/sleep 1 添加一个小延迟有助于防止这种情况。

对于 root/系统级操作(启用 root-resumeroot-suspend 以便在开机时启动它们):

/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
/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
提示:关于这些服务文件的一些有用提示(详见 systemd.service(5)):
  • 如果设置 Type=oneshot,那么可以使用多个 ExecStart= 参数。否则只能写一个,替代方案是在 ExecStartPre 中添加命令,或使用分号分隔不同命令(见第一个例子,分号前后的空格都是必须的)。
  • 若命令前加上一个 -(半角减号),则命令返回非零值时会被忽略、当作正常执行处理。
  • 在对这些服务文件进行故障排除时,发现错误的最佳方法当然是使用 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:服务启动后,除非显式地停止,否则就认为是活动的。
  • StopWhenUnneeded=yes:服务活动时,如果无其他活动服务依赖该服务,就停止它。在本例中,该服务会在 sleep.target 停止后停止活动。
  • 由于 sleep.targetsuspend.target, hibernate.targethybrid-sleep.target 拉入,并且因为 sleep.target 本身是一个 StopWhenUnneeded 服务,所以可以保证钩子可以针对不同的任务正确启动/停止。
通用服务模板

在本例中,我们创建了一个 模板服务,然后可以使用该模板服务将任何现有的 systemd 服务与电源事件挂钩:[1]

/etc/systemd/system/sleep@.service
[Unit]
Description=%I sleep hook
Before=sleep.target
StopWhenUnneeded=yes

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=-/usr/bin/systemctl stop %i
ExecStop=-/usr/bin/systemctl start %i

[Install]
WantedBy=sleep.target

然后通过在 @ 之后指定现有 systemd 服务的基名来启用该模板的一个实例,即:sleep@service-file-basename.service。参见 systemd.unit(5) § DESCRIPTION 获取关于模板的更多信息。

提示:模板不限于 systemd 服务,可以与其他程序一起使用。参见 [2] 获取一些示例。

挂接到 /usr/lib/systemd/system-sleep

systemd 会执行 /usr/lib/systemd/system-sleep/ 里的所有脚本,并将两个参数传递给它们:

  • 参数1:若是准备进入睡眠状态,则为 pre;唤醒时为 post
  • 参数2:事件名称,suspendhibernatehybrid-sleep

systemd 会同时执行所有脚本。

自定义脚本的输出会由 systemd-suspend.service, systemd-hibernate.servicesystemd-hybrid-sleep.service 记录。可以通过 systemd 的 journalctl 查看:

# journalctl -b -u systemd-suspend.service
注意: 除了使用自定义脚本,还可以利用 sleep.target, suspend.target, hibernate.targethybrid-sleep.target 来将单元(unit)挂接到睡眠状态策略。

一个自定义睡眠脚本的示例:

/usr/lib/systemd/system-sleep/example.sh
#!/bin/sh
case $1/$2 in
  pre/*)
    echo "进入 $2 状态..."
    ;;
  post/*)
    echo "从 $2 状态唤醒..."
    ;;
esac

不要忘了让你的脚本可执行

参见 systemd.special(7)systemd-sleep(8) 获取更多信息。

疑难解答

延迟笔记本盖开关动作

在短时间内连续开关笔记本盖时,logind 会将挂起操作推迟90秒,以检测可能的停靠点。[3] 这个延迟是在 systemd v220 开始可以配置:[4]

/etc/systemd/logind.conf
...
HoldoffTimeoutSec=30s
...

从相应的笔记本 Fn 键挂起不工作

如果不管 logind.conf 中的设置是什么,睡眠按钮都不工作(按下它甚至不会在 syslog 中产生消息),那么 logind 可能不会监视键盘设备。[5] 执行:

# journalctl --grep="Watching system buttons"

你可能会看到这样的内容:

May 25 21:28:19 vmarch.lan systemd-logind[210]: Watching system buttons on /dev/input/event2 (Power Button)
May 25 21:28:19 vmarch.lan systemd-logind[210]: Watching system buttons on /dev/input/event3 (Sleep Button)
May 25 21:28:19 vmarch.lan systemd-logind[210]: Watching system buttons on /dev/input/event4 (Video Bus)

注意到没有键盘设备。现在获取父键盘设备的 ATTRS{name} [6]

# udevadm info -a /dev/input/by-path/*-kbd
...
KERNEL=="event0"
...
ATTRS{name}=="AT Translated Set 2 keyboard"

现在编写一个自定义的 udev 规则来添加“power-switch”标签:

/etc/udev/rules.d/70-power-switch-my.rules
ACTION=="remove", GOTO="power_switch_my_end"
SUBSYSTEM=="input", KERNEL=="event*", ATTRS{name}=="AT Translated Set 2 keyboard", TAG+="power-switch"
LABEL="power_switch_my_end"

重启 systemd-udevd.service,通过以 root 身份运行 udevadm trigger 来重新加载规则,然后重启 systemd-logind.service

现在您应该在 syslog 中看到 Watching system buttons on /dev/input/event0

在 A520I 和 B550I 主板上,电脑无法从睡眠中唤醒

在一些使用 A520i 和 B550i 芯片组的主板,系统将不会完全进入睡眠状态或离开它。症状包括系统进入睡眠和显示器关闭,而主板内部的 LED 或电源 LED 保持开启。随后,系统无法从这种状态返回,需要关闭硬件电源。如果您的 AMD 有类似的问题,首先要确保您的系统是最新的,并检查 AMD 微码包是否安装。

验证以 GPP0 开头的行是否处于启用状态:

$ cat /proc/acpi/wakeup
Device	S-state	  Status   Sysfs node
GP12	  S4	*enabled   pci:0000:00:07.1
GP13	  S4	*enabled   pci:0000:00:08.1
XHC0	  S4	*enabled   pci:0000:0b:00.3
GP30	  S4	*disabled
GP31	  S4	*disabled
PS2K	  S3	*disabled
GPP0	  S4	*enabled   pci:0000:00:01.1
GPP8	  S4	*enabled   pci:0000:00:03.1
PTXH	  S4	*enabled   pci:0000:05:00.0
PT20	  S4	*disabled
PT24	  S4	*disabled
PT26	  S4	*disabled
PT27	  S4	*disabled
PT28	  S4	*enabled   pci:0000:06:08.0
PT29	  S4	*enabled   pci:0000:06:09.0

如果它启用了,可以运行以下命令:

# echo GPP0 > /proc/acpi/wakeup

现在运行 systemctl suspend 以让系统进入睡眠状态来进行测试。然后试着在几秒钟后唤醒系统。如果成功了,你可以将这个解决方法永久化。创建一个 systemd 单元文件

/etc/systemd/system/toggle.ggp0.to.fix.suspend.issue.service
[Unit]
Description="Disable GGP0 to fix suspend issue"

[Service]
ExecStart=/bin/sh -c "/bin/echo GPP0 > /proc/acpi/wakeup"

[Install]
WantedBy=multi-user.target

重新加载启动/启用新创建的单元。

节能

注意: 参见 笔记本电脑#电源管理 了解特定于笔记本电脑的电源管理,如电池监控。另见特定于 CPU 和 GPU 的页面(例如,Ryzen, AMDGPU)。

本节是创建自定义脚本和节能设置(如 udev 规则)的参考资料。确保设置不由其他实用程序管理,以避免冲突。

这里列出的几乎所有特性都值得使用,无论计算机使用交流电还是电池电源。其中大多数对性能的影响可以忽略不计,只是由于通常的硬件/驱动程序故障而在默认情况下没有启用。减少能源使用意味着减少热量,由于动态超频,在现代英特尔或 AMD CPU 上甚至可以获得更高的性能。

支持 Intel HWP (Intel Hardware P-state) 的处理器

本文或本章节可能需要合并到CPU frequency scaling

附注: More context in the main article.(在 Talk:电源管理 中讨论)

支持 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

参见 systemd-tmpfiles(8)tmpfiles.d(5) 手册页获取详细信息。

音频

内核

默认情况下,大多数驱动程序关闭音频节能功能。它可以通过设置 power_save 参数启用;进入闲置模式的时间(以秒为单位)。若要在一秒后闲置声卡,请为 Intel 声卡创建以下文件。

/etc/modprobe.d/audio_powersave.conf
options snd_hda_intel power_save=1

或者,为 ac97 创建以下:

options snd_ac97_codec power_save=1
注意:
  • 要检索制造商和用于声卡的相应内核驱动程序,请运行 lspci -k
  • 切换声卡的电源状态可能会在某些损坏的硬件上产生爆裂声或明显的延迟。

还可以通过禁用 HDMI 音频输出来进一步降低音频功率需求,这可以通过将适当的内核模块加入黑名单来实现(比如在 Inter 硬件的情况下为 snd_hda_codec_hdmi)。

PulseAudio

默认情况下,PulseAudio 会挂起所有闲置时间过长的音频源。当使用外部 USB 话筒时,录音可能从爆裂声开始。作为一种解决方案,在 /etc/pulse/default.pa 中注释掉下面一行:

load-module module-suspend-on-idle

之后,使用 systemctl restart --user pulseaudio 重新启动 PulseAudio。

背光

背光

蓝牙

要完全禁用蓝牙,请将 btusbbluetooth 模块列入黑名单

仅暂时关闭蓝牙,使用 rfkill

# rfkill block bluetooth

或者用 udev 规则:

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

网络摄像头

如果你不使用集成的网络摄像头,将 uvcvideo 模块加入黑名单

内核参数

本节使用 /etc/sysctl.d/ 中的配置,它是“内核 sysctl 参数的插入式目录”。有关更多信息,参见 The New Configuration Files 和更具体的 sysctl.d(5)

禁用 NMI 看门狗

这篇文章的某些内容需要扩充。

原因: This or nowatchdog as can be seen in Improving performance#Watchdogs (在 Talk:电源管理 中讨论)

NMI(不可屏蔽中断)看门狗是一个调试特性,用于捕捉导致内核 panic 的硬件中断。在某些系统上,它会产生大量的中断,导致用电量明显增加:

/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 作为选项。

注意,这个值是作为下面笔记本模式设置的副作用而修改的。另请参阅 Sysctl#虚拟内存了解其他影响 I/O 性能和节能的参数。

笔记本电脑模式

参见笔记本电脑模式“旋钮”的内核文档-“旋钮的合理值为5秒”。

/etc/sysctl.d/laptop.conf
vm.laptop_mode = 5
注意: 此设置主要与自旋磁盘驱动器有关。

网络接口

网络唤醒英语Wake-on-LAN可能是一个有用的功能,但如果你不使用它,那么在挂起时等待魔术包只会消耗额外的电量。您可以调整网络唤醒#udev英语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,它将在启动时被禁用:

# lspci -vv | grep 'ASPM.*abled;'

ASPM 是由 BIOS 处理的,如果禁用 ASPM 则是因为 [7]

  1. BIOS 由于某种原因(存在冲突?)禁用了它。
  2. PCIE 需要 ASPM,但 L0 是可选的(因此 L0 可能被禁用,只启用 L1)。
  3. BIOS 可能没有为此进行编程。
  4. BIOS 有问题。

如果认为计算机支持 ASPM,则可以强制内核使用 pcie_aspm=force 内核参数进行处理。

警告:
  • 强制启用 ASPM 可能会导致冻结/panic,因此,如果该选项不起作用,请确保有方法撤消该选项。
  • 在不支持它的系统上,强制启用 ASPM 甚至会增加功耗。
  • 这会在内核中强制启用 ASPM,而它仍然可以在硬件中保持禁用状态而不工作。要检查是否存在这种情况,请以 root 身份运行 dmesg | grep ASPM。如果是这样,请查阅特定于硬件的 Wiki 文章。

要调整到 powersave 请(除非已启用,否则以下命令将不起作用):

# echo powersave > /sys/module/pcie_aspm/parameters/policy

默认情况下如下所示:

$ cat /sys/module/pcie_aspm/parameters/policy
[default] performance powersave 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
# 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", 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 活动链路电源管理

警告: SATA 活动链路电源管理可能会导致某些设备上的数据丢失。除非经常备份,否则不要启用此设置。

本文内容或本节内容已经过期。

原因: Phrases like "new setting" and "will become a default setting" are outdated. Also should be more formal. See Help:Style#Language register. (在Talk:电源管理讨论)

从 Linux 4.15 开始,出现了一个名为 med_power_with_dipm新设置,它与 Windows IRST 驱动程序设置的行为相匹配,不会导致最近的 SSD/HDD 驱动器的数据丢失。节能效果显著,范围从1.0瓦到1.5瓦(空闲时)。它将成为 Linux 4.16 中基于 Intel 的笔记本电脑的默认设置 [8]

可以从 /sys/class/scsi_host/host*/link_power_management_policy 读取当前设置,如下所示:

$ cat /sys/class/scsi_host/host*/link_power_management_policy
可用的 ALPM 设置
设置 说明 节能
max_performance 当前默认值
medium_power - ~1.0瓦
med_power_with_dipm 推荐设置 ~1.5瓦
min_power 警告:可能丢失数据 ~1.5瓦
/etc/udev/rules.d/hd_power_save.rules
ACTION=="add", SUBSYSTEM=="scsi_host", KERNEL=="host*", ATTR{link_power_management_policy}="med_power_with_dipm"
注意: 这会增加访问闲置驱动器时的延迟,因此这是少数几个值得根据您是否使用交流电源进行切换的设置之一。

硬盘驱动器

有关可以设置的驱动器参数,请参见hdparm#电源管理配置

当有太多程序频繁写入硬盘时,节能效果不佳。跟踪所有程序,获取它们如何以及何时写入硬盘以限制磁盘使用。使用 iotop 查看哪些程序经常使用磁盘。有关其他提示,请参见性能优化#存储设备

诸如设置 noatime 选项之类的小事情也会有所帮助。如果有足够的 RAM 可用,请考虑禁用或限制交换值,因为它可能会限制大量的磁盘写操作。

工具和脚本

本文或本章节的语言、语法或风格需要改进。参考:帮助:风格

原因:Merged from Power saving, needs reorganization to fit into this page.(在Talk:电源管理讨论)

使用脚本和 udev 规则

由于 systemd 用户可以通过 systemctl suspendsystemctl hibernate 来挂起和休眠,并能使用 /etc/systemd/logind.conf 处理 acpi 事件,因此删除 pm-utilsacpid 可能会很具吸引力。只有一件事 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"
注意: 您可以使用 pm-powersave 所用的相同脚本。您只需要将其设置为可执行并放置在其他地方(例如 /usr/local/bin/)。

节能脚本示例:

上述 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

不要忘记使它可执行!

注意: 请注意,AC0 可能与您的笔记本电脑不同,如果是这样,请更改它。

打印电源设置

此脚本打印 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

允许用户关机

本文或本章节的语言、语法或风格需要改进。参考:帮助:风格

原因:Merged from Allow users to shutdown, needs reorganization to fit into this page.(在Talk:电源管理讨论)

按钮和笔记本盖事件

按挂起、关机、休眠按钮以及笔记本盖关闭事件由 logind 处理,请参考 #ACPI events

使用 systemd-logind

如果正在使用 polkit,只要会话未中断,具有非远程会话的用户就可以发出与电源相关的命令。

检查会话是否处于活动状态

$ loginctl show-session $XDG_SESSION_ID --property=Active

然后,用户可以在命令行中使用 systemctl 命令,或者将它们添加到菜单中:

$ systemctl poweroff
$ systemctl reboot

也可以使用 systemctl suspendsystemctl hibernate 等其它命令。请参见 systemctl(1) 中的系统命令章节。

使用 sudo

安装 sudo,并授予用户 sudo 权限。用户就能够使用 sudo systemctl 命令(例如, sudo systemctl poweroff, sudo systemctl reboot, sudo systemctl suspendsudo 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: 标签。

另见