我怎样才能在Ubuntu 16.04上hibernate?

我应该如何成功地hibernateUbuntu 16.04?

我已经尝试了几乎所有的网络解决方案,但没有它们实际上是有帮助的。 我发现我的问题几乎与这个完全相似

您可以使用

 sudo pm-hibernate 

检查hibernate是否适用于您的系统( 这将使您的计算机hibernate )。

如果它不起作用,请检查您的交换大小是否至少与RAM一样大。

要将选项添加到设置菜单,您可以创建配置文件。 打开终端窗口并运行以下命令:

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

它用空文件打开nano。 复制下面的行并将它们粘贴到nano窗口中。

 [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 

然后保存更改并关闭nano并重新启动系统以使Hibernate可用于“电源选项”。

参考: 如何hibernate我的电脑? 在Ubuntu 16.04的官方文档中。

希望它有效。 在尝试所有其他选项后,这对我有用。

使用systemctlhibernate并使其在棘手的情况下工作

对我来说, pm-hibernate总是失败。 经过一些调整后,我能够使用systemd(16.04及更高版本的init系统)的界面进行hibernate。 我还设法使用交换文件在17.04上运行它。 本案例研究可能对有问题的其他人有用。

第一次尝试:

 sudo systemctl hibernate 

如果失败,则开始排除故障:在hibernate状态(HTD或ACPI S4)中,机器状态被写入磁盘,因此不需要电源来保护它。 状态被写入交换分区或交换文件。 注意:如果使用BTRFS,请勿尝试使用交换文件,因为这可能会导致文件系统损坏

您的交换分区或交换文件可能需要与RAM相同以允许hibernate,但根据Arch wiki页面 ,如果它至少是RAM大小的2/5,则很有可能可以hibernate。 ,所以在增加交换大小之前先尝试其他步骤。

如果您的问题是您获得了干净启动而不是预期的恢复,那么您至少需要设置启动参数来查找磁盘映像

找到你的交换分区:

 grep swap /etc/fstab 

对我来说这会返回(部分输出)

 # swap was on /dev/mmcblk0p3 during installation 

其中/dev/mmcblk0p3是要指定的分区

添加引导参数:

 sudoedit /etc/default/grub 

在启动GRUB_CMDLINE_LINUX_DEFAULT的行中,将resume=/dev/YourSwapPartition GRUB_CMDLINE_LINUX_DEFAULT添加到引号中的部分(替换为您之前标识的分区)。 用我的例子:

 GRUB_CMDLINE_LINUX_DEFAULT="quiet splash resume=/dev/mmcblk0p3" 

每次更改此文件时,都必须运行sudo update-grub否则更改将无效。

现在你需要重启。 然后你可以通过发出命令来尝试hibernate:

 sudo systemctl hibernate 

要恢复,请按电源按钮,系统将启动。

如果仍有问题,请开始调试。

我在下面以我的案例为例,但可以在本博客中找到有关调试S状态的详细信息。

设置一些更多启动参数以捕获更多信息。 删除quietsplash并添加initcall_debugno_console_suspend ,这将导致将init系统调用打印到控制台,以便您可以查看出错的地方。 我这样设定:

 GRUB_CMDLINE_LINUX_DEFAULT="resume=/dev/mmcblk0p3 no_console_suspend initcall_debug" 

这让我看到了从hibernate状态恢复的问题。

在我的情况下,恢复后我失去了WiFi,内核显然很不高兴,因为大多数命令(例如从/sys读取任何内容,重新加载模块或任何systemctl命令)都不起作用 – 该过程似乎开始并挂起(所有重启后,这将恢复正常)。 看着系统非常缓慢地关闭并读取所有调试消息,我注意到“brcm”存在很多问题,所以我猜测我的Broadcom无线驱动模块应该受到指责。 果然我调整了我的hibernate程序,先卸载模块:

 sudo modprobe -r brcmfmac sudo systemctl hibernate 

在简历上我重新插入模块

 sudo modprobe brcmfmac 

一切都很完美。 我还必须将btsdio模块列入黑名单,这似乎与brcmfmac不兼容


更新:使用17.04上的交换文件进行hibernate。

再一次在Arch wiki页面的帮助和一些额外的修补工作之后,我设法通过交换文件在17.04进行hibernate。 这需要一个额外的引导参数resume_offset=n ,其中n是sudo filefrag -v /swapfile输出中physical_offset下的第一个数字:

 $ sudo filefrag -v /swapfile Filesystem type is: ef53 File size of /swapfile is 1425873920 (348114 blocks of 4096 bytes) ext: logical_offset: physical_offset: length: expected: flags: 0: 0.. 32767: 34816.. 67583: 32768: 1: 32768.. 63487: 67584.. 98303: 30720: .... 

因此,在我的情况下,额外的启动参数是resume_offset=34816 。 您仍然需要为要从中恢复的分区设置引导参数。 这将是根分区(或交换文件所在的任何分区)我的参数现在是:

 GRUB_CMDLINE_LINUX_DEFAULT="no_console_suspend initcall_debug resume=/dev/mmcblk1p2 resume_offset=34816" 

其中/dev/mmcblk1p2是我的根分区(你的更可能是/dev/sda2 )。

在恢复期间,我看到图像加载成功,但在我的情况下(只是一个例子 – YMMVAPD)然后一些更多的驱动程序( i2c_designware )抛出了一些错误,我在恢复时得到了一个完整的系统冻结。 如果我除了brcmfmac之外卸载这些模块,hibernatebrcmfmac ,但是如果没有这些模块,系统很快就会变得无法使用。 因此我制作了一种脚本来卸载有问题的模块并立即将它们重新插入简历:

 # remove buggy modules modprobe -r brcmfmac i2c_designware_platform i2c_designware_core && # hibernate echo disk > /sys/power/state # reinsert modprobe i2c_designware_core i2c_designware_platform brcmfmac 

当我想要hibernate时,我运行sudo bash script 。 这很好用。


TL; DR

使用systemd,为swap恢复设置启动参数,识别错误的驱动程序并在启动hibernate之前卸载它们。 如果系统在没有这些模块的情况下无法长时间工作,或者您需要卸载多个模块,则使用简单的脚本启动hibernate可能更容易。

我认为,如何在Ubuntu Wiki中描述如何为16.04答案启用hibernate(如果你需要这些步骤,请参见下文)。 但我认为需要检查的事情并不彻底。 至少,这就是我发现的。

要检查的事情

根据我自己的测试,我至少找到了一个你应该执行的额外检查。 我还没有在互联网上的任何地方找到它。

这是一些检查 –

  1. 检查您是否使用了任何btrfs分区。 是的 从我的测试中,我发现如果你有btrfs分区,hibernate将无法正常工作。 删除或更改分区类型为ext4并没有帮助我。 我需要删除btrfs-tools包。

     sudo apt-get purge btrfs-tools 

    您可能想要检查未经过良好测试的其他新分区类型。 如果不删除软件包,将驱动程序列入黑名单也可能有效,但我还没有测试过。

  2. 此外,您需要检查是否有足够大的交换分区来容纳RAM的内容。 如果您的RAM是4 GB,则交换应至少为4 GB(您应该分配更多的MB以确保安全)。

启用hibernate的步骤

它涉及这些步骤

  1. /etc/polkit-1/localauthority/50-local.d/enable-hibernate.pkla以root身份创建文件

     sudo -i nano /etc/polkit-1/localauthority/50-local.d/enable-hibernate.pkla 
  2. 将这些内容放在该文件上

     [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 
  3. CtrlO保存文件。 使用CtrlX退出

  4. 重新启动polkitd守护程序

     sudo systemctl restart polkitd.service 

它应该启用hibernate。

安全启动

(我问了一个类似的问题,要求关注基于systemd的回复,在这里为这个问题的人分享我的解决方案)

这个解决方案来自Fedora主题(他们刚刚转向systemd,所以那里有更多的材料)。

在我的情况下(在一台始终支持hibernate的机器上安装新的16.04.1),调用过时的sudo pm-hibernate似乎没有做任何事情,并且最新的systemd方法, systemctl hibernate将返回:

 Failed to hibernate system via logind: Sleep verb not supported 

事实certificate,安全启动是罪魁祸首:安装16.04你被问到你想用它做什么(据我记忆这是一个新事物)并且我保持开启而没有多想。

在安全启动ON的机器上, cat /sys/power/disk回答:

  [disabled] 

重新启动并在BIOS设置中禁用安全启动(这些是特定于机器的,但通常非常简单)我尝试了一个cat /sys/power/disk并得到:

  [platform] shutdown reboot suspend 

看起来更好。 确实调用systemctl hibernate导致成功的hibernate/解冻序列。

此外,之后我可以在图形界面的各个位置看到可用作hibernate的hibernate,而不需要任何polkit hack。 所以似乎systemd实际上是从/sys/power/disk猜测系统无法hibernate。

首先,我建议您测试您的计算机是否支持hibernate,因为默认情况下禁用hibernate的原因是因为它有时会在某些计算机上产生令人不快的结果。 打开终端( Ctrl + Alt + T ),然后输入sudo pm-hibernate来测试你的机器

你的机器应该hibernate。 hibernate后唤醒机器并观察其是否行为exception或是否正常。 如果您在hibernate后遇到任何exception,我建议您不要继续以下步骤。 但是,如果它工作正常,请继续通过执行以下操作激活hibernate:

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

编辑打开的文件并添加以下行:

 [Re-enable hibernation] Identity=unix-user:* Action=org.freedesktop.upower.hibernate ResultActive=yes 

在此之后,重新启动计算机,登录后,您应该会在右上角设置角的电源菜单上看到添加了hibernate选项。

扩展我自己对kelvinelove的答案的评论,他建议编辑的文件在我的系统上不存在(新的Ubuntu 16.04)。 相反,我这样做了:

  1. sudo nano /var/lib/polkit-1/localauthority/10-vendor.d/com.ubuntu.desktop.pkla

  2. 寻找这些部分(它们彼此正确):

    [默认情况下在upower中禁用hibernate] Identity = unix-user:* Action = org.freedesktop.upower.hibernate ResultActive = no

    [在logind中默认禁用hibernate] Identity = unix-user:* Action = org.freedesktop.login1.hibernate; org.freedesktop.login1.handle-hibernate-key; ResultActive =无

  3. 对于这两者,将ResultActive = no更改为ResultActive = yes

  4. Ctrl + O保存文件。
  5. 重新启动计算机
  6. Hibernate选项现在可在电源菜单中使用。

编辑:Gunnar指出,如果某个软件包更新,该文件会被覆盖,因此根据您的意图,它很可能不是最佳解决方案。

资料来源: http : //www.zedt.eu/tech/linux/enable-hibernation-xubuntu-16-04/

这里有一些非常好的资源可以帮助你解决Ubuntu下一些比较常见的hibernate问题。

在我的例子中,在联想u300s上运行Ubuntu 16.10,为了让hibernate正常工作,我必须执行以下操作:

  • 创建一个适当大小的交换文件(我通常设置为大约1倍,但我听说高达1.6倍和2倍)
  • 编辑/etc/default/grub以包含以下行:

    GRUB_CMDLINE_LINUX_DEFAULT =“splash quiet pci = nomsi RESUME = UUID = 92781adb-f2a6-4f15-88fc-e1ce801291dd”

RESUME引用您的特定交换文件UUID。 特别是,在我的机器上设置pci=nomsi是关键。

祝你好运!

对我来说,它适用于安装hibernate包,重启然后运行sudo hibernate-disk 。 我确信可以将它添加到菜单中,但对我来说不值得。

您只需稍加努力即可手动启用它。 它默认被禁用。

http://ubuntuhandbook.org/index.php/2014/04/enable-hibernate-ubuntu-14-04/

然后,如果它不起作用,它可能是4.4.0内核问题,您可能必须升级内核。