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
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).斷電
另外, 只要內核配置為完全支持休眠(即在內核配置文件中設置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(始終可用),
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.
反過來,只有一種方法可以使系統進入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一樣)。
詳見: 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. 休眠
要使用休眠模式,- 您需要創建交換分區或文件。https://szosoft.blogspot.com/2019/05/linux-swap.html
- 您需要使用resume=kernel參數將內核指向交換,該參數是通過引導加載程序配置的。3.2.2 通過引導程序傳遞必要的內核參數(操作1)
- 您還需要配置initramfs。這告訴內核嘗試從早期用戶空間中的指定交換中恢復。3.3 配置initramfs(操作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'(休眠后恢復測試模式)
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_partitionresume=/dev/sdb12
resume=UUID=08aba37c-1b94-4d14-af39-cd416e0ecf57
https://wiki.archlinux.org/index.php/Kernel_parameters
內核參數,有三種方法可以將選項傳遞給內核,從而控制其行為:
- 構建內核時。有關詳細信息,請參閱內核#編譯。https://wiki.archlinux.org/index.php/Kernel#Compilation
- 啟動內核時(通常,從引導加載程序調用時)。
- 在運行時(通過文件/proc和/sys)。有關詳細信息,請參閱sysctl。https://wiki.archlinux.org/index.php/Sysctl
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#Troubleshooting4.3.1 查看系統按鈕
$ sudo journalctl --grep="Watching system buttons" |wc -l775
$ 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/*-kbdUdevadm 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/wakeupDevice 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