已针对 Ubuntu LTS 22.04 进行更新,已于 22 年 11 月 17 日进行测试。

已针对 Ubuntu LTS 22.04 进行更新,已于 22 年 11 月 17 日进行测试。

当我使用 Ubuntu 17.04 时,Hibernate 工作正常。升级到 17.10 后,我无法恢复,因为恢复后出现黑屏(这个错误)。

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

答案1

已针对 Ubuntu LTS 22.04 进行更新,已于 22 年 11 月 17 日进行测试。

与之前的 LTS (16.04) 相比,默认设置有所变化。就我而言,休眠功能直到我完成几个步骤后才起作用,其中包括增加交换文件的大小、将其打开、确保策略允许它等。

这可能是我在整个 StackExchange 上最长的回答,因此我尝试让标题更具描述性

靴子没有冬眠

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

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

交换文件或交换分区

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

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

休眠功能已关闭

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

行话

挂起到 RAM - RAM 保存数据,计算机进入休眠状态更快,挂起时消耗更多能量,唤醒速度更快。有人称之为睡眠。

挂起到磁盘 - 又称为休眠。RAM 被保存到交换(分区或文件),计算机进入休眠状态的速度较慢,休眠时消耗的能量较少,唤醒速度较慢。

Rafael J. Wysocki 和 A. Leonard Brown 撰写的《Linux 中的 Suspend-to-RAM》

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

要进入休眠状态,您需要(此处简化)将整个 RAM 保存到硬盘中。因此,您需要留出足够的空间来执行此操作。如果不这样做,此操作将失败,您将无法进入休眠状态。

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

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

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

内核文档说:

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

因此,请尝试调整图像大小。如何操作 - 请再问一个问题。

先决条件-你的内核是否支持暂停到磁盘?

内核支持 中列出的所有内容/sys/power/state,因此:

cat /sys/power/state

据我所知,允许的条目包括:mem,,,。解释:standbyfreezedisk

  • mem- 有多种含义,具体含义你可以通过 来了解cat /sys/power/mem_sleep。我有:s2idle [deep]
  • standby- 开机挂起(如果支持)
  • freeze- 暂停至空闲 (STI)
  • disk- 挂起到磁盘 (STD)、休眠.这——你想要。

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

在这里阅读:

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

老实说,即使你的内核不支持休眠,你也可以尝试另一种方式,向下滚动到部分Interfaces

阅读此文 - 警告和问题 - 没有 BTRFS

不分先后顺序:

  1. 并非所有芯片组都能工作(我没有可以在此引用的来源,因此我们假设这是传闻)
  2. VAIO 有问题,据说有一个标志可以解决这些问题
  3. 安全启动通常被认为会干扰或关闭休眠模式
  4. 即使处于休眠状态,局域网唤醒也会消耗电量
  5. 在系统从休眠状态正常恢复之前,可能会初始化许多模块(尤其是图形模块)-这通常是恢复时黑屏的原因。查看 ArchLinux Wiki 以获取有关如何调试问题的提示。我还建议查看有关休眠问题的 Ubuntu FAQ。浏览 Launchpad 错误也可能产生结果。如果我没记错的话,有一个核参数指定恢复前的延迟(以秒为单位)。
  6. 不同 Polkit 版本的休眠允许程序有所不同

不要使用 BTRFS 和休眠模式:这将导致数据损坏。

我想休眠 - 交换分区

在某些情况下,人们会放弃交换文件并返回交换分区。毕竟,它在之前的 LTS 上是有效的。我没有尝试过,所以不会提供建议。

我想休眠 - 使用交换文件

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

需要新的交换文件

sudo需要。我的情况是这样的。对于 Ubuntu 22,我使用了 29GB,因为我使用的这台笔记本电脑有 24 个 RAM(每Ubuntu 交换常见问题解答)命令来源于https://ploi.io/documentation/server/change-swap-size-in-ubuntu

  1. 关闭所有正在运行的交换进程: swapoff -a
  2. 调整交换大小 fallocate -l 1G /swapfile(将 1G 更改为您想要的千兆字节大小)
  3. CHMOD 交换:chmod 600 /swapfile
  4. 使文件可用作swap mkswap /swapfile
  5. 激活交换文件 swapon /swapfile

内核参数?可怕!

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

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

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

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

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

简历=[SWSUSP]

      Specify the partition device for software suspend
      Format:
      {/dev/<dev> | PARTUUID=<uuid> | <int>:<int> | <hex>}

