休眠后 Ubuntu 18.04 无法恢复

Kam*_*mil 24 hibernate 18.04

当我使用 Ubuntu 17.04 时,Hibernate 工作正常。升级到 17.10 后,由于恢复后黑屏而无法恢复(此错误)。

升级到 18.04 后,如果我尝试在休眠后启动计算机,它会像没有进行休眠一样启动。

LAF*_*ica 36

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

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

靴子,因为没有冬眠

谨慎查看您的日志(dmesg可能会有所帮助)并查看是否有任何内容。尽管您告诉系统休眠,但实际上它不会,或者它会挂起到 RAM(睡眠),这是有原因的。

查看kern.logsyslog寻找任何与休眠相关的消息也不会受到伤害。以“问题”开头的部分可能会帮助您解决特定问题。

交换文件或交换分区

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

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

休眠关闭

策略也可能关闭或禁止休眠。

行话

暂停到 RAM - RAM 保存数据,计算机进入睡眠更快,暂停时使用更多能量,唤醒更快。有人称之为睡眠。

挂起到磁盘 - 又名休眠。RAM 被保存到交换(分区或文件),计算机进入睡眠较慢,休眠时使用较少的能量,唤醒较慢。

Suspend-to-RAM in Linux by Rafael J. Wysocki 和 A. Leonard Brown

先决条件 - 您有足够的空间吗?

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

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

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

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

内核文档说:

/sys/power/image_size 控制由挂起到磁盘机制创建的映像的大小。它可以写成一个字符串,表示一个非负整数,它将用作图像大小的上限,以字节为单位。挂起到磁盘机制将尽最大努力确保映像大小不会超过该数字。但是,如果事实证明这是不可能的,它将尝试使用尽可能小的图像挂起。特别是,如果向该文件写入“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),休眠。这 - 你想要的。

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

在这里阅读:

  1. 内核文档
  2. 关于休眠的 Debian Wiki

TBH,即使您的内核不支持休眠,您也可以通过其他方式尝试,向下滚动到部分Interfaces

阅读这个 - 警告和问题 - 没有 BTRFS

没有特定的顺序:

  1. 并非所有芯片组都能工作(没有我可以在这里引用的来源,所以我们说这是道听途说)
  2. VAIO 有问题,据说有一个标志可以反击它们
  3. SecureBoot 经常被引用为干扰或关闭休眠
  4. 即使在休眠状态下,LAN 唤醒也会耗电
  5. 在您的系统从休眠状态正确恢复之前,可能会初始化多个模块(尤其是图形) -这通常是恢复时黑屏的原因。查看 ArchLinux Wiki 以获取有关如何调试问题的提示。我还建议有关休眠问题的 Ubuntu 常见问题解答。浏览 Launchpad 错误也可能会产生结果。IIRC,有一个内核参数以秒为单位指定恢复前的延迟。
  6. 不同的 Polkit 版本允许休眠程序不同

不要使用 BTRFS 和休眠:会导致数据损坏。

我想休眠 - 交换分区

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

我想休眠 - 使用交换文件

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

内核参数?害怕!

仔细阅读并决定是否要这样做,但这只是配置内核的一种方式。通过systemdand休眠可能更容易uswsusp(请参阅下面的接口)。可能是,您 - 像我一样 - 最终会决定挂起到 RAM 就足够了,并且您不想在交换文件上有 32GB(例如,对于笔记本电脑中有一个 SSD 的人来说不是很好)。但!

  1. 休眠到交换文件需要resume=知道您的交换文件在哪个分区上,并resume_offset=知道从交换文件中的哪个位置开始恢复。
  2. 休眠分区需要resume=指向交换分区。
  3. 解决黑屏问题可能需要resumedelay=.

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

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

交换文件和休眠所需的参数

简历= [SWSUSP]

      Specify the partition device for software suspend

      Format:

      {/dev/<dev> | PARTUUID=<uuid> | <int>:<int> | <hex>}
Run Code Online (Sandbox Code Playgroud)

resume_offset= [SWSUSP]

      Specify the offset from the beginning of the partition
      given by "resume=" at which the swap header is located,
      in <PAGE_SIZE> units (needed only for swap files).

      See Documentation/power/swsusp-and-swap-files.txt
Run Code Online (Sandbox Code Playgroud)

对于resume=选择与root元素相同的样式fstab。所以,要么/dev/sdaXUUID要么LVM。为了休眠到文件 - 提供可以找到文件的分区。

读:

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

问题 - 找不到交换标头

交换文件需要正确格式化。如果您的日志告诉您这一点,您要么试图休眠到文件,要么您的 resume 参数不正确。

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

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

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

问题!不允许冬眠!

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

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

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

问题!BIOS 中的某些内容禁用了休眠!

测试:cat /sys/power/diskdisabled。日志显示“无法通过 logind 使系统休眠:不支持睡眠动词”。

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

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

请参阅:如何在 16.04.1 中激活休眠?(系统化)

接口

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

闭幕致辞

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

我不确定休眠到磁盘是否有那么好。我最后还是睡了。但对我来说,问题是拥有 32GB 的文件只是为了能够进行休眠,因为我通常根本避免交换。我最初的交换文件是 2GB,而且大部分是空的。天啊。尽管如此,祝你好运!从日志开始!


Roe*_*oey 15

在简历中使用参数的交换分区的UUID,而不是它的安装点resume=UUID=<#>在这两个/etc/default/grub/etc/initramfs-tools/conf.d/resume

/etc/fstab 没有安装点的情况下为交换分区创建一个条目,如下所示

# Entry for Swap : 
UUID=# none  swap    sw              0       0
Run Code Online (Sandbox Code Playgroud)

/etc/default/grub我使用了一个单独的条目来恢复休眠

# FOR HIBERNATION 
GRUB_CMDLINE_LINUX="resume=UUID=..."
Run Code Online (Sandbox Code Playgroud)

在地方当局 (pkla) 中创建政策包

sudo gedit /etc/polkit-1/localauthority/50-local.d/com.ubuntu.enable-hibernate.pkla
Run Code Online (Sandbox Code Playgroud)

并插入那里

[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

[Enable hibernate to be run via cron]
Identity=unix-user:*
Action=org.freedesktop.login1.hibernate;org.freedesktop.login1.hibernate-multiple-sessions
ResultAny=yes
Run Code Online (Sandbox Code Playgroud)

之后更新 initramfs 和 GRUB

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

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