Linux-Power-management


1. 低級接口
1.1 內核(swsusp)軟件掛起
1.1.1 睡眠狀態的2個控制文件
1.1.2 查看當前系統的睡眠控制文件內容
1.1.3 狀態表(表1)
1.1.4 狀態的使用
1.2 uswsusp用戶空間軟件掛起 
2. 高級接口
2.1 systemd 
3. 休眠
3.1 關於交換分區/文件大小
3.1.1 disk文件控制休眠的操作模式
3.1.2 image_size文件限制休眠鏡像大小
3.1.3 pm_trace控制PM跟蹤機制
3.2 必需的內核參數
3.2.1 Arch Linux中最常用的內核參數列表(表2)
3.2.2 通過引導程序傳遞必要的內核參數(操作1)
3.3 配置initramfs(操作2)
4. ARCH電源管理相關連接
4.1 用戶空間工具
4.2 使用systemd進行電源管理
4.2.1 ACPI活動(表3)
4.2.2 暫停和休眠命令
4.2.3 配置默認掛起
4.3 查看更多信息
4.3.1 查看系統按鈕
4.3.2 獲取父鍵盤設備的ATTRS{name}
4.3.3 systemd的單元文件完整列表
4.3.4 從暫停中立即喚醒的配置
5. 省電參考連接

導讀:如果要快速配置,只需要參考( 3.2.2 通過引導程序傳遞必要的內核參數(操作1)3.3 配置initramfs(操作2))這2小節內容即可,其他多為理論筆記及相關輔助參考信息或相關連接等。
https://www.cnblogs.com/sztom/p/10612593.html

Arch電源管理/暫停和休眠
https://wiki.archlinux.org/index.php/Power_management/Suspend_and_hibernate

1. 低級接口

雖然這些接口可以直接使用,但建議使用一些高級接口來掛起/休眠。
直接使用低級接口比使用任何高級接口要快得多,因為運行所有掛起前和掛接后掛鈎需要時間,但掛鈎可以正確設置硬件時鍾,恢復無線等。

1.1 內核(swsusp)軟件掛起

最直接的方法是直接通知內核軟件掛起代碼(swsusp)進入掛起狀態; 確切的方法和狀態取決於硬件支持的級別。
在現代內核上,編寫適當的字符串/sys/power/state是觸發此掛起的主要機制。
內核文檔:  https://www.kernel.org/doc/Documentation/power/states.txt
(C)2014年英特爾公司,Rafael J. Wysocki <rafael.j.wysocki@intel.com>
內核文檔-系統電源管理睡眠狀態,內容摘錄如下:

1.1.1 睡眠狀態的2個控制文件

/sys/power/state 文件的字符串表示狀態.內核通常支持最多四個系統(睡眠狀態):
  •  mem 睡眠模式,由/sys/power/mem_sleep文件控制.
  •  standby Power-On Suspend(如果支持),
  •  freeze Suspend-To-Idle(始終可用),
  •  disk Hibernation(Suspend-To-Disk).斷電
系統始終支持Suspend-to-Idle.
另外, 只要內核配置為完全支持休眠(即在內核配置文件中設置CONFIG_HIBERNATION),也始終支持Suspend-to-Disk.
至於: Suspend-to-RAM和Power-On Suspend取決於平台的功能.

/sys/power/mem_sleep 文件控制"mem"字符串的含義.它包含表示系統掛起的可用模式的字符串,可以通過將"mem"寫入/sys/power/state來觸發.(睡眠模式)如下:
  •  deep Suspend-To-RAM.
  •  shallow Power-On Suspend(如果支持),
  •  s2idle Suspend-To-Idle(始終可用),
(如果不支持,則表示它們的字符串不在/sys/power/mem_sleep中)

1.1.2 查看當前系統的睡眠控制文件內容

HW: HP6520s筆記本
$ uname -r
5.1.15-arch1-1-ARCH
$ sudo cat /sys/power/state
freeze mem disk
$ sudo cat /sys/power/mem_sleep
s2idle [deep]

1.1.3 狀態表(表1)

狀態 掛起到空閑 待機/開機暫停 掛起到內存 掛起到硬盤
State Suspend-To-Idle Power-On Suspend Suspend-to-RAM Suspend-to-disk
ACPI State S0 S1 S3 S4
state 方法1
/sys/power/state
freeze standby mem disk
Label 方法2+state=mem
/sys/power/mem_sleep
s2idle shallow deep disk
是否支持 始終支持 取決與平台 通常都支持 始終支持
省電 通用,純軟件輕量級 暫停所有低級系統功能 僅內存通電 斷電
備注 凍結用戶空間;
所有I/O設備置於低功耗;
凍結用戶空間;
所有I/O設備置於低功耗;
非引導CPU將脫機;
RAM
suspend 掛起
swsusp 交換掛起
hibernate 休眠

