电源管理
电源管理这个功能可以在系统组件不工作时切断其电源或将其切换到低耗电模式。
Arch 中的电源管理包含两个主要部分:
- 配置与硬件交互的内核
- 配置用户空间工具,这些工具与内核交互并对其事件作出反应。许多用户空间工具还允许以“用户友好”的方式修改内核配置。有关选项,参见# 用户空间工具。
用户空间工具[编辑 | 编辑源代码]
使用这些工具可以简化配置,因为它们的工作方式基本类似,所以请勿同时运行多个程序,以避免冲突。更多电源管理选项请参考电源管理分类。 下面是一些比较流行的节能工具:
命令行工具[编辑 | 编辑源代码]
- acpid — 一个支持 netlink 的 ACPI 电源管理事件分发进程。
- Laptop Mode Tools — 配置笔记本电源设置的工具,很多人将其视为省电标准工具,需要的配置比较多。
- libsmbios — 和 Dell SMBIOS tables 交互的库和工具.
- powertop — 检查电源消耗和电源管理的工具,可以协助省电模式的配置。
- systemd — 一个系统和服务管理器。
- TLP — Linux 高级电源管理
图形化界面[编辑 | 编辑源代码]
- 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). 如果系统没有专门的电源管理程序,systemd 可以替换掉原本用来响应这些 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
发送 HUP
信号:
# systemctl kill -s HUP systemd-logind
电源管理器[编辑 | 编辑源代码]
有些桌面环境包含的电源管理器会禁用(临时关闭) 某些或全部 systemd ACPI 设置。这些电源管理器运行时,请在它们的设置中配置 ACPI 事件的动作,只有不被禁用的事件才能在 /etc/systemd/logind.conf
或 /etc/systemd/logind.conf.d/*.conf
中配置。
如果电源管理器没有禁用 systemd 的事件动作,可能出现 systemd 挂起了系统,然后当系统被唤醒之后,电源管理器又再次将系统挂起的情况。KDE, GNOME, Xfce 和 MATE 的电源管理器会执行需要的禁用命令。在使用 acpid 或其它程序处理 ACPI 事件时,响应的 systemd 动作没有被禁用,可以将 Handle
设置为 ignore
. 请参考 systemd-inhibit(1).
xss-lock[编辑 | 编辑源代码]
xss-lock包 订阅 systemd 的 suspend
, hibernate
, lock-session
和 unlock-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 配置为始终执行混合睡眠。
默认的挂起与休眠动作能在 /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.target 和 suspend-then-hibernate.target 中,这样就能在挂起/休眠前后执行某些操作。用户级操作和 root/系统级操作应该使用不同的服务文件。启用 suspend@user
和 resume@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-resume
和 root-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
- 如果设置
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.target 由 suspend.target, hibernate.target 和 hybrid-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 获取关于模板的更多信息。
挂接到 /usr/lib/systemd/system-sleep[编辑 | 编辑源代码]
systemd 会执行 /usr/lib/systemd/system-sleep/
里的所有脚本,并将两个参数传递给它们:
- 参数1:若是准备进入睡眠状态,则为
pre
;唤醒时为post
。 - 参数2:事件名称,
suspend
,hibernate
或hybrid-sleep
。
systemd 会同时执行所有脚本。
自定义脚本的输出会由 systemd-suspend.service, systemd-hibernate.service 或 systemd-hybrid-sleep.service 记录。可以通过 systemd 的 journalctl 查看:
# journalctl -b -u systemd-suspend.service
一个自定义睡眠脚本的示例:
/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
节能[编辑 | 编辑源代码]
本节是创建自定义脚本和节能设置(如 udev 规则)的参考资料。确保设置不由其他实用程序管理,以避免冲突。
这里列出的几乎所有特性都值得使用,无论计算机使用交流电还是电池电源。其中大多数对性能的影响可以忽略不计,只是由于通常的硬件/驱动程序故障而在默认情况下没有启用。减少能源使用意味着减少热量,由于动态超频,在现代英特尔或 AMD CPU 上甚至可以获得更高的性能。
支持 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
参见 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。
背光[编辑 | 编辑源代码]
见背光。
蓝牙[编辑 | 编辑源代码]
要完全禁用蓝牙,请将 btusb
和 bluetooth
模块列入黑名单。
仅暂时关闭蓝牙,使用 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 看门狗[编辑 | 编辑源代码]
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
网络接口[编辑 | 编辑源代码]
网络唤醒可能是一个有用的功能,但如果你不使用它,那么在挂起时等待魔术包只会消耗额外的电量。您可以调整网络唤醒#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]:
- BIOS 由于某种原因(存在冲突?)禁用了它。
- PCIE 需要 ASPM,但 L0 是可选的(因此 L0 可能被禁用,只启用 L1)。
- BIOS 可能没有为此进行编程。
- 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 活动链路电源管理[编辑 | 编辑源代码]
从 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
设置 | 说明 | 节能 |
---|---|---|
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 可用,请考虑禁用或限制交换值,因为它可能会限制大量的磁盘写操作。
工具和脚本[编辑 | 编辑源代码]
使用脚本和 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
不要忘记使它可执行!
打印电源设置[编辑 | 编辑源代码]
此脚本打印 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
允许用户关机[编辑 | 编辑源代码]
按钮和笔记本盖事件[编辑 | 编辑源代码]
按挂起、关机、休眠按钮以及笔记本盖关闭事件由 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:
标签。