電源管理
電源管理這個功能可以在系統組件不工作時切斷其電源或將其切換到低耗電模式。
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:
標籤。