从交换文件中hibernate和恢复

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

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

有人知道怎么做这个吗?

使用uswusp使用Swap文件进行hibernate

虽然可以通过设置内核参数来hibernate以交换文件,但它可以与systemd hibernate一起使用。 但是,我无法让它恢复,所以转而使用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 

validation交换文件分区

 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 

测试uswusphibernate

 sudo s2disk 

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

将s2disk与systemd hibernate一起使用

默认情况下,systemd将使用它自己的hibernate命令,所以通过覆盖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 hibernate:

 systemctl hibernate 

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

 systemctl status systemd-hibernate.service 

参考文献:

  • Debian Wiki – Hibernate_Without_Swap_Partition
  • Arch Wiki – Uswsusp

我已经快速阅读了本教程,如果我已经正确理解,您只需要为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不使用此变量)。

关于你遇到的问题:交换文件的分区是加密的吗? 如果是这样,hibernate将无法正常工作。 如果没有,那么filefrag -v /swapfile的输出可能会有所帮助。