hibernate后Ubuntu 18.04无法恢复

当我使用Ubuntu 17.04时,Hibernate工作正常。 升级到17.10后,由于恢复后的黑屏,我无法恢复( https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1743094?comments=all )。

升级到18.04后,如果我在hibernate后尝试启动计算机,它会启动,就像没有完成hibernate一样。

与之前的LTS(16.04)相比,默认设置已进行了更改。 在我的情况下,直到我做了几个步骤之后,hibernate才起作用,其中包括增加交换文件的大小,打开它,确保策略允许它等等。

这可能很容易成为我在整个StackExchange上最冗长的答案,因此我尝试使标题具有描述性

靴子因为没有冬眠

谨慎地看看你的日志( dmesg可能有帮助),看看是否有任何东西。 尽管你告诉系统要hibernate,但它实际上不会,或者它将暂停到RAM(睡眠)。

看看kern.logsyslog寻找任何与hibernate相关的消息也不会有什么坏处。 以“问题”开头的部分可能会帮助您解决具体问题。

交换文件或交换分区

一个重要的变化是,现在你没有交换分区,但你有一个交换文件。

交换文件可能不适用于您的硬件/驱动程序/操作系统和hibernate的混合。

hibernate关闭了

政策也可能会关闭或禁止hibernate。

行话

暂停到RAM – RAM保持数据,计算机更快地进入睡眠状态,在暂停时使用更多能量,更快地唤醒。 有人称之为睡眠。

挂起到磁盘 – 也就是hibernate。 RAM保存为交换(分区或文件),计算机进入较慢的睡眠状态,在hibernate时使用较少的能量,较慢地唤醒。

由Rafael J. Wysocki和A. Leonard Brown在Linux中暂停到RAM

先决条件 – 你有足够的空间吗?

要hibernate,您需要(此处简化)将整个RAM保存到硬盘驱动器中。 所以,你需要留出足够的空间来做到这一点。 如果你不这样做,这将失败,你不会hibernate。

  1. free -m会告诉你你有多少内存,使用和你的交换多少。
  2. df -h将告诉您每个安装点有多少磁盘空间以及使用了多少,空闲等等。这很重要,因为您可能希望稍后指定交换文件的位置,或者“修剪”的分区“为你的交换留出足够的空间。
  3. 如果您有交换分区或文件, cat fstab应该为您提供信息。 根据Ubuntu Hibernation FAQ, swapfile可能并不总是适用于某些硬件/驱动程序组合。

如果您没有足够的空间,请关注Ubuntu交换常见问题解答 。 它告诉你如何增加交换文件,添加另一个文件,检查它是否已被使用等。使用命令和解释。 非常好的资源。

我没有足够的空间来容纳我的RAM!

内核文档说:

/ sys / power / image_size控制由挂起到磁盘机制创建的映像的大小。 它可以写成一个字符串,表示一个非负整数,用作图像大小的上限,以字节为单位。 挂起到磁盘机制将尽力确保图像大小不会超过该数量。 但是,如果事实certificate这是不可能的,那么无论如何都会尝试使用最小的图像暂停。 特别是,如果将“0”写入该文件,则暂停图像将尽可能小。 从此文件读取将显示当前图像大小限制,默认情况下设置为可用RAM的2/5。

因此,请尝试调整图像大小。 怎么 – 请问另一个问题。

先决条件 – 您的内核是否支持挂起到磁盘?

内核支持/sys/power/state列出的任何内容,因此:

cat /sys/power/state

允许(据我所知)条目包括: memstandbyfreezedisk 。 说明:

  • mem – 有几个含义,你可以通过cat /sys/power/mem_sleep找到你的系统中的一个含义。 我有: s2idle [deep]
  • standby – 开机暂停(如果支持)
  • freeze – 暂停空闲(STI)
  • disk – 挂起到磁盘(STD),hibernate 。 这 – 你想要的。

然后我们需要检查cat /sys/power/disk 。 如果你有disabled然后潜入你的BIOS寻找安全启动 – 这是我能提供的唯一的想法,只有我知道的可能会干扰和关闭hibernate。 虽然我只知道SecureBoot,但可能还有其他干扰,所以即使你没有任何“安全启动”,看看你的BIOS是个好主意。

