Arch Linux KDE 休眠配置
2024-11-19  / Arch Linux 系列
电源管理/挂起与休眠

通常,在 Linux 上,有多种方法可用于挂起(suspend)系统。将系统状态保存在内存或磁盘中,进入低功耗模式。当重新恢复电脑时,允许快速恢复到先前的状态。

  • Suspend to RAM(挂起到内存,通称挂起/睡眠): 将当前的系统状态保存在 RAM 中,通过将机器中大多数和 RAM 不相关的部件断电来工作。这种情况,RAM 是恢复机器状态所必需的,并且需要持续供电。由于是通过 RAM 来存取系统状态,系统恢复速度非常快。
  • Suspend to disk(挂起到硬盘,通称休眠): 将当前的系统状态保存在磁盘(通常是交换分区或交换文件中),然后关闭电源。当恢复时,系统会从磁盘中恢复数据。与 RAM 方式相比,休眠模式可以更长时间地保持系统的状态,但恢复时间较长。本文主要介绍如何开启和配置休眠模式。
  • Suspend to both(挂起到两者/混合挂起): 结合了挂起到 RAM 方式和磁盘方式的优点。将当前的系统状态保存在磁盘(交换空间)中,然后进入睡眠模式,并保持 RAM 供电。当恢复时,系统会首先从 RAM 快速恢复,若 RAM 丢失,则从磁盘恢复。比如,如果电池电量耗尽,系统会从磁盘中恢复。

新增 swap

Swap 概念

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 若当前没有 swap 空间,需创建一个新的 swap 
# Use dd to create a swap file of 15 GiB
$ sudo dd if=/dev/zero of=/swapfile bs=1M count=15k status=progress

# Set the right permissions (a world-readable swap file is a huge local vulnerability):
$ sudo chmod 0600 /swapfile

# After creating the correctly sized file, format it to swap:
$ sudo mkswap -U clear /swapfile
mkswap: /swapfile: warning: wiping old swap signature.
Setting up swapspace version 1, size = 15 GiB (16106123264 bytes)
no label, UUID=00000000-0000-0000-0000-000000000000

# Activate the swap file:
$ sudo swapon /swapfile

# Finally, edit the fstab configuration to add an entry for the swap file:
$ sudo vim /etc/fstab
/swapfile none swap defaults 0 0

# Verify if the swap is active:
$ sudo swapon --show
NAME TYPE SIZE USED PRIO
/swapfile file 15G 256K -2

休眠

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 确认 swap 文件所在的分区 UUID
$ findmnt -no UUID -T /swapfile
0fdd557a-e3bb-4db4-a93a-0d1ebcf75769

# 查看 swapfile offset,给 resume_offset 用
$ sudo filefrag -v /swapfile | awk '{ if($1=="0:"){print substr($4, 1, length($4)-2)} }'

# resume 参数是 swap 文件所在的分区,可指定为 /dev/nvme0n1p5 或 UUID=0fdd557a-e3bb-4db4-a93a-0d1ebcf75769
# resume_offset 是文件开头在这个分区中的物理偏移量,可以通过 `filefrag -v /swapfile` 查看。
resume=UUID=0fdd557a-e3bb-4db4-a93a-0d1ebcf75769 resume_offset=17278976

# 关于内核参数的设置,若使用GRUB,追加到 GRUB_CMDLINE_LINUX_DEFAULT 中
$ sudo vim /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="loglevel=3 quiet resume=UUID=0fdd557a-e3bb-4db4-a93a-0d1ebcf75769 resume_offset=17278976"

# 重新生成一下 grub.cfg
$ sudo grub-mkconfig -o /boot/grub/grub.cfg

###################

# 如果你的 initramfs 没有使用 systemd 钩子(使用的是 base),那么就还需要添加一个 resume 钩子才会尝试从休眠中恢复:
# 编辑 /etc/mkinitcpio.conf 文件,在 HOOKS=(...) 里的 udev 之后的任何位置加入 resume。
$ sudo vim /etc/mkinitcpio.conf
# 最后重新生成 initramfs 即可:
$ sudo mkinitcpio -p linux
# 至此配置工作都完成了,通过 `systemctl hibernate` 来休眠,再按下电源键开机来检查休眠功能是否正常。

参考