it-swarm.cn

休眠并从交换文件恢复

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

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

有人知道怎么做这个吗?

22
tfmoraes

使用uswusp使用Swap文件休眠

尽管可以休眠以交换文件,并且据说可以通过设置内核参数与systemd休眠一起使用。但是,我无法恢复它,因此改用swsusp(用户空间软件挂起)。这是我在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 /mnt/4GiB.swap
> /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将使用它自己的休眠命令,因此通过覆盖systemd-hibernate.service将它们替换为uswusp命令:

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 

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

systemctl status systemd-hibernate.service

参考:

18
Cas

这是我为使其与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
    
  • 请注意包含您的/swapfile的分区的UUID:

    $ 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"
    
  • 使用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
    
  • 请注意您的/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配置(使用Sudo visudo -f /etc/sudoers.d/powerdev对其进行编辑)来实现:

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

使用的文件:

10
Anthony O.

我已快速阅读了该教程,并且,如果我对它的理解正确,则只需要在Linux命令行中指定resume选项即可。使用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的输出可能会有所帮助。

8
Andrea Corbellini