電源管理

出自 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 可用,請考慮禁用或限制交換值,因為它可能會限制大量的磁盤寫操作。

工具和腳本[編輯 | 編輯原始碼]

本文或本章節的語言、語法或風格需要改進。參考:Help:Style

原因: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

允許用户關機[編輯 | 編輯原始碼]

本文或本章節的語言、語法或風格需要改進。參考:Help:Style

原因: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: 標籤。

另見[編輯 | 編輯原始碼]