在 Ubuntu 18.04 上暂停而不使用 uswsusp 和 s2ram 保存状态

在 Ubuntu 18.04 上暂停而不使用 uswsusp 和 s2ram 保存状态

我无法让“暂停”功能在 Ubuntu 18.04 上正常工作。但是休眠功能可以按预期工作。

问题描述:当我从电源菜单或“sudo systemctl suspend”使用暂停功能时,行为是:

  • 机器进入睡眠模式,电源按钮 LED 缓慢闪烁(呼吸)。
  • 当笔记本电脑重新启动时,操作系统启动,我看到通常的登录屏幕,但正在运行的所有应用程序均未恢复。

我目前所做的:

$ sudo apt-get install uswsusp
$ sudo update-initramfs -u
$ sudo systemctl edit systemd-suspend.service

我将以下几行粘贴到 systemd-suspend.service 中:

[Service]
ExecStart=
ExecStartPre=-/bin/run-parts -v -a pre /usr/lib/systemd/system-sleep
ExecStart=/usr/sbin/s2ram
ExecStartPost=-/bin/run-parts -v --reverse -a post /usr/lib/systemd/system-sleep
  • 保存了文件。它将保存在 /etc/systemd/system/
  • 跑步:

    $ sudo systemctl 守护进程重新加载

  • 测试一下:

    $ sudo systemctl 暂停

结果如上所述,笔记本电脑进入睡眠状态,但重新启动时不会恢复保存的会话。

我确实知道正在调用 systemd-suspend.service 脚本。如果我将 ExecStart=/usr/sbin/s2ram 行更改为 ExecStart=/usr/sbin/s2disk,笔记本电脑将进入休眠状态并恢复会话。

附加信息:

为了让 Hibernate 正常工作,我更改了 grub:

sudoedit /etc/default/grub

改变了这一行:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
 to:
GRUB_CMDLINE_LINUX_DEFAULT="no_console_suspend initcall_debug resume=UUID=<string of hex> resume_offset=34816"
  • 然后运行:

    $ sudo 更新 grub

内核信息:

lsb_release -a

Distributor ID: Ubuntu
Description:    Ubuntu 18.04.2 LTS
Release:    18.04
Codename:   bionic

uname -a 
Linux <machinename> 4.18.0-21-generic #22~18.04.1-Ubuntu SMP Thu May 16 15:07:19 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux


sudo s2ram -K
This kernel has KMS support.

我是否遗漏了某些步骤或配置项?

答案1

经过一番苦苦寻找答案并绞尽脑汁后,我通过从各种来源收集信息,自己找到了解决方案。此解决方案适用于运行 Ubuntu 18.04 的 Sony Vaio Model VPCEB15FM,您的情况可能有所不同。

使休眠/挂起正常工作的部分问题在于 Ubuntu 加载和分配 /dev/sda2、/dev/sdb2 等的方式,因为驱动器分配顺序有时会在每次启动时发生变化。因此,第一步是识别交换分区的 UUID。由于 UUID 是恒定的,因此它可以形成更可靠的挂载点。

UUID 可以从以下位置获取:

sudo blkid

查找标有“交换”的条目

/dev/sda2: UUID="5c555600-2e37-477d-62df-6013d61dc36" TYPE="swap" PARTUUID="2f501554-02"

您的 UUID 将与我的不同。不要使用我的,请使用您的。

如果您使用交换文件而不是交换分区,则使用主 Linux 分区的 UUID,并且您还需要知道交换文件的偏移量。

要获取交换文件的偏移量:

sudo filefrag -v /swapfile

输出将类似于此:

ext:     logical_offset:        physical_offset: length:   expected: flags:
   0:        0..   32767:      34816..     67583:  32768:            
   1:    32768..   63487:      67584..     98303:  30720:            
   2:    63488..   96255:     100352..    133119:  32768:      98304:

您所追求的偏移量是第一个“physical_offset”,在本例中它是 34816。

现在您已经拥有了开始所需的信息。

修改 /etc/default/grub

sudoedit /etc/default/grub

更改行:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"

如果使用交换分区来:

GRUB_CMDLINE_LINUX_DEFAULT="no_console_suspend initcall_debug resume=UUID=5c555600-2e37-477d-62df-6013d61dc36"

