休眠并从交换文件恢复

tfm*_*aes 37 hibernate swap

我在笔记本中配置了一个新的 Ubuntu 安装来使用交换文件,而不是使用交换分区。

默认情况下,不可能使用交换文件让 Ubuntu 休眠,所以我尝试了本教程,但它特定于grub1,而 Ubuntu 现在使用grub2

有人知道怎么做这个吗?

Ant*_* O. 51

这是我为使其适用于 Ubuntu 18.04 所做的工作。

  • 使您/swapfile至少拥有 RAM 的大小
sudo swapoff /swapfile
sudo dd if=/dev/zero of=/swapfile bs=$(cat /proc/meminfo | awk '/MemTotal/ {print $2}') count=1024 conv=notrunc
sudo mkswap /swapfile
sudo swapon /swapfile
Run Code Online (Sandbox Code Playgroud)
  • 请注意包含您的分区的 UUID /swapfile
$ sudo findmnt -no UUID -T /swapfile
20562a02-cfa6-42e0-bb9f-5e936ea763d0
Run Code Online (Sandbox Code Playgroud)
  • 重新配置包uswsusp以正确使用交换文件:
sudo dpkg-reconfigure -pmedium uswsusp
# Answer "Yes" to continue without swap space
# Select "/dev/disk/by-uuid/20562a02-cfa6-42e0-bb9f-5e936ea763d0" replace the UUID with the result from the previous findmnt command
# Encrypt: "No"
Run Code Online (Sandbox Code Playgroud)
  • 使用sudo systemctl edit systemd-hibernate.service以下内容编辑 SystemD 休眠服务并填充它:
[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
Run Code Online (Sandbox Code Playgroud)
  • 请注意您的简历偏移量/swapfile
$ sudo swap-offset /swapfile
resume offset = 34818
Run Code Online (Sandbox Code Playgroud)
  • 通过编辑/etc/default/grub和修改以下行,将 Grub 配置为从交换文件恢复:
GRUB_CMDLINE_LINUX_DEFAULT="resume=UUID=20562a02-cfa6-42e0-bb9f-5e936ea763d0 resume_offset=34818 quiet splash"
Run Code Online (Sandbox Code Playgroud)
  • 更新 Grub:
sudo update-grub
Run Code Online (Sandbox Code Playgroud)
  • 创建以下内容/etc/initramfs-tools/conf.d/resume
RESUME=UUID=20562a02-cfa6-42e0-bb9e-5e936ea763d0 resume_offset=34816
    # Resume from /swapfile
Run Code Online (Sandbox Code Playgroud)
  • 更新 initramfs:
sudo update-initramfs -u -k all
Run Code Online (Sandbox Code Playgroud)

现在您可以使用sudo systemctl hibernate.

还可以创建这些脚本:

sudo swapoff /swapfile
sudo dd if=/dev/zero of=/swapfile bs=$(cat /proc/meminfo | awk '/MemTotal/ {print $2}') count=1024 conv=notrunc
sudo mkswap /swapfile
sudo swapon /swapfile
Run Code Online (Sandbox Code Playgroud)

因此,您可以gotosleep使用gotohibernation.

您必须能够执行sudo s2bothsudo s2ram并且sudo systemctl hibernate无需输入密码才能使先前的脚本工作。

例如,您可以通过创建一个powerdev组,将您当前的用户添加到该组,并配置以下 sudoers 配置(使用 编辑它sudo visudo -f /etc/sudoers.d/powerdev)来做到这一点:

%powerdev ALL=NOPASSWD: /usr/sbin/s2both, /usr/sbin/s2ram, /bin/systemctl hibernate
Run Code Online (Sandbox Code Playgroud)

使用的文档:

  • 这次真是万分感谢!我尝试了很多方法,但在 Ubuntu 18.04 上只有你的方法对我有用:) (2认同)
  • 这是唯一对我有用的解决方案。登录只是为了支持这个答案。谢谢。 (2认同)

Cas*_*Cas 29

使用 uswusp 使用交换文件休眠

尽管可以休眠以交换文件,并且据说它可以通过设置内核参数与 systemd 休眠一起使用。但是,我无法让它恢复,所以转而使用uswsusp (userspace software suspend)。以下是我在 Ubuntu 17.04/17.10 上使用的步骤。

