当我使用 Ubuntu 17.04 时,Hibernate 工作正常。升级到 17.10 后,我无法恢复,因为恢复后出现黑屏(这个错误)。
升级到 18.04 后,如果我尝试在休眠后启动计算机,它会像没有休眠一样启动。
答案1
已针对 Ubuntu LTS 22.04 进行更新,已于 22 年 11 月 17 日进行测试。
与之前的 LTS (16.04) 相比,默认设置有所变化。就我而言,休眠功能直到我完成几个步骤后才起作用,其中包括增加交换文件的大小、将其打开、确保策略允许它等。
这可能是我在整个 StackExchange 上最长的回答,因此我尝试让标题更具描述性。
靴子没有冬眠
明智的做法是查看您的日志(dmesg
可能会有帮助)并查看其中是否有任何内容。尽管您告诉系统休眠,但实际上它不会休眠,或者它会挂起到 RAM(睡眠),这是有原因的。
查看kern.log
并syslog
查找任何与休眠相关的消息也不会有什么坏处。以“问题”开头的部分可能会帮助您解决特定问题。
交换文件或交换分区
一个关键的变化是,现在您没有交换分区,但有一个交换文件。
交换文件可能不适用于您的硬件/驱动程序/操作系统和休眠模式。
休眠功能已关闭
策略还可能关闭或禁止休眠。
行话
挂起到 RAM - RAM 保存数据,计算机进入休眠状态更快,挂起时消耗更多能量,唤醒速度更快。有人称之为睡眠。
挂起到磁盘 - 又称为休眠。RAM 被保存到交换(分区或文件),计算机进入休眠状态的速度较慢,休眠时消耗的能量较少,唤醒速度较慢。
先决条件——您有足够的空间吗?
要进入休眠状态,您需要(此处简化)将整个 RAM 保存到硬盘中。因此,您需要留出足够的空间来执行此操作。如果不这样做,此操作将失败,您将无法进入休眠状态。
free -m
将告诉您拥有的内存量、已使用的内存量以及交换空间中的内存量。df -h
将告诉您每个挂载点上有多少磁盘空间以及已使用的空间、空闲的空间等等。这很重要,因为您可能希望稍后指定交换文件的位置,或者要“修剪”哪个分区以便有足够的空间用于交换。cat /etc/fstab
如果您有交换分区或文件,应该会为您提供信息。根据 Ubuntu 休眠常见问题解答,swapfile
在某些硬件/驱动程序组合下可能并不总是有效。
如果空间不足,请按照Ubuntu 交换常见问题解答。它会告诉你如何增加交换文件、添加另一个文件、检查它是否被使用等等。带有命令和解释。真的是很好的资源。
我没有足够的空间容纳我的 RAM!
内核文档说:
/sys/power/image_size 控制由挂起到磁盘机制创建的映像的大小。它可以被写成一个表示非负整数的字符串,该整数将用作映像大小的上限(以字节为单位)。挂起到磁盘机制将尽力确保映像大小不超过该数字。但是,如果这是不可能的,它将尝试使用尽可能小的映像来挂起。特别是,如果将“0”写入此文件,则挂起映像将尽可能小。从此文件读取将显示当前映像大小限制,默认情况下设置为可用 RAM 的 2/5。
因此,请尝试调整图像大小。如何操作 - 请再问一个问题。
先决条件-你的内核是否支持暂停到磁盘?
内核支持 中列出的所有内容/sys/power/state
,因此:
cat /sys/power/state
据我所知,允许的条目包括:mem
,,,。解释:standby
freeze
disk
mem
- 有多种含义,具体含义你可以通过 来了解cat /sys/power/mem_sleep
。我有:s2idle [deep]
standby
- 开机挂起(如果支持)freeze
- 暂停至空闲 (STI)disk
- 挂起到磁盘 (STD)、休眠.这——你想要。
然后我们需要检查cat /sys/power/disk
。如果有的话disabled
,请深入 BIOS 寻找安全启动 - 这是我唯一能提供的想法,也是我知道的唯一可能干扰并关闭休眠的东西。虽然我只知道安全启动,但可能还有其他干扰,所以即使你没有任何“安全启动”,查看你的 BIOS 也是一个好主意。
在这里阅读:
老实说,即使你的内核不支持休眠,你也可以尝试另一种方式,向下滚动到部分Interfaces
。
阅读此文 - 警告和问题 - 没有 BTRFS
不分先后顺序:
- 并非所有芯片组都能工作(我没有可以在此引用的来源,因此我们假设这是传闻)
- VAIO 有问题,据说有一个标志可以解决这些问题
- 安全启动通常被认为会干扰或关闭休眠模式
- 即使处于休眠状态,局域网唤醒也会消耗电量
- 在系统从休眠状态正常恢复之前,可能会初始化许多模块(尤其是图形模块)-这通常是恢复时黑屏的原因。查看 ArchLinux Wiki 以获取有关如何调试问题的提示。我还建议查看有关休眠问题的 Ubuntu FAQ。浏览 Launchpad 错误也可能产生结果。如果我没记错的话,有一个核参数指定恢复前的延迟(以秒为单位)。
- 不同 Polkit 版本的休眠允许程序有所不同
不要使用 BTRFS 和休眠模式:这将导致数据损坏。
我想休眠 - 交换分区
在某些情况下,人们会放弃交换文件并返回交换分区。毕竟,它在之前的 LTS 上是有效的。我没有尝试过,所以不会提供建议。
我想休眠 - 使用交换文件
- 确保那里有足够的空间。Ubuntu 交换常见问题解答告诉您需要多少,上面的命令也可以。如果您需要更多信息,请提出另一个问题,因为这是一个很长的话题。
- 增加交换文件或创建一个足够大的新文件(首选,我同意@muru) 并将 更改为
/etc/fstab
新的。重新启动以查看更改是否正确(存储 的备份,fstab
以便您可以轻松地恢复以防万一。 - 使用适当的参数将你的内核指向此处,以便它知道从哪里恢复。
- 更新/重新配置您的引导加载程序并重新启动。
需要新的交换文件
sudo
需要。我的情况是这样的。对于 Ubuntu 22,我使用了 29GB,因为我使用的这台笔记本电脑有 24 个 RAM(每Ubuntu 交换常见问题解答)命令来源于https://ploi.io/documentation/server/change-swap-size-in-ubuntu
- 关闭所有正在运行的交换进程:
swapoff -a
- 调整交换大小
fallocate -l 1G /swapfile
(将 1G 更改为您想要的千兆字节大小) - CHMOD 交换:
chmod 600 /swapfile
- 使文件可用作
swap mkswap /swapfile
- 激活交换文件
swapon /swapfile
内核参数?可怕!
仔细阅读并决定是否要这样做,但这只是配置内核的一种方法。通过systemd
和休眠可能更容易uswsusp
(参见接口,见下文)。可能您(和我一样)最终会决定挂起到 RAM 就足够了,并且您不想在交换文件上占用 32GB 的空间(例如,对于笔记本电脑中只有一个 SSD 的人来说,这不是什么好事)。但!
- 休眠到交换文件需要
resume=
知道交换文件位于哪个分区以及resume_offset=
知道从交换文件的位置开始恢复。 - 休眠到分区需要
resume=
指向交换分区。 - 解决黑屏问题很可能需要
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。对于休眠到文件 - 提供可以找到文件的分区。root
fstab
/dev/sdaX
UUID
例如,在分区/swapfile
上/
:
df -h
列出分区并找到挂载点所在的分区/
。文件系统列有/dev/nvme0n1p2
blkid
给了我它的 UUID(EFI 和一个分区,这样我就可以像这样运行)。对于有多个分区的人:blkid /dev/nvme0n1p2
。我们将此字符串称为:X。sudo filefrag -v /swapfile
找到物理偏移下的第一个数字,我们将这个数字称为:Y。sudo vim /etc/default/grub
- 找到带有 的行GRUB_CMDLINE_LINUX_DEFAULT
,导航到其末尾并添加参数。如果它们在那里,您的问题可能是它们的正确性或其他问题。
GRUB_CMDLINE_LINUX_DEFAULT="安静启动恢复=UUID=X resume_offset=Y"
编辑完成后:sudo update-grub && reboot now
阅读:
- https://www.kernel.org/doc/Documentation/admin-guide/kernel-parameters.txt
- https://wiki.archlinux.org/index.php/Kernel_parameters
- 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/disk
有disabled
。日志显示“无法通过 logind 休眠系统:不支持睡眠动词”。
解决方案:搜索您的 BIOS 并找到有问题的东西。将其关闭。
解决方案2:尝试另一个休眠接口。
看:如何在 16.04.1 中激活休眠模式?(systemd)。
接口
- swsusp - 低级内核接口。请参阅先决条件 - 内核以了解哪些文件。直接写入文件可能会导致暂停(写入 RAM、写入磁盘和混合)。根据 SwapFAQ,休眠到文件存在问题。
- uswsusp -维基百科和Debian 维基和很好的 AskUbuntu 问题,并附有如何使用它的文章。
- systemd-系统ArchWiki 上对此
- 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
没有工作,否则,表示它工作正常。