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