1.1.4 狀態的使用

有兩種方法可以使系統進入Suspend-To-Idle睡眠狀態.
  • 第一個是直接將"freeze"寫入/sys/power/state.
  • 第二個是將"s2idle"寫入/sys/power/mem_sleep,然后將"mem"寫入/sys/power/state.
類似地,有兩種方法可以使系統進入Power-On Suspend睡眠狀態(在這種情況下寫入控制文件的字符串分別為"standby"或"shallow"和"mem")如果該狀態由平台支持.
反過來,只有一種方法可以使系統進入Suspend-To-RAM狀態(將"deep"寫入/sys/power/mem_sleep,將"mem"寫入/sys/power/state).

默認的掛起模式(即沒有將任何內容寫入/sys/power/mem_sleep的情況下使用的模式)要么是"deep"(如果支持Suspend-To-RAM),要么是"s2idle",但它可以被覆蓋內核命令行中"mem_sleep_default"參數的值.

1.2 uswsusp用戶空間軟件掛起

uswsusp(Userspace Software Suspend)是內核的suspend-to-RAM機制的包裝器,它在掛起之前和恢復之后從用戶空間執行一些圖形適配器操作。
用於Linux系統上的休眠(掛起到磁盤)和掛起(掛起到RAM或待機)。它包括:
  •   s2ram - 內核掛起到RAM機制的包裝器,允許用戶在掛起之前和恢復之后從用戶域執行一些圖形適配器操作,這可能有助於在恢復之后恢復圖形(和整個系統)的生命。
  •   s2disk - 用戶空間軟件掛起的參考實現(μswsusp); 它協調暫停系統所需的步驟(例如凍結進程,准備交換空間等)並處理圖像寫入和讀取。
  •   s2both - 結合了s2ram和s2disk的功能,當電池幾乎耗盡時它非常有用。s2both將系統快照寫入交換(就像s2disk),但隨后將機器放入STR(就像s2ram一樣)。
uswsusp在AUR中以uswsusp-git AUR的名稱提供。
詳見:  https://wiki.archlinux.org/index.php/Uswsusp

2. 高級接口

這些包的最終目標是提供可以調用以執行suspend/hibernate的二進制文件/腳本。實際上將它們連接到電源按鈕或菜單點擊或筆記本電腦蓋事件通常留給其他工具。
要在某些電源事件(例如筆記本電腦蓋關閉或電池耗盡百分比)上自動暫停/休眠,您可能需要查看運行Acpid。

2.1 systemd

systemd提供了用於掛起,休眠和混合掛起的本機命令,有關詳細信息,請參閱電源管理#eight management with systemd。這是Arch Linux中使用的默認界面。
有關配置suspend/hibernate掛鈎的其他信息,請參閱電源管理#睡眠掛鈎。另請參閱systemctl(1),systemd-sleep(8)和systemd.special(7)。

3. 休眠

要使用休眠模式,
下面詳細描述后面2個步驟。

3.1 關於交換分區/文件大小

即使您的交換分區小於RAM,您仍然很有可能成功休眠。根據內核文檔:
https://www.kernel.org/doc/Documentation/power/interface.txt
版權所有(c)2016英特爾公司,Rafael J. Wysocki <rafael.j.wysocki@intel.com>
無論底層系統架構或平台如何,電源管理子系統都為用戶空間提供統一的sysfs接口,以實現系統睡眠.
該接口位於/sys/power/目錄中(假設sysfs安裝在/sys).

3.1.1 disk文件控制休眠的操作模式

/sys/power/disk控制休眠的操作模式(Suspend-to-Disk).
具體來說,它告訴內核在創建休眠圖像后要做什么.
$ cat /sys/power/disk
[platform] shutdown reboot suspend test_resume
從中讀取返回支持的選項列表,編碼為:當前選擇的選項打印在方括號中.
  • '[platform]'(使用平台提供的方法將系統置於睡眠狀態),僅在平台提供特殊機制以在創建休眠圖像后使系統進入休眠狀態時才可用(例如,ACPI會執行此操作).
  • 'shutdown'(關閉系統)
  • 'reboot'(重啟系統)
  • 'suspend'(觸發掛起到RAM轉換),如果支持Suspend-to-RAM,則可以使用'suspend'選項.
  • 'test_resume'(休眠后恢復測試模式)
要選擇一個選項,請將表示它的字符串寫入/sys/power/disk.

