如何在Ubuntu 16.04上休眠?


86

我应该如何成功休眠Ubuntu 16.04?

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



sudo pm-hibernate工作吗?
飞行员

2
systemd的情况没有改变吗?现在我们应该使用,systemctl hibernate所以也许不应该使用重复...或者至少需要更新后的答案才能使旧问题有效以重复
Zanna

您正在运行什么内核版本?输入uname -r终端(道歉,如果你已经知道这一点)。
WinEunuuchs2Unix

编辑您的问题并添加的输出, free 以便我们确定您是否有足够的交换设置成功休眠。
年长者极客

Answers:


62

休眠使用systemctl并使其在困难的情况下正常工作

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

第一次尝试:

sudo systemctl hibernate

如果失败,则开始进行故障排除:在休眠状态(HTD或ACPI S4)中,将计算机状态写入磁盘,因此无需电源即可保留它。状态被写入交换分区或交换文件。注意:如果使用BTRFS,请勿尝试使用交换文件,因为这可能会导致文件系统损坏

你的交换分区或交换文件可能需要大小为RAM,让冬眠一样,但你将能够冬眠,如果它是至少2/5的RAM大小一个很好的机会,根据拱门wiki页面,因此请先尝试其他步骤,然后再增加交换大小。

如果您的问题是干净启动而不是预期的恢复,则最有可能需要设置启动参数来查找磁盘映像。

找到您的交换分区:

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="quiet splash resume=/dev/mmcblk0p3" 

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

现在您需要重新启动。然后,您可以通过发出以下命令尝试休眠:

sudo systemctl hibernate

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

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

我包括我的情况之下作为一个例子,但在调试S状态都可以找到详细的信息,在这个博客也这一个

设置更多启动参数以捕获更多信息。删除quietsplash添加initcall_debugno_console_suspend这将导致初始化系统调用将被打印到控制台上,所以你可以看什么错误。我设置这个:

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

这帮助我了解了从休眠状态恢复后出了什么问题。

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

sudo modprobe -r brcmfmac
sudo systemctl hibernate

在恢复我重新插入模块

sudo modprobe brcmfmac

一切工作正常。我还必须将btsdio似乎与之不兼容的模块列入黑名单brcmfmac


更新:在17.04上使用交换文件进行休眠。

在Arch Wiki页面的帮助下,再次进行了一些其他修改,我设法通过一个交换文件使休眠状态在17.04上工作。这需要一个附加的引导参数,resume_offset=n其中n是以下physical_offset输出中的第一个数字sudo filefrag -v /swapfile

$ 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,但是如果没有这些模块,系统将很快变得无法使用。因此,我制作了一种脚本来卸载有问题的模块,并在恢复时立即将它们重新插入:

# 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

当我想冬眠时,我跑步sudo bash script。这很好。


TL; DR

使用systemd,为从交换中恢复设置引导参数,识别有问题的驱动程序并在启动休眠模式之前将其卸载。如果没有这些模块,系统无法长期运行,或者您需要卸载其中的几个模块,则使用简单的脚本启动休眠状态可能会更容易。


该信息来自哪里,那2/5的RAM大小可能足够,在什么情况下?我在Gnome中有一个用户选项“休眠”,它似乎确实处于休眠状态,但是在唤醒时,它无法正常工作。我有一个8GB和32GB RAM的交换分区。那不是2/5,但是在创建32GB交换文件(或分区)之前,很高兴知道这一点。
cslotty

@cslotty我从Arch维基IIRC那里获得了这些信息-请让我知道是否可以进行管理
Zanna 2016年

谢谢,@ Zanna。我发现它实际上并不是我想要的冬眠状态,而是暂停(S3 / STR)-很抱歉。
cslotty

@cslotty一点也不担心。在那种情况下,交换不是您的问题,因为它不相关。
Zanna

1
谢谢,我需要对此答案进行综合,并提供有关禁用SecureBoot使其最终运行的提示。
oligofren

62

您可以使用

sudo pm-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可用出现在“电源选项”上。

参考:如何休眠计算机?在Ubuntu 16.04的官方文档中。

希望它能工作。在尝试了所有其他选择之后,这对我有用。


编辑文件后,需要重新启动以使Hibernate出现在“电源选项”上。
Jus12

21
'sudo pm-hibernate'立即在没有警告的情况下杀死了我的系统。您应该告诉人们这将要发生。
Yair Daon

最佳答案 。这也适用于17.4和17.10。
Saurabh Bhandari

1
这个答案与告诉将“ resume =”添加到GRUB_CMDLINE_LINUX_DEFAULT的答案的结合确实为我解决了问题-谢谢!
克里斯多夫(Christoph)

