休眠并从交换文件恢复


23

我已经在Notebook中配置了新的Ubuntu安装,以使用交换文件而不是交换分区。

默认情况下,无法使Ubuntu使用交换文件进入休眠状态,因此我尝试了本教程,但它特定于grub1,而Ubuntu现在使用grub2

有人知道怎么做这个吗?

Answers:


21

使用uswusp使用Swap文件休眠

尽管可以休眠以交换文件,并且据说可以通过设置内核参数与systemd休眠一起使用。但是,我无法恢复它,所以改用uswsusp(用户空间软件暂停)。这是我在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

验证交换文件分区

sudo findmnt -no SOURCE,UUID -T /swapfile
> /dev/sda1 11cc33ee-1234-abcd-1234-ddeeff112233

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

sudo apt install uswsusp

配置uswsusp

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

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

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

sudo update-initramfs -u

测试uswusp休眠

sudo s2disk

snapshot休眠和继续屏幕上应该有消息。

将s2disk与systemd休眠一起使用

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

sudo systemctl edit systemd-hibernate.service

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

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

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

测试systemd休眠:

systemctl hibernate 

注意:要检查systemd override.conf是否已创建,加载并没有错误,请运行:

systemctl status systemd-hibernate.service

参考文献:


该说明似乎有效,但systemd休眠不适用于我。您自己测试了吗?如果这ExceStart=run-parts -a post /lib/systemd/system-sleepExceStartPost=run-parts -a post /lib/systemd/system-sleep
华金Aramendía

它已经过测试并且可以正常工作,但也许还需要添加。我已经更新了答案。
卡斯

这看起来不太正确。符号链接 从到的enable选项。您永远不应直接复制到systemctl /etc/systemd/system//lib/systemd/system//etc/systemd/system/
Auspex

1
我没有设法使这项工作😞。我设置了swapfile,安装并配置了uswsusp,但sudo s2diskSaving snapshot关闭日志,然后关闭了显示器,挂起了约5分钟,然后关闭了计算机。但是,在我打开它后,它通常会启动,就像没有休眠一样。
m93a

1
我认为此行sudo findmnt -no SOURCE,UUID -T /mnt/4GiB.swap应更改为sudo findmnt -no SOURCE,UUID -T /swapfile
user1915011

12

这是我为使其与Ubuntu 18.04兼容而所做的工作。

  • 使您/swapfile的RAM至少大小

    sudo swapoff /swapfile
    sudo dd if=/dev/zero of=/swapfile bs=$(cat /proc/meminfo | grep MemTotal | grep -oh '[0-9]*') count=1024 conv=notrun
    sudo mkswap /swapfile
    sudo swapon /swapfile
    
  • 请注意包含您的分区的UUID /swapfile

    $ sudo findmnt -no SOURCE,UUID -T /swapfile
    /dev/nvme0n1p5 20562a02-cfa6-42e0-bb9f-5e936ea763d0
    
  • 重新配置软件包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"
    
  • 使用来编辑SystemD休眠服务,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
    
  • 注意您的的简历偏移/swapfile

    $ sudo swap-offset /swapfile
    resume offset = 34818
    
  • 通过编辑/etc/default/grub和修改以下行,将Grub配置为从交换文件恢复:

    GRUB_CMDLINE_LINUX_DEFAULT="resume=UUID=20562a02-cfa6-42e0-bb9f-5e936ea763d0 resume_offset=34818 quiet splash"
    
  • 更新Grub:

    sudo update-grub
    
  • 创建以下内容/etc/initramfs-tools/conf.d/resume

    RESUME=UUID=20562a02-cfa6-42e0-bb9e-5e936ea763d0 resume_offset=34816
    # Resume from /swapfile
    
  • 更新initramfs:

    sudo update-initramfs -u -k all
    

现在您可以使用休眠了sudo systemctl hibernate

也可以创建这些脚本:

    sudo tee /usr/local/bin/gotosleep <<EOF
    dbus-send --type=method_call --dest=org.gnome.ScreenSaver /org/gnome/ScreenSaver org.gnome.ScreenSaver.Lock
    sleep 2
    sudo /usr/sbin/s2both
    EOF
    sudo chmod +x /usr/local/bin/gotosleep
    sudo tee /usr/local/bin/gotohibernation <<EOF
    dbus-send --type=method_call --dest=org.gnome.ScreenSaver /org/gnome/ScreenSaver org.gnome.ScreenSaver.Lock
    sleep 2
    sudo systemctl hibernate
    EOF
    sudo chmod +x /usr/local/bin/gotohibernation

因此,您可以与睡眠gotosleep或休眠gotohibernation

你必须能够执行sudo s2bothsudo s2ramsudo systemctl hibernate不必为以前的脚本工作输入您的密码。

您可以这样做,例如,通过创建一个powerdev组,将当前用户添加到该组,然后配置以下sudoers config(使用进行编辑sudo visudo -f /etc/sudoers.d/powerdev):

     %powerdev ALL=NOPASSWD: /usr/sbin/s2both, /usr/sbin/s2ram, /bin/systemctl hibernate

使用的文件:


这次真是万分感谢!我尝试了很多方法,但是只有您的方法可以在Ubuntu 18.04上使用:)
jirislav

这几乎使我感到想再次尝试休眠-我的磁盘偶尔出现问题,这显然与休眠过程有关。你有没有遇到过这样的事情?
查尔斯·格林

谢谢@安东尼!我尝试了很多事情使自己冬眠。您的解决方案是最终的解决方案。这似乎奇怪,我认为这是不正确设置,立竿见影。:(
Mike Williamson

感谢您的指导。在按照以下步骤尝试使用$ sudo systemctl hibernate进行休眠之后,笔记本电脑在尝试休眠后醒来了几秒钟。/ var / log / syslog显示许多错误,但这些错误似乎最相关:-无法为输出eDP-1设置省电模式:权限被拒绝...-对象.Gjs_AppIndicatorIconActor__1(0x561c60a4d150)已完成。无法为其设置任何属性。...-s2disk:无法使用恢复设备(尝试使用swapon -a)。原因:没有这样的设备-systemd-hibernate.service:主进程已退出,代码已退出,…
Jelani Nelson

1
这是唯一对我有用的解决方案。登录只是为了支持这个答案。谢谢。
dpetrini

8

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

GRUB_CMDLINE_LINUX="resume=... resume_offset=..."

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

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

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


谢谢!我会尝试。但是我认为它用这一行在grub中配置了所有linux条目。
tfmoraes

别忘了:更改后,/etc/default/grub您需要运行update-grub
2010年1

@tfmoraes:为什么不要将其添加到所有linux条目中?
2010年1

@JanC:因为我可能安装了其他Linux发行版。
tfmoraes 2010年

1
@ didi_X8该评论写于8年前。从那以后,情况可能会发生变化。感谢分享。
安德里亚·柯贝利尼
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.