笔记本节省电量的方式有多种,这里记录两种,一种是睡眠(sleep,suspend),一种是休眠(hibernate),下面根据 Arch Wiki 简单的介绍并且记录配置。

Sleep

睡眠是 ACPI 定义的 S3 级别模式,是将除了内存的其他电源切断,从而节省电量。 查看目前电脑的睡眠支持方式:

cat /sys/power/mem_sleep
s2idle [deep]

如果方框扩在 s2idle,说明目前是用的这种方式,可以临时修改,也可以内核参数中配置使其永久生效:

临时:
# echo "deep" > /sys/power/mem_sleep

内核的话需要配置内核参数:
mem_sleep_default=deep

内核参数可以在多个地方配置,我这里配置在 EFISTUB 中:

Boot0001* Arch Linux  HD(1,GPT,10cecff1-4177-4032-93c4-5b87eef34f61,0x800,0x80000)/File(\vmlinuz-linux)root=UUID=4d7faacf-3aee-457f-93f9-38e7ecb838a5 rootflags=compress=zstd:3,ssd,space_cache=v2,subvol=@ resume=UUID=1ad49622-c59f-49ae-8539-c625e5b2c142 rw mem_sleep_default=deep initrd=\intel-ucode.img initrd=\initramfs-linux.img

使用命令 sudo systemctl suspend 来测试是否正常睡眠。

Hibernate

休眠是将机器状态保存到 swap 分区,并完全关闭机器,这是 S4 级别的休眠模式,这种方式的耗电量为零。但是启动需要一定的时间,和开机时间差不多。 首先需要一个 swap 分区,然后配置 initramfs:

/etc/mkinitcpio.conf
HOOKS=(base udev autodetect modconf kms keyboard keymap consolefont block filesystems resume fsck)

将 resume hook 配置在 udev 之后。配置完以后重现生成 initramfs:

# mkinitcpio -P

关于 initramfs:

initramfs(Initial RAM File System)是一个小型的根文件系统,用于在 Linux 启动时加载到内存中。它主要用于引导过程中,作为根文件系统的临时替代品,以便在系统初始化和加载真正的根文件系统之前执行一些必要的操作。

关于 UEFI 的初始化流程:

系统初始化流程:

  1. 加电自检后,UEFI 初始化引导所需的硬件(硬盘、键盘控制器等等)。
  2. 固件读取 NVRAM 中的启动项,以确定启动哪个 EFI 应用程序以及从哪里启动(例如从哪个磁盘和分区启动)。
    • 启动项可能只是一个磁盘。在这种情况下,固件会在该磁盘上查找 EFI 系统分区,并尝试在备用启动路径 \EFI\BOOT\BOOTx64.EFI 中查找 EFI 应用程序。
  3. 固件启动 EFI 应用程序。
    • 这可能是使用 boot loader 或 Arch 内核本身使用的 EFISTUB 。
    • 也有可能是其他 EFI 应用程序,如 UEFI shell 或者类似 systemd-boot 和 rEFInd 这样的 boot manager。

接着同样需要一个内核参数:

resume=UUID=1ad49622-c59f-49ae-8539-c625e5b2c142

最后可以将电源按钮功能更改为 hinernate,(如果默认是关机的话)

编辑 /etc/systemd/logind.conf
HandlePowerKey=hibernate

保存并且立即生效
# systemctl kill -s HUP systemd-logind

如果不想映射电源键,也可以直接用命令:

sudo systemctl hibernate