在这里阅读:

  1. 内核文档
  2. Debian Wiki在hibernate状态

TBH,即使你的内核不支持hibernate,你可以用另一种方式尝试,向下滚动到Interfaces部分

阅读本文 – 警告和问题 – 没有BTRFS

没有特别的顺序:

  1. 并非所有的芯片组都能正常工作(没有我可以在这里引用的资源,所以让我们说这是传闻)
  2. VAIO有问题,据说有一个标志来对付它们
  3. SecureBoot通常被视为干扰或关闭hibernate
  4. 即使在hibernate状态下,LAN唤醒也会消耗功率
  5. 在系统正常从hibernate状态恢复之前,可以初始化模块数量(特别是图形) – 这通常是恢复时黑屏的原因 。 查看ArchLinux Wiki以获取有关如何调试问题的提示。 我还建议关于hibernate问题的Ubuntu FAQ。 浏览Launchpad错误也可能会产生结果。 IIRC,有一个内核参数,以秒为单位指定恢复前的延迟。
  6. 对于不同的Polkit版本,允许hibernate过程有所不同

不要使用BTRFS和hibernate:结果会损坏数据。

我想hibernate – 交换分区

有些情况下,人们放弃交换文件并返回交换分区。 毕竟,它适用于之前的LTS。 我没有尝试,所以不会提供指针。

我想hibernate – 使用交换文件

  1. 确保你有足够的空间。 Ubuntu交换常见问题解答告诉你你需要多少,上面的命令也是如此。 如果您需要更多信息,请提出另一个问题,因为这是一个冗长的主题。
  2. 增加交换文件或创建一个足够大的新文件(首选,我同意@muru )并将/etc/fstab更改为新文件。 重新启动以查看更改是否正常(存储fstab备份,以便您可以轻松恢复以防万一。
  3. 使用适当的参数将内核指向此处,以便知道从何处继续。
  4. 更新/重新配置引导加载程序并重新引导。

内核参数? 害怕!

仔细阅读并决定是否要这样做,但这只是配置内核的一种方法。 通过systemduswsusp进行hibernate可能更容易(参见下面的接口 )。 也许,你 – 像我一样 – 最终会决定暂停到RAM就足够了,你不想在交换文件上有32GB(例如,对于在他们的笔记本电脑中有一个SSD的人来说不是那么好)。 但!

  1. hibernate交换文件需要resume=知道你的交换文件在哪个分区上, resume_offset=知道交换文件从哪里开始恢复。
  2. hibernate to partition要求resume=指向交换分区。
  3. 解决黑屏问题可能需要resumedelay=

关于延迟从hibernate状态恢复的内核文档:

resumedelay = [HIBERNATION]在尝试读取恢复文件之前暂停的延迟(以秒为单位)

交换文件和hibernate所需的参数

resume = [SWSUSP]

  Specify the partition device for software suspend Format: {/dev/ | PARTUUID= | : | } 

resume_offset = [SWSUSP]

  Specify the offset from the beginning of the partition given by "resume=" at which the swap header is located, in  units (needed only for swap files). See Documentation/power/swsusp-and-swap-files.txt 

对于resume=选择与fstab root元素相同的样式。 所以, /dev/sdaXUUID或LVM。 对于hibernate到文件 – 提供可以找到文件的分区。

读:

  1. https://www.kernel.org/doc/Documentation/admin-guide/kernel-parameters.txt
  2. https://wiki.archlinux.org/index.php/Kernel_parameters

问题 – 未找到交换标头

交换文件需要正确格式化。 如果您的日志告诉您,您要么尝试hibernate到文件,要么恢复参数不正确。

切换到分区或修复文件或更改用于hibernate的界面。

请参阅: https : //unix.stackexchange.com/questions/43508/debian-hibernate-problem-pm-swap-header-not-found

mkswap用于格式化文件,在此处阅读更多内容

问题! 不允许hibernate!

测试: pm-hibernate (如果安装了pm-utils包)或者systemctl hibernate告诉你不允许。 自IIRC 12.04以来Ubuntu中的默认设置。

解决方案:取决于您的Polkit版本,您的Ubuntu版本和风格……请参阅此问题 。 此外, Polkit上的ArchWiki可能会有所帮助。

对于Mint,请参阅: https : //forums.linuxmint.com/viewtopic.php?t = 259912

问题! 在BIOS中禁用hibernatefunction!

测试: cat /sys/power/diskdisabled 。 日志显示“无法通过logind暂停系统:不支持Sleep动词”。

解决方案:搜索BIOS并找到有问题的东西。 把它关掉。

解决方案2:尝试另一个hibernate界面。

请参阅: 如何在16.04.1中激活hibernate模式? (systemd) 。

接口

  1. swsusp – 低级内核接口。 请参阅先决条件 – 文件的内核。 直接写入文件可能会导致挂起(到RAM,磁盘和混合)。 根据SwapFAQ有问题,冬眠到档案。
  2. uswsusp – ArchWiki和Debian Wiki以及很好的AskUbuntu问题以及如何使用它的文章 。
  3. systemd – ArchWiki就可以了
  4. pm-utils – AFAIK,它是最初来自Debian 的脚本集合 – 我很乐意自己欢迎更多信息。

闭幕致辞

对我来说,编译它需要将近两天的时间。 希望这可以帮助您(和其他人)更快地解决您的问题。 还有一点我错过了,但是凌晨2点,我现在不想写更多。 我当然愿意接受任何人的指示,以使其更好,所以评论。 一旦我睡觉,工作等,我会回复:-)