我的交换分区中有17GB,RAM中有16GB,为什么它不起作用?它似乎处于休眠状态,因为它需要花费很长时间才能关闭计算机,而如果我执行“关机”,则几乎立即将其关闭。但是,当我重新打开计算机电源时,所有设备都关闭了,我必须重新开始。那根本没有冬眠。为什么它不能像Windows一样简单?如果有人对如何使它正确休眠有任何想法,我希望获得帮助。
user1271772 '18

20

我认为,如Ubuntu Wiki中所述,如何为16.04答案启用休眠模式是众所周知的(如果需要这些步骤,请参见下文)。但是我认为需要检查的东西并不彻底。至少,这就是我发现的。

检查事项

通过我自己的测试,我至少发现了您应该执行的另一项检查。我在Internet的任何地方都找不到它。

这是一些检查-

  1. 检查您是否没有使用任何btrfs分区。是的。通过测试,我发现如果您具有btrfs分区,则休眠将无法工作。删除或更改分区类型对ext4我没有帮助。我需要删除btrfs-tools包装。

    sudo apt-get purge btrfs-tools
    

    您可能要检查未经过良好测试的其他新分区类型。在不删除软件包的情况下,将驱动程序列入黑名单也可能有效,但是我尚未对此进行测试。

  2. 另外,您还需要检查交换分区的大小足以容纳RAM的内容。如果您的RAM为4 GB,那么交换空间至少应为4 GB(为安全起见,您应该再分配几MB)。

启用休眠的步骤

它涉及这些步骤

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

    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. Ctrl- 保存文件O。退出Ctrl-X

  4. 重新启动polkitd守护程序

    sudo systemctl restart polkitd.service
    

它应该启用休眠模式。


2
谢谢,安瓦尔。我提交了错误#1619846,并在上面提到了您的答案。您是否有机会在官方文档中对该页面提出更确切的更改/补充?
Gunnar Hjalmarsson '16

1
@GunnarHjalmarsson我建议提出此警告。但是,我需要更多的测试人员来验证这一点。稍后会让您知道
Anwar

好吧,让我们再谈谈。
Gunnar Hjalmarsson's

我已安装在btrfs分区上,并btrfs-tools根据您的说明进行了清除。仍然无法休眠。
Oxwivi

1
在磁盘上,只有vfatUEFI和btrfsswap。我实际上怀疑这是由于硬件(AMD笔记本电脑)引起的。我将使用btrfs在另一个系统上对此进行测试,然后再回头给您。
Oxwivi

7

安全启动

(我问了一个类似的问题,要求关注基于系统的答复,在这里向关注此问题的人分享我的解决方案)

该解决方案来自Fedora主题(他们在不久前切换到systemd,因此在那里有更多资料)。

在我的情况下(将新的16.04.1安装在始终支持休眠的计算机上),调用过时sudo pm-hibernate似乎没有任何作用,而最新的systemd方法systemctl hibernate将返回:

Failed to hibernate system via logind: Sleep verb not supported

事实证明,安全启动才是罪魁祸首:安装16.04时,系统会询问您要对其进行什么操作(就我所记得这是新事物),并且我一直在不加思索的情况下将其保持打开状态。

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

 [disabled]

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

 [platform] shutdown reboot suspend 

看起来更好。实际上,调用会systemctl hibernate导致成功的休眠/解冻序列。

此外,在那之后,我可以看到在图形界面的各个位置都可以使用休眠选项,而无需进行任何改动polkit。因此,似乎systemd实际上是在猜测/sys/power/disk系统无法休眠。


我完全按照您在这里所做的解释进行了操作。但是,在我执行“ systemctl hibernate”命令后,屏幕变黑了3秒钟,然后桌面又恢复了所有打开的程序,就像执行该命令之前一样。当我执行命令“ cat / sys / power / disk” ...时,它向我显示了以下文本:“ [platform] shutdown reboot重新挂起test_resume”,它与从侧面执行相同命令但最后一个文本时的结果类似:“ test_resume”。您有什么想法可以解决我的问题吗?
foxhard

不太确定,休眠似乎无法在您的硬件上立即可用,这就是为什么正如其他人指出的那样默认情况下禁用它的原因。您可能要针对您的特定问题提出一个单独的问题。
马克

对我来说只有一半的工作。冬眠,但没有从冬眠中醒来,而是进入正常引导,然后永久卡住,直到硬性物理关机为止。
马特

6

