電源管理這個功能可以在系統組件不工作時切斷其電源或將其切換到低耗電模式。
Arch 中的電源管理包含兩個主要部分:
用戶空間工具
這些工具允許你更改許多設置,而無需手動編輯配置文件。請勿同時運行多個程序,以避免衝突,因為它們的工作方式基本類似。更多電源管理選項請參考電源管理分類。
下面是一些比較流行的節能工具:
命令行工具
- acpid — 一個支持 netlink 的 ACPI 電源管理事件分發進程。
- Laptop Mode Tools — 配置筆記本電源設置的工具,很多人將其視為省電標準工具,需要的配置比較多。
- libsmbios — 和 Dell SMBIOS tables 交互的庫和工具.
- 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 設置的操作
|
要應用更改,請 reload 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 的電源管理器會發出必要的 inhibited 命令。如果沒有發出 inhibited 命令,例如在使用 acpid 或其他工具處理 ACPI 事件時,請將 Handle
選項設置為 ignore
。另見 systemd-inhibit(1)。
xss-lock
xss-lock包 訂閱 systemd 事件 suspend
、hibernate
、lock-session
和 unlock-session
,並執行適當的操作(運行鎖屏程序並等待用戶解鎖或終止鎖屏程序)。xss-lock 還會響應 DPMS 事件,並根據需要運行或終止鎖屏程序。
例如,Autostart 以下內容:
$ xss-lock -- i3lock -n -i background_image.png &
節能
本節是創建自定義腳本和節能設置(如 udev 規則)的參考資料。確保設置不由其他實用程序管理,以避免衝突。
這裡列出的幾乎所有特性都值得使用,無論計算機使用交流電還是電池電源。其中大多數對性能的影響可以忽略不計,只是由於通常的硬體/驅動程序故障而在默認情況下沒有啟用。減少能源使用意味著減少熱量,由於動態超頻,在現代英特爾或 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" "內核模塊" 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 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
參見 x86_energy_perf_policy(8) 手冊頁獲取關於 Intel 處理器能源性能策略的更多信息。另見 systemd-tmpfiles(8) 和 tmpfiles.d(5) 手冊頁獲取臨時文件/目錄的詳細信息。
音頻
默認情況下,音頻節能功能是否開啟取決於驅動程序,例如 HD Audio 默認開啟。識別正在使用的模塊,然後運行
$ modinfo --field=parm 模块名称 | column --separator=':' --table --table-columns-limit=2
並查找調整或禁用節能功能的內核模塊參數(如 power_save
)。
背光
見背光。
藍牙
要完全禁用藍牙,請將 btusb
和 bluetooth
模塊列入黑名單。
或者,創建以下 udev 規則:
/etc/udev/rules.d/50-bluetooth.rules
# 禁用藍牙 SUBSYSTEM=="rfkill", ATTR{type}=="bluetooth", ATTR{state}="0"
要僅暫時關閉藍牙,使用 rfkill(8):
# rfkill block bluetooth
網絡攝像頭
如果你不使用集成的網絡攝像頭,將 uvcvideo
模塊加入黑名單。
內核參數
本節使用 /etc/sysctl.d/
中的配置,它是「內核 sysctl 參數的插入式目錄」。有關更多信息,參見 The New Configuration Files 和更具體的 sysctl.d(5)。
禁用 NMI 看門狗
NMI(不可屏蔽中斷)看門狗是一個調試特性,用於捕捉導致內核 panic 的硬體中斷。在某些系統上,它會產生大量的中斷,導致用電量明顯增加。要列出自上次啟動以來每個 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
網絡接口
網絡喚醒可能是一個有用的功能,但如果你不使用它,那麼在掛起時等待魔術包只會消耗額外的電量。您可以調整網絡喚醒#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 可能會導致功耗增加。此外,它可能會導致系統凍結或內核 panic,因此請確保如果該選項不合適,您有辦法撤消它。
- 強制啟用 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" SUBSYSTEM=="ata_port", KERNEL=="ata*", ATTR{device/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", ATTR{product}!="*Mouse", ATTR{product}!="*Keyboard", 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 活動鏈路電源管理
當前設置可以從 /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]。在 Linux 6.11 中,它成為默認設置 [6]。 - 警告:
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 光碟驅動器一起使用時,會產生令人討厭的效果,即每隔幾分鐘就會重新初始化光碟驅動器。
- 在這種情況下,使用
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
Zeroes in the first column confirm that parking and spindown were disabled successfully
工具和腳本
使用腳本和 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 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:
標籤。