创建交换文件

创建格式化的 4GiB 交换文件的命令,安装并添加到/etc/fstab

sudo fallocate -l 4g /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile swap swap defaults 0 0' | sudo tee -a /etc/fstab
Run Code Online (Sandbox Code Playgroud)

验证交换文件分区

sudo findmnt -no SOURCE,UUID -T /swapfile
> /dev/sda1 11cc33ee-1234-abcd-1234-ddeeff112233
Run Code Online (Sandbox Code Playgroud)

安装用户空间软件挂起(uswsusp)

sudo apt install uswsusp
Run Code Online (Sandbox Code Playgroud)

配置uswsusp

创建/etc/uswsusp.conf和重新创建initramfs

sudo dpkg-reconfigure -pmedium uswsusp
Run Code Online (Sandbox Code Playgroud)
  • Yes' 在没有有效交换空间的情况下继续吗?' (向导尚未设置交换文件。)
  • 选择交换文件所在的分区,交叉引用findmnt上面的详细信息。(注意:不是交换文件本身

注意:手动进行的任何更改/etc/uswsusp.conf都需要initramfs使用以下命令重新创建:

sudo update-initramfs -u
Run Code Online (Sandbox Code Playgroud)

测试 uswusp 休眠

sudo s2disk
Run Code Online (Sandbox Code Playgroud)

snapshot休眠和恢复时屏幕上应该有消息。

将 s2disk 与 systemd 休眠一起使用

默认情况下,systemd 将使用它自己的休眠命令,因此通过覆盖以下命令将它们替换为 uswusp 命令systemd-hibernate.service

sudo systemctl edit systemd-hibernate.service
Run Code Online (Sandbox Code Playgroud)

在打开的文本编辑器中输入以下文本(需要空白的 ExecStart)。然后保存退出:

[Service]
ExecStart=
ExecStart=/usr/sbin/s2disk 
ExecStartPost=/bin/run-parts -a post /lib/systemd/system-sleep
Run Code Online (Sandbox Code Playgroud)

这将创建/etc/systemd/system/systemd-hibernate.service.d/override.conf具有覆盖详细信息的文件。

测试 systemd 休眠:

systemctl hibernate 
Run Code Online (Sandbox Code Playgroud)

注意:要检查 systemdoverride.conf是否已创建、加载且没有错误,请运行:

systemctl status systemd-hibernate.service
Run Code Online (Sandbox Code Playgroud)

参考:

  • 我没能完成这项工作。我设置了交换文件,安装并配置了 uswsusp,但 `sudo s2disk` 只记录 `Saving snapshot`,然后关闭显示器,挂起约 5 分钟,然后关闭计算机。但是,在我打开它后,它正常启动,就像没有休眠一样。 (2认同)

小智 11

乌班图22.04

uswusp已弃用。您仍然可以在Ubuntu <= 20.04上使用它。要查找 Ubuntu 22.04 上的交换偏移量:

  • Run sudo filefrag -v /swapfile
  • 在该"physical_offset"列中,复制第一行号(不带点!)。值示例:1234567.

来源:如何在 Ubuntu 上启用休眠(使用交换文件时)

对于 Ubuntu 22.04,所有其他步骤都保持不变,因此除了安装和使用uswusp之外,您可以遵循其他答案。


And*_*ini 9

我已经快速阅读了本教程,如果我理解正确,您只需要指定resumeLinux 命令行的选项。使用 Grub2 非常简单,您的更改将始终保留。您需要编辑/etc/default/grub文件,特别是这一行:

GRUB_CMDLINE_LINUX="resume=... resume_offset=..."
Run Code Online (Sandbox Code Playgroud)

之后,运行sudo update-grub以使更改生效。

更改GRUB_CMDLINE_LINUX不会影响您拥有的其他 Linux 安装(因为/etc/grub.d/30_os-prober不使用此变量)。

关于您遇到的问题:交换文件的分区是否加密?如果是这样,休眠将不起作用。如果没有,那么 的输出filefrag -v /swapfile可能会有所帮助。