我无法让“暂停”功能在 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”找到