电源管理

来自 ArchWiki
(重定向自 Power Saving

电源管理 是一项在系统组件不活动时关闭电源或将其切换到低功耗状态的功能。

在 Arch Linux 中,电源管理由两个主要部分组成

  1. Linux 内核的配置,内核与硬件交互
  2. 用户空间工具的配置,用户空间工具与内核交互并对其事件做出反应。许多用户空间工具还允许以“用户友好”的方式修改内核配置。请参阅 #用户空间工具 了解选项。

用户空间工具

这些工具允许您更改许多设置,而无需手动编辑配置文件。运行这些工具中的一个,以避免可能发生的冲突,因为它们的工作方式或多或少相似。查看电源管理类别,以大致了解 Arch Linux 中存在的电源管理选项。

以下是更流行的旨在帮助节电的脚本和工具

控制台

  • acpid — 一个用于传递 ACPI 电源管理事件并支持 netlink 的守护进程。
https://sourceforge.net/projects/acpid2/ || acpid
  • Laptop Mode Tools — 用于配置笔记本电脑节电设置的实用程序,被许多人认为是事实上的节电实用程序,尽管可能需要一些配置。
https://github.com/rickysarraf/laptop-mode-tools || laptop-mode-toolsAUR
  • libsmbios — 用于与 Dell SMBIOS 表交互的库和工具。
https://github.com/dell/libsmbios || libsmbios
  • powertop — 一种诊断电源消耗和电源管理问题的工具,以帮助设置节电设置。
https://github.com/fenrus75/powertop || powertop
  • powerstat — 一种使用 ACPI 或 Intel RAPL 接口测量功耗的工具。
https://github.com/ColinIanKing/powerstat || powerstatAUR
  • systemd — 系统和服务管理器。
https://systemd.io/ || systemd
  • TLP — 适用于 Linux 的高级电源管理。
https://linrunner.de/tlp || tlp
  • TuneD — 执行系统中设备监控和自适应配置的守护进程
https://tuned-project.org || tuned
  • UPower — 用于枚举电源设备、监听设备事件以及查询历史记录和统计信息的抽象层。
https://upower.freedesktop.org || upower
https://gitlab.freedesktop.org/upower/power-profiles-daemon || power-profiles-daemon

图形界面

  • batsignal — 轻量级电池监视器,使用 libnotify 警告低电量。
https://github.com/electrickite/batsignal || batsignal
  • 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)。在没有专用电源管理器的系统上,这可以替代通常用于响应这些 ACPI 事件的 acpid 守护进程。

每个事件的指定操作可以是 ignorepoweroffreboothaltsuspendhibernatehybrid-sleepsuspend-then-hibernatelockkexec 之一。对于休眠和挂起,它们必须正确设置。如果未配置事件,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 挂起系统,然后在系统唤醒后,另一个电源管理器再次挂起系统的情况。GNOMEMATEPlasmaXfce 的电源管理器会发出必要的 inhibited 命令。如果未发出 inhibited 命令,例如在使用 acpid 或其他程序来处理 ACPI 事件时,请将 Handle 选项设置为 ignore。另请参阅 systemd-inhibit(1)

xss-lock

xss-lock 订阅 systemd 事件 suspendhibernatelock-sessionunlock-session,并执行相应的操作(运行锁屏程序并等待用户解锁或杀死锁屏程序)。xss-lock 还会对 DPMS 事件做出反应,并根据响应运行或杀死锁屏程序。

例如,自动启动 以下内容

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

节电

注意: 有关笔记本电脑特定的电源管理(例如电池监控),请参阅 Laptop#电源管理。另请参阅特定于您的 CPU 和 GPU 的页面(例如,RyzenAMDGPU)。

本节是创建自定义脚本和节电设置(例如通过 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 状态的处理器

本文或章节可能需要与CPU 频率调节合并。

注意: 更多上下文请参见主文章。(在Talk:Power management中讨论)

支持 Intel 硬件 P 状态 (HWP) 的处理器的可用能源偏好设置为 defaultperformancebalance_performancebalance_powerpower

可以通过运行以下命令进行验证

$ 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)。

背光

请参阅 Backlight

蓝牙

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

或者,创建以下 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 监视器

本文或章节需要扩充。

原因: 提供关于多少中断才算大量中断的指导。(在Talk:Power management中讨论)

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'

请记住,这些节电选项是实验性的,可能会导致系统不稳定。

总线电源管理

主动状态电源管理

来自 Wikipedia

主动状态电源管理 (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]

  1. BIOS 确定需要这样做。
  2. PCIE 需要 ASPM,但 L0s 是可选的,因此您可能禁用了 L0s 而仅启用了 L1。
  3. 您的 BIOS 有错误。
  4. 您没有 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"

默认的自动挂起空闲延迟时间由内置 内核模块 usbcoreautosuspend 参数控制。要将延迟设置为 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
可用的 ALPM 设置
设置 描述 节电
max_performance 当前默认值
medium_power - ~1.0 瓦
med_power_with_dipm 推荐设置1 ~1.5 瓦
min_power 警告:可能的数据丢失2 ~1.5 瓦
  1. 自 Linux 4.15 以来,有一个名为 med_power_with_dipm设置,它与 Windows IRST 驱动程序设置的行为相匹配,并且不应导致最新的 SSD 或 HDD 数据丢失。节电效果可能非常显着,从 1.0 瓦到 1.5 瓦(空闲时)不等。它已成为 Linux 4.16 中基于 Intel 的笔记本电脑的默认设置 [5]
  2. 警告: 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 技术的希捷硬盘,通过 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

第一列中的零确认已成功禁用磁头停靠和磁盘休眠

工具和脚本

此文章或章节需要语言、wiki 语法或风格改进。请参阅 Help:Style 以供参考。

原因:Power saving 合并而来,需要重新组织以适应此页面。(在 Talk:Power management 中讨论)

使用脚本和 udev 规则

此文章或章节是与 Laptop#电源管理 合并的候选对象。

注意: 可能是更适合笔记本电脑特定页面的内容。(在 Talk:Power management 中讨论)

由于 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 可能不同,如果情况如此,请更改它。

允许用户关机

此文章或章节需要语言、wiki 语法或风格改进。请参阅 Help:Style 以供参考。

原因:Allow users to shutdown 合并而来,需要重新组织以适应此页面。(在 Talk:Power management 中讨论)

按钮和盖子事件

挂起、断电和休眠按钮按下以及盖子关闭事件由 logind 处理,如 #ACPI 事件 中所述。

使用 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 poweroffsudo systemctl rebootsudo 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: 标记。

另请参阅