恢复偏移量=[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

对于选择与中的元素resume=相同的样式。因此,要么 要么或LVM。对于休眠到文件 - 提供可以找到文件的分区。rootfstab/dev/sdaXUUID

例如,在分区/swapfile/

  1. df -h列出分区并找到挂载点所在的分区/。文件系统列有/dev/nvme0n1p2
  2. blkid给了我它的 UUID(EFI 和一个分区,这样我就可以像这样运行)。对于有多个分区的人:blkid /dev/nvme0n1p2。我们将此字符串称为:X。
  3. sudo filefrag -v /swapfile找到物理偏移下的第一个数字,我们将这个数字称为:Y。
  4. sudo vim /etc/default/grub- 找到带有 的行GRUB_CMDLINE_LINUX_DEFAULT,导航到其末尾并添加参数。如果它们在那里,您的问题可能是它们的正确性或其他问题。

GRUB_CMDLINE_LINUX_DEFAULT="安静启动恢复=UUID=X resume_offset=Y"

编辑完成后:sudo update-grub && reboot now

阅读:

  1. https://www.kernel.org/doc/Documentation/admin-guide/kernel-parameters.txt
  2. https://wiki.archlinux.org/index.php/Kernel_parameters
  3. https://ubuntuhandbook.org/index.php/2021/08/enable-hibernate-ubuntu-21-10/

问题 - 未找到交换标头

交换文件需要正确格式化。如果您的日志告诉您这一点,则您要么正在尝试休眠到某个文件,要么您的恢复参数不正确。

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

看: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 中激活休眠模式?(systemd)

接口

  1. swsusp - 低级内核接口。请参阅先决条件 - 内核以了解哪些文件。直接写入文件可能会导致暂停(写入 RAM、写入磁盘和混合)。根据 SwapFAQ,休眠到文件存在问题。
  2. uswsusp -维基百科Debian 维基很好的 AskUbuntu 问题,并附有如何使用它的文章
  3. systemd-系统ArchWiki 上对此
  4. pm-utils - 据我所知脚本集合最初是从Debian- 我本人很乐意接受更多信息。

结束语

对我来说,编写它几乎花了两天的时间。希望这能帮助您(和其他人)更快地解决问题。我仍然错过了一些要点,但现在是凌晨 2 点,我不想再写了。我当然愿意听取任何人的建议来改进它,所以请发表评论。我会在睡觉、工作等时候回复 :-)

我不确定休眠到磁盘是否真的那么好。最后我还是选择了休眠。但对我来说,问题在于拥有一个 32GB 的文件才能进行休眠,因为我通常根本不进行交换。我最初的交换文件是 2GB,而且大部分都是空的。YMMV。不过,祝你好运!从日志开始!

答案2

resume=UUID=<#>在RESUME/etc/default/grub参数中使用交换分区的 UUID 代替其挂载点/etc/initramfs-tools/conf.d/resume

在中为交换分区创建一个条目/etc/fstab 无安装点类似这样的

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

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

# 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

[Enable hibernate to be run via cron]
Identity=unix-user:*
Action=org.freedesktop.login1.hibernate;org.freedesktop.login1.hibernate-multiple-sessions
ResultAny=yes

之后更新 initramfs 和 GRUB

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

重启,打开一些应用程序并使用systemctl hibernate(无需 sudo)查看是否有效

答案3

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

这就是... 让它再次运转起来的一件事...

告诉 grub2 交换分区在哪里:

首先使用以下命令找出它位于哪个分区:

cat /etc/fstab

我的在 sda7 上,输出如下:

安装期间交换位于 /dev/sda7

然后,在 Grub2 中将以下内容添加到以下行,使用以下命令:

sudo gedit /etc/default/grub

GRUB_CMDLINE_LINUX_DEFAULT="intel_pstate=禁用恢复=/dev/sda7"

重要的是resume=/dev/sda7

在我的情况下是 /dev/sda7

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

sudo update-grub

经过多次尝试后,只有这一件事起作用了,也许只是因为内核更新搞砸了它,但它仍然起作用。

答案4

除了在 grub 中设置交换恢复点之外,Sam73 的回答,发现我的Ubuntu 18.04还需要安装laptop-mode-tools

$sudo apt install laptop-mode-tools

ENABLE_LAPTOP_MODE_ON_AC=1然后在配置文件中更改:

$sudo vim /etc/laptop-mode/laptop-mode.conf

使用以下命令启动笔记本电脑模式:

$sudo laptop_mode start

PS 您可以使用以下命令检查笔记本电脑是否启动

$cat /proc/sys/vm/laptop_mode

如果打印0,则表示laptop_mode没有工作,否则,表示它工作正常。

相关内容