3.1.2 image_size文件限制休眠鏡像大小

/sys/power/image_size控制休眠圖像的大小.
將用作圖像大小的上限(以字節為單位).默認情況下設置為可用RAM的2/5左右.
休眠核心將盡力確保圖像大小不會超過該數量.但是,如果事實證明無法實現,則仍將創建休眠圖像,並且其大小將盡可能小.
$ cat /sys/power/image_size
3334959104
換算后月3.1Gb, RAM(8Gb)的2/5.

3.1.3 pm_trace控制PM跟蹤機制

/sys/power/pm_trace控制PM跟蹤機制,在重新啟動時保存RTC中的最后一個暫停或恢復事件點.
它有助於調試硬鎖定或重新啟動,因為系統掛起或恢復期間(更常見)更有效地發生設備驅動程序故障.

如果/sys/power/pm_trace包含'1',則每個掛起/恢復事件點的指紋將被存儲在RTC存儲器中(覆蓋實際的RTC信息),因此如果發生在系統崩潰之后它將繼續存在存儲它,以后可以用它來識別導致崩潰的驅動程序(有關更多信息,請參閱Documentation/power/s2ram.txt).

最初它包含'0',通過將表示非零整數的字符串寫入其中,可以將其更改為'1'.

3.2 必需的內核參數

必須使用內核參數。內核分配給分區的名稱或其UUID可用作。例如: resume=swap_partition
resume=/dev/sdb12
resume=UUID=08aba37c-1b94-4d14-af39-cd416e0ecf57

https://wiki.archlinux.org/index.php/Kernel_parameters
內核參數,有三種方法可以將選項傳遞給內核,從而控制其行為:
本頁會用到第二種方法。參數要么格式parameter或parameter=value。且所有內核參數都區分大小寫。

3.2.1 Arch Linux中最常用的內核參數列表(表2)

parameter Description 描述
root= Root filesystem. See init/do_mounts.c for supported device name formats. 根文件系統. 有關支持的設備名稱格式,請參閱init/do_mounts.c.
rootflags= Root filesystem mount options. 根文件系統掛載選項.
ro Mount root device read-only on boot (default1). 在啟動時將根設備掛載為只讀(default1).
rw Mount root device read-write on boot. 在啟動時掛載根設備讀寫.
initrd= Specify the location of the initial ramdisk. 指定初始ramdisk的位置.
init= Run specified binary instead of/sbin/init as init process. The systemd-sysvcompat package symlinks/sbin/init to/usr/lib/systemd/systemd to use systemd. 運行指定的二進制文件而不是/sbin/init作為init進程. systemd-sysvcompat包symlinks/sbin/init到/usr/lib/systemd/systemd使用systemd.
init=/bin/sh Boot to shell. 引導到shell.
systemd.unit= Boot to a specified target. 引導到指定目標.
resume= Specify a swap device to use when waking from hibernation. 指定從休眠狀態喚醒時要使用的交換設備.
nomodeset Disable Kernel mode setting. 禁用內核模式設置.
zswap.enabled Enable Zswap. 啟用Zswap.
panic= Time before automatic reboot on kernel panic. 在內核崩潰上自動重啟之前的時間.
debug Enable kernel debugging (events log level). 啟用內核調試(事件日志級別).
mem= Force usage of a specific amount of memory to be used. 強制使用特定數量的內存.
maxcpus= Maximum number of processors that an SMP kernel will bring up during bootup. 啟動期間SMP內核將提供的最大處理器數.
selinux= Disable or enable SELinux at boot time. 在引導時禁用或啟用SELinux.
netdev= Network devices parameters. 網絡設備參數.
video= Override framebuffer video defaults. 覆蓋幀緩沖視頻默認值.
quiet [KNL] Disable most log messages 禁用大多數日志消息
splash    

有關所有選項的完整列表,請參閱內核文檔
https://www.kernel.org/doc/Documentation/admin-guide/kernel-parameters.txt

內核參數列表,進一步說明並按類似選項分組
http://files.kroah.com/lkn/lkn_pdf/ch09.pdf

3.2.2 通過引導程序傳遞必要的內核參數(操作1)

查看當前系統的更改。
$ cat /proc/cmdline
BOOT_IMAGE=/boot/vmlinuz-linux root=UUID=77727c05-e82e-426f-b1b2-9062be75ad62 rw quiet resume=/dev/sdb12