该说明适用于我的Ubuntu 18.04安装。

  1. sudo apt install hibernate 它将安装休眠和休眠所需的其他依赖项
  2. grep swap /etc/fstab (fing UUID)
  3. sudoedit /etc/default/grub 在GRUB_CMDLINE_LINUX_DEFAULT =“ quiet splash”行中,添加交换的UUID。该行如下所示:GRUB_CMDLINE_LINUX_DEFAULT =“ quiet splash resume = UUID of swap”
  4. sudo update-grub
  5. 重新启动,然后重新启动sudo systemctl hibernate。如果一切正常,请添加菜单项。
  6. 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

复制自https://askubuntu.com/a/819891/712203

  1. 重新启动电脑
  2. 安装https://extensions.gnome.org/extension/755/hibernate-status-button/

1
而不是添加固定值以/etc/default/grub考虑使用更新initramfs update-initramfs -u -k all并查找类似的消息The initramfs will attempt to resume from /dev/dm-0。这将自动设置恢复设备。
ukos

谢谢,在Ubuntu 18.04上完美运行!请注意,如果是第一次使用gnome扩展程序,则需要安装浏览器扩展程序和连接器。在顶部的扩展链接中对此进行了说明。
Karim Sonbol

4

根据我对kelvinelove的回答的评论,他建议编辑的文件在我的系统上不存在(新的Ubuntu 16.04)。相反,我这样做:

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

  2. 查找以下部分(它们彼此正确):

    [默认情况下禁用上层休眠模式] Identity = unix-user:* Action = org.freedesktop.upower.hibernate ResultActive = no

    [默认情况下在登录时禁用休眠] Identity = unix用户:* Action = org.freedesktop.login1.hibernate; org.freedesktop.login1.handle-hibernate-key; ResultActive =否

  3. 两者都将ResultActive = no更改为ResultActive = yes

  4. Ctrl + O保存文件。
  5. 重新启动电脑
  6. 休眠选项现在在你的权力菜单中可用。

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

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


/etc默认情况下,不应存在其中的文件。这是您创建的配置文件。如您上面建议的那样,编辑程序包拥有的文件是一个不明智的建议,因为在下次程序包更新时它将被覆盖。
Gunnar Hjalmarsson

@GunnarHjalmarsson如果是这种情况,我认为应该指出它可能不存在。我希望获得比“复制/粘贴此命令”->“键入此”样式风格的答案更多的评价最高的Ask Ubuntu答案,而这种答案缺乏任何形式的验证来验证您是否在做正确的事情(而不是检查它是否有效) 。如果有人在几年内找到了答案,但又害怕尝试,因为文件为空,怎么办?说明中明确指出要添加到文件,暗示文件存在,该怎么办?尽管如此,我还是很感谢您所提供的信息,可以将其添加到答案中以供完成。
fgblomqvist

1
有道理; 我用这个说明编辑了NirajW的答案。应该注意的是,此页面上的原始信息源是关于创建的
Gunnar Hjalmarsson '16

这是完美的,您救了我兄弟:)
Azam Alvi '18

4

对我来说,它可以安装hibernate软件包,重新启动然后运行sudo hibernate-disk。我确定可以将其添加到菜单中,但对我来说不值得。


3

首先,我确实建议您测试计算机是否支持休眠,因为默认情况下禁用休眠的原因是因为有时在某些计算机上会产生不愉快的结果。通过打开终端(Ctrl+ Alt+ T)然后键入以下内容来测试您的机器sudo pm-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

此后,重新启动计算机,然后登录,您应该在电源菜单的右上角设置菜单中看到一个休眠选项。


我有thinkpad -E550,当我的操作系统是ubuntu 15.1或windows8.1时,它没有休眠问题。但是使用ubuntu 16.04时,当我使用命令“ sudo pm-hibernate”时,它不会完全休眠,只是屏幕变黑并且机器仍在开机。
Mahyar's

就我而言,该命令什么也不做。终端转到换行符并等待下一个命令,即上一个命令已执行。但不起任何作用at all
Aalok

这对我不起作用。Ubuntu 16.04。休眠选项不会出现,并在“设置”->“电源”中保持禁用状态,还有其他功能吗?
Daniele Segato

编辑已经存在的策略会更好:zedt.eu/tech/linux/enable-hibernation-xubuntu-16-04
fgblomqvist

中的内容不完整com.ubuntu.enable-hibernate.pkla。请参阅NirajW发布的答案。
Gunnar Hjalmarsson

3

这里有一些很好的资源可以帮助您解决Ubuntu下一些较常见的休眠问题。

就我而言,要在Lenovo u300上运行Ubuntu 16.10,为了使休眠正常工作,我必须执行以下操作:

  • 创建一个适当大小的交换文件(我通常将大小设置为约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是关键。

祝你好运!


grub大小写不敏感吗?为什么要使用RESUME?
尼尔森·冈

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.