我不确定冬眠到磁盘是那么好。 我最后一直睡着了。 但对我来说问题是有一个32GB的文件只是为了能够进行hibernate,因为我通常会避免交换。 我的初始交换文件是2GB,大部分是空的。 因人而异。 不过,祝你好运! 从日志开始!

/etc/default/grub/etc/initramfs-tools/conf.d/resume中的RESUME参数resume=UUID=<#>中使用交换分区的UUID而不是它的挂载点

/etc/fstab为交换分区创建一个条目, 而没有像这样的安装点

 # Entry for Swap : UUID=# none swap sw 0 0 

/etc/default/grub我使用了一个单独的条目来恢复hibernate状态

 # FOR HIBERNATION GRUB_CMDLINE_LINUX="resume=UUID=..." 

在地方当局创建一个政策套件(pkla)

 sudo gedit /etc/polkit-1/localauthority/50-local.d/com.ubuntu.enable-hibernate.pkla 

并插入那里

 [Re-enable hibernate by default in upower] Identity=unix-user:* Action=org.freedesktop.upower.hibernate ResultActive=yes [Re-enable hibernate by default in logind] Identity=unix-user:* Action=org.freedesktop.login1.hibernate;org.freedesktop.login1.handle-hibernate-key;org.freedesktop.login1;org.freedesktop.login1.hibernate-multiple-sessions;org.freedesktop.login1.hibernate-ignore-inhibit ResultActive=yes 

之后更新initramfs和GRUB

 sudo update-initramfs -u -k all sudo update-grub 

重新启动,打开一些应用程序并使用systemctl hibernate (没有sudo)来查看它是否有效

我希望这有帮助

对我来说,它一直工作到18.04和18.04之后我按照许多文章的说法启用它,但它突然在昨天停止工作(工作正常4-5个月),

这是……让它再次发挥作用的一件事……

告诉grub 2交换分区的位置:

首先找出它所在的分区:使用下面的命令cat /etc/fstab我的sda7是以下输出

安装期间,swap在/ dev / sda7上

然后,使用以下命令在Grub 2中添加以下添加到以下行:

sudo gedit /etc/default/grub

GRUB_CMDLINE_LINUX_DEFAULT =“intel_pstate = disable resume = / dev / sda7”

重要的部分是“resume = / dev / sda7”

在我的情况下/ dev / sda7

然后使用以下命令更新Grub,之后它再次开始正常工作

 sudo update-grub 

经过多次尝试,这是一件有用的事情,也许只是因为内核的更新搞砸了,从来没有用过这个……我希望它有所帮助

干杯,马克

升级到18.04后,我有一个从暂停恢复的问题。 但是,在这里,我偶然发现了一个解决方法:我安装了一个18.04可启动的USB记忆棒,只要它留在那里,恢复是完美无缺的。 我应该删除它,问题再次出现。 我知道这听起来很疯狂,但我可以向你保证它适用于暂停; 我还没有尝试过这个问题。