編輯/etc/default/grub文件,在GRUB_CMDLINE_LINUX_DEFAULT中添加resume=/dev/sdb12或UUID(注: 雙硬盤要用UUID)
原本是: GRUB_CMDLINE_LINUX_DEFAULT="quiet"
添加后: GRUB_CMDLINE_LINUX_DEFAULT="quiet resume=UUID=08aba37c-1b94-4d14-af39-cd416e0ecf57"
$ sudo grub-mkconfig -o /boot/grub/grub.cfg
Generating grub configuration file ...
Found theme: /boot/grub/themes/breeze/theme.txt
Found linux image: /boot/vmlinuz-linux
Found initrd image: /boot/intel-ucode.img /boot/initramfs-linux.img
Found fallback initrd image(s) in /boot: initramfs-linux-fallback.img
Found Windows Server 2008 R2 on /dev/sda1
done

3.3 配置initramfs(操作2)

添加resume鈎子  編輯 /etc/mkinitcpio.conf ,在HOOKS行中添加resume鈎子:
若原本是: HOOKS="base udev autodetect modconf block filesystems keyboard fsck"
則添加后: HOOKS="base udev autodetect modconf block filesystems keyboard resume fsck"
請記住重新生成initramfs以使這些更改生效。
$ sudo mkinitcpio -p linux

4. ARCH電源管理相關連接

https://wiki.archlinux.org/index.php/Power_management
電源管理功能可關閉電源或在非活動狀態下將系統組件切換到低功耗狀態。
在Arch Linux中,電源管理包含兩個主要部分:
配置Linux內核,與硬件交互。
內核參數  https://wiki.archlinux.org/index.php/Kernel_parameters
內核模塊  https://wiki.archlinux.org/index.php/Kernel_modules
udev規則  https://wiki.archlinux.org/index.php/Udev
配置用戶空間工具,與內核交互並對其事件做出反應。許多用戶空間工具還允許以“用戶友好”的方式修改內核配置。有關選項,請參閱#Userspace工具。

4.1 用戶空間工具

https://wiki.archlinux.org/index.php/Power_management#Userspace_tools
有很多高級工具可以參考使用,對於筆記本電池用戶,可以適當延長續航時間。

4.2 使用systemd進行電源管理

4.2.1 ACPI活動(表3)

Event handler Default action Description 描述
HandlePowerKey poweroff Triggered when the power key/button is pressed. 按下電源鍵/按鈕時觸發。關機
HandleSuspendKey suspend Triggered when the suspend key/button is pressed. 按下暫停鍵/按鈕時觸發。掛起ram
HandleHibernateKey hibernate Triggered when the hibernate key/button is pressed. 按下休眠鍵/按鈕時觸發。休眠disk
HandleLidSwitch suspend Triggered when the lid is closed, except in the cases below. 蓋子關閉時觸發,下面的情況除外。
HandleLidSwitchDocked ignore Triggered when the lid is closed if the system is inserted in a docking station, or more than one display is connected. 如果系統插入擴展塢,或者連接了多個顯示器,則在蓋子關閉時觸發。
HandleLidSwitchExternalPower action set for 
HandleLidSwitch
Triggered when the lid is closed if the system is connected to external power. 如果系統連接到外部電源,則在蓋子關閉時觸發。


4.2.2 暫停和休眠命令

$ systemctl reboot  關閉並重啟系統
$ systemctl poweroff  關閉並關閉系統電源
$ systemctl suspend  暫停系統(掛起到RAM),需要通電,維持RAM功能.(通常開箱即用)
$ systemctl hibernate  將系統置於休眠狀態(休眠到Disk),可斷電。(需要交換分區或文件及必要設定)
$ systemctl hybrid-sleep  將系統置於混合睡眠狀態(系統掛起到RAM和Disk),可斷電。

4.2.3 配置默認掛起

可以在文件中配置默認掛起和休眠操作/etc/systemd/sleep.conf。要將兩個操作都設置為混合睡眠:
/etc/systemd/sleep.conf
[Sleep]
# suspend=hybrid-sleep
SuspendMode=suspend
SuspendState=disk
# hibernate=hybrid-sleep
HibernateMode=suspend
HibernateState=disk

睡眠hooks
https://wiki.archlinux.org/index.php/Power_management#Sleep_hooks

4.3 查看更多信息

https://wiki.archlinux.org/index.php/Power_management#Troubleshooting

4.3.1 查看系統按鈕