如果使用交换文件来:

GRUB_CMDLINE_LINUX_DEFAULT="no_console_suspend initcall_debug resume=UUID=5c555600-2e37-477d-62df-6013d61dc36 resume_offset=34816"

安装 uswsusp。
这将安装 s2disk、s2ram 和 s2both 方法。

sudo apt-get install uswsusp

设置 systemd-hibernate.service 和 systemd-suspend.service。
这些文件位于 /etc/systemd/system/ 中,如果它们不存在,则会在那里创建。

sudo systemctl edit systemd-hibernate.service

粘贴以下行:

[Service]
ExecStart=
ExecStartPre=-/bin/run-parts -v -a pre /lib/systemd/system-sleep
ExecStart=/usr/sbin/s2disk
ExecStartPost=-/bin/run-parts -v --reverse -a post /lib/systemd/system-sleep

注意:我的系统有一个到 /lib/systemd/system-sleep 的路径,其他系统可能有不同的位置,如 /usr/lib/systemd/system-sleep。

sudo systemctl edit systemd-suspend.service

粘贴以下行:

[Service]
ExecStart=
ExecStartPre=-/bin/run-parts -v -a pre /lib/systemd/system-sleep
ExecStart=/usr/sbin/s2both
ExecStartPost=-/bin/run-parts -v --reverse -a post /lib/systemd/system-sleep

注意在“暂停”配置中使用 s2both 而不是 s2ram。s2ram 在我的系统上不起作用,但 s2both 总是起作用。

Ubuntu 18.04 和 20.04:

编辑 /etc/uswsusp.conf。

使用 UUID,如果使用交换文件则使用偏移量:

sudo nano /etc/uswsusp.conf

修改以使用您的 UUID 等。

# /etc/uswsusp.conf(5) -- Configuration file for s2disk/s2both 
resume device = UUID=5c555600-2e37-477d-62df-6013d61dc36
compress = y
# early writeout = y
# image size = 1741570539
# RSA key file = /etc/uswsusp.key
shutdown method = platform
# only needed if using a swapfile
# resume offset = 34816

注意:uswsusp.conf 有一个手册页,其中完整描述了所有参数。还有许多其他设置,这是最低要求。注释行保留了下来,以便您可以看到其他一些选项。

Ubuntu 22.04:

编辑 /etc/suspend.conf。

2022 年 9 月 16 日 /etc/uswsusp.conf 文件已被 /etc/suspend.conf 替换

看:https://wiki.archlinux.org/title/Uswsusp

sudo nano /etc/suspend.conf

只有 ”恢复设备“行已从上述说明发生变化,其他一切保持不变。

改用这一行:

resume device = /dev/disk/by-label/swap

编辑 /etc/initramfs-tools/conf.d/resume

sudo nano /etc/initramfs-tools/conf.d/resume

添加此行:RESUME=UUID=5c555600-2e37-477d-62df-6013d61dc3

注意:如果使用交换文件,则需要添加偏移量。在 UUID 后添加:恢复偏移量 = 34816

好的,这应该可以处理各种配置项。

更新 grub 和 initramfs:

sudo update-grub
sudo update-initramfs -u  or update-initramfs -u -k all  to do all kernels

重新启动 Ubuntu。
重启后测试休眠和挂起功能。休眠可能需要几分钟才能将恢复文件写入交换并关闭机器。不要惊慌。挂起会快一点。

测试一下一切!

sudo systemctl hibernate
sudo systemctl suspend

您应该看到的内容

  • 休眠 - 完全关闭系统,需要几分钟。重新启动计算机并重新登录后,您的应用程序应恢复。注意:恢复过程可能需要几分钟,并且在恢复过程中机器可能会挂起。请耐心等待。
  • 暂停 - 系统进入“睡眠”模式,电源灯缓慢闪烁(呼吸)。按下主电源按钮即可唤醒机器。您应该会看到登录屏幕,并且您的应用程序应该会恢复。

进一步措施
您应该能够从电源菜单下拉菜单进入睡眠/挂起模式。打开下拉菜单时按 Alt 键。电源图标应变为睡眠图标。

还可以添加休眠菜单选项。已经有一些很好的教程,可以通过搜索“ubuntu add hibernate power menu”找到

相关内容