sudo journalctl --grep="Watching system buttons" |wc -l
775
$ sudo journalctl |grep "Watching system buttons" |wc -l
495
Mar 23 10:22:56 tompc systemd-logind[349]: Watching system buttons on /dev/input/event2 (Power Button)
Mar 23 10:22:56 tompc systemd-logind[349]: Watching system buttons on /dev/input/event1 (Lid Switch)
Mar 23 10:22:56 tompc systemd-logind[349]: Watching system buttons on /dev/input/event0 (Sleep Button)
Mar 23 10:22:56 tompc systemd-logind[349]: Watching system buttons on /dev/input/event3 (AT Translated Set 2 keyboard)
Mar 23 10:22:56 tompc systemd-logind[349]: Watching system buttons on /dev/input/event6 (HP WMI hotkeys)
-- Reboot --

4.3.2 獲取父鍵盤設備的ATTRS{name}

$ sudo udevadm info -a /dev/input/by-path/*-kbd
Udevadm info starts with the device specified by the devpath and then walks up the chain of parent devices.
It prints for every device found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device and the attributes from one single parent device.

  looking at device '/devices/platform/i8042/serio0/input/input3/event3':
    KERNEL=="event3"
    SUBSYSTEM=="input"
    DRIVER==""

  looking at parent device '/devices/platform/i8042/serio0/input/input3':
    KERNELS=="input3"
    SUBSYSTEMS=="input"
    DRIVERS==""
    ATTRS{uniq}==""
    ATTRS{phys}=="isa0060/serio0/input0"
    ATTRS{properties}=="0"
    ATTRS{name}=="AT Translated Set 2 keyboard"

  looking at parent device '/devices/platform/i8042/serio0':
    KERNELS=="serio0"
    SUBSYSTEMS=="serio"
    DRIVERS=="atkbd"
    ATTRS{force_release}=="369-370"
    ATTRS{extra}=="0"
    ATTRS{softraw}=="1"
    ATTRS{bind_mode}=="auto"
    ATTRS{err_count}=="0"
    ATTRS{description}=="i8042 KBD port"
    ATTRS{set}=="2"
    ATTRS{scroll}=="0"
    ATTRS{firmware_id}=="PNP: PNP0303"
    ATTRS{softrepeat}=="0"

  looking at parent device '/devices/platform/i8042':
    KERNELS=="i8042"
    SUBSYSTEMS=="platform"
    DRIVERS=="i8042"
    ATTRS{driver_override}=="(null)"

  looking at parent device '/devices/platform':
    KERNELS=="platform"
    SUBSYSTEMS==""
    DRIVERS==""

4.3.3 systemd的單元文件完整列表

systemd的單元文件的語法受XDG桌面條目規范.desktop文件的啟發,這些文件又受Microsoft Windows .ini文件的啟發。單元文件從多個位置加載,查看完整列表:
$ systemctl show --property=UnitPath //主要文件是后面2個(從最低到最高列出)
UnitPath=
/etc/systemd/system.control
/run/systemd/system.control
/run/systemd/transient
/run/systemd/system
/run/systemd/generator
/usr/lib/systemd/system //已安裝包提供的單位
/etc/systemd/system //由系統管理員安裝的單元

4.3.4 從暫停中立即喚醒的配置

$ cat /proc/acpi/wakeup
Device S-state   Status   Sysfs node
C0B1   S5 *disabled  pci:0000:00:1e.0 //82801 Mobile PCI Bridge
C109   S3 *enabled   pci:0000:00:1d.0 //usb4/4-2
C110   S3 *enabled   pci:0000:00:1d.1 //usb5
C111   S3 *enabled   pci:0000:00:1d.2 //usb6
C112   S3 *enabled   pci:0000:00:1d.7 //usb2
C11A   S3 *enabled   pci:0000:00:1a.0 //usb3
C11C   S3 *enabled   pci:0000:00:1a.7 //usb1
C132   S5 *disabled  pci:0000:00:1c.1 //10:00.0
C2A1   S5 *disabled  pci:0000:10:00.0 //wlp16s0
C135   S5 *disabled  pci:0000:00:1c.4 //pcie010 PCI Express Port 5
C2A2   S5 *disabled
C138   S0 *enabled   pci:0000:00:19.0 //enp0s25
C23D   S5 *disabled  platform:PNP0C32:00

5. 省電參考連接

https://wiki.archlinux.org/index.php/Power_management#Power_saving

注意:請參閱筆記本電腦#電源管理,了解筆記本電腦特有的電源管理,例如電池監控。
https://wiki.archlinux.org/index.php/Laptop#Power_management

如何在Linux上獲得更長的電池壽命
http://ivanvojtko.blogspot.sk/2016/04/how-to-get-longer-battery-life-on-linux.html

省電#Kernel參數
https://wiki.archlinux.org/index.php/Power_saving#Kernel_parameters
https://wiki.archlinux.org/index.php/Power_management#Kernel_parameters


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM