如何在 Ubuntu 16.04 上休眠?

Mah*_*yar 116 hibernate 16.04

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

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

Zan*_*nna 80

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

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

第一次尝试:

sudo systemctl hibernate
Run Code Online (Sandbox Code Playgroud)

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

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

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

找到您的交换分区:

grep swap /etc/fstab
Run Code Online (Sandbox Code Playgroud)

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

# swap was on /dev/mmcblk0p3 during installation
Run Code Online (Sandbox Code Playgroud)

/dev/mmcblk0p3要指定的分区在哪里

添加启动参数:

sudoedit /etc/default/grub
Run Code Online (Sandbox Code Playgroud)

在开始的行中GRUB_CMDLINE_LINUX_DEFAULT添加resume=/dev/YourSwapPartition到引号中的部分(替换为您之前确定的分区)。使用我的例子:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash resume=/dev/mmcblk0p3" 
Run Code Online (Sandbox Code Playgroud)

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

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

sudo systemctl hibernate
Run Code Online (Sandbox Code Playgroud)

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

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

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

设置更多引导参数以捕获更多信息。删除quietandsplash并添加initcall_debugandno_console_suspend这将导致 init 系统调用被打印到控制台,以便您可以观察出了什么问题。我设置了这个:

GRUB_CMDLINE_LINUX_DEFAULT="resume=/dev/mmcblk0p3 no_console_suspend initcall_debug"
Run Code Online (Sandbox Code Playgroud)

这帮助我了解从休眠状态恢复时出了什么问题。您也可以尝试使用dmesg.

在我的情况下,恢复后,我失去了WiFi和内核显然被打乱,因为大多数命令(例如读取来自什么/sys,重装模块或任何systemctl命令)是行不通的-过程似乎开始只是挂(这一切都将是当然重启后恢复正常)。看着系统非常缓慢地关闭并阅读所有调试消息,我注意到“brcm”有很多问题,所以我猜我的Broadcom无线驱动程序模块是罪魁祸首。果然,我调整了我的休眠程序以先卸载模块:

sudo modprobe -r brcmfmac
sudo systemctl hibernate
Run Code Online (Sandbox Code Playgroud)

在恢复我重新插入模块

sudo modprobe brcmfmac
Run Code Online (Sandbox Code Playgroud)

一切都完美无缺。我还必须将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:            
   .... 
Run Code Online (Sandbox Code Playgroud)

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

GRUB_CMDLINE_LINUX_DEFAULT="no_console_suspend initcall_debug resume=/dev/mmcblk1p2 resume_offset=34816"
Run Code Online (Sandbox Code Playgroud)

/dev/mmcblk1p2我的根分区在哪里(你的更可能是类似的/dev/sda2)。

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

sudo systemctl hibernate
Run Code Online (Sandbox Code Playgroud)

当我想休眠时,我运行sudo bash script. 这很好用。


TL; 博士

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


小智 66

您可以使用

sudo pm-hibernate 
Run Code Online (Sandbox Code Playgroud)

检查休眠是否在您的系统上工作(这将使您的计算机休眠)。

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

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

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

它用一个空文件打开 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
Run Code Online (Sandbox Code Playgroud)

然后保存更改并关闭 nano 并重新启动系统以使休眠可用出现在“电源选项”中。

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

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

  • 'sudo pm-hibernate' 在没有警告的情况下立即杀死了我的系统。你应该告诉人们这就是将要发生的事情。 (23认同)

Anw*_*war 21

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

检查事项

从我自己的测试中,我至少发现了一项您应该执行的额外检查。我还没有在互联网上的任何地方找到它。

这里有一些检查——

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

    sudo apt-get purge btrfs-tools
    
    Run Code Online (Sandbox Code Playgroud)

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

  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
    
    Run Code Online (Sandbox Code Playgroud)
  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
    
    Run Code Online (Sandbox Code Playgroud)
  3. Ctrl-保存文件O。退出Ctrl-X

  4. 重启polkitd守护进程

    sudo systemctl restart polkitd.service
    
    Run Code Online (Sandbox Code Playgroud)

它应该启用休眠。

  • 谢谢,安华。我提交了 [bug #1619846](https://launchpad.net/bugs/1619846) 并在上面提到了你的答案。您是否有机会在官方文档中对该页面提出更准确的更改/添加? (2认同)

Mar*_*arc 8

安全启动

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

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

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

Failed to hibernate system via logind: Sleep verb not supported
Run Code Online (Sandbox Code Playgroud)

事实证明,安全启动是罪魁祸首:安装 16.04 你被问到你想用它做什么(据我所知,这是一个新事物),我没有考虑太多就把它保持在 ON 状态。

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

 [disabled]
Run Code Online (Sandbox Code Playgroud)

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

 [platform] shutdown reboot suspend 
Run Code Online (Sandbox Code Playgroud)

哪个看起来更好。并且确实调用会systemctl hibernate导致成功的休眠/解冻序列。

此外,在那之后,我可以在图形界面的各个位置看到休眠作为一个选项,而无需任何polkit黑客攻击。所以似乎systemd实际上是在猜测/sys/power/disk系统无法休眠。


SaT*_*aTa 7

尝试将系统置于休眠状态(将 RAM 写入磁盘的深度睡眠),生成以下错误

$ sudo systemctl hibernate
Failed to hibernate system via logind: Sleep verb not supported
Run Code Online (Sandbox Code Playgroud)

以下步骤解决了该问题(在 Thinkpad X1 Carbon 7th Gen、Ubuntu 19.10 上测试)。大部分都是从这里借来的。

  1. 在 BIOS 中关闭安全启动。
  2. 在 BIOS 中将“睡眠状态”设置为 Linux。这个选项最初在我的 BIOS 中被命名为“现代待机”,如果关闭我必须关闭,但在 BIOS 名称之后,名称更改为“睡眠状态”。
  3. 创建一个等于或大于 RAM 的交换文件。这里涉及几个步骤,如下所示。

    一种。关闭交换。

    $  sudo swapoff -a
    
    Run Code Online (Sandbox Code Playgroud)

    湾 创建一个大于或等于 RAM 的文件。我的是 16GB,所以:

    $ sudo dd if=/dev/zero of=/swapfile bs=1G count=16
    
    16+0 records in
    16+0 records out
    17179869184 bytes (17 GB, 16 GiB) copied, 19.3685 s, 887 MB/s
    
    Run Code Online (Sandbox Code Playgroud)

    C。为文件设置正确的权限:

    $ sudo chmod 600 /swapfile
    
    Run Code Online (Sandbox Code Playgroud)

    d. 将文件设为交换:

    $ sudo mkswap /swapfile
    
    Setting up swapspace version 1, size = 16 GiB (17179865088 bytes)
    no label, UUID=3b2e6f0c-ce12-4a84-9044-d99bfba059ea
    
    Run Code Online (Sandbox Code Playgroud)

    e. 打开交换并检查它是否设置正确:

    $ sudo swapon /swapfile
    $ cat /proc/swaps
    
    Filename                Type        Size    Used    Priority
    /swapfile                               file        16777212    0   -2
    
    Run Code Online (Sandbox Code Playgroud)

    F。为了在重启后加载交换,我们必须将它添加到/etc/fstab. 因此运行以下命令打开文件:

    $ sudo gedit /etc/fstab
    
    Run Code Online (Sandbox Code Playgroud)

    并通过添加如下所示的最后一行来更新它。请注意,我还评论了我的原始交换,因为我不需要它。

    /dev/mapper/vgubuntu-root /               ext4    errors=remount-ro 0       1
    # /boot was on /dev/nvme0n1p2 during installation
    UUID=d265e7c4-1a4f-49c4-af29-fea2543490d7 /boot           ext4    defaults        0       2
    # /boot/efi was on /dev/nvme0n1p1 during installation
    UUID=0004-FB5F  /boot/efi       vfat    umask=0077      0       1
    #/dev/mapper/vgubuntu-swap_1 none            swap    sw              0       0
    /swapfile       none    swap    sw      0       0
    
    Run Code Online (Sandbox Code Playgroud)

    G。重新启动并运行此命令以查看交换是否显示:

    cat /proc/swaps
    
    Filename                Type        Size    Used    Priority
    /swapfile                               file        16777212    0   -2
    
    Run Code Online (Sandbox Code Playgroud)
  4. 现在,是时候更新 grub 了。一种。运行以下命令打开 grub:

    $ sudoedit /etc/default/grub
    
    Run Code Online (Sandbox Code Playgroud)

    湾 通过运行以下命令查找安装 root 的位置。

    $ mount | grep " / "
    
    /dev/mapper/vgubuntu-root on / type ext4 (rw,relatime,errors=remount-ro)
    
    Run Code Online (Sandbox Code Playgroud)

    C。所以心安理得/dev/mapper/vgubuntu-root。运行以下命令查找此位置的 UUID:

    $ sudo blkid
    /dev/mapper/nvme0n1p3_crypt: UUID="AZrE57-dlNc-BiUr-RrTF-SdT2-luVK-vrliNq" TYPE="LVM2_member"
    /dev/mapper/vgubuntu-root: UUID="2331fe68-3e7a-4937-9cfa-74fc7a4b79f6" TYPE="ext4"
    /dev/nvme0n1p1: UUID="0004-FB5F" TYPE="vfat" PARTLABEL="EFI System Partition" PARTUUID="09813156-6b7a-4fc2-b644-a8c6b7d40abf"
    /dev/nvme0n1p2: UUID="d265e7c4-1a4f-49c4-af29-fea2543490d7" TYPE="ext4" PARTUUID="64f5da2f-71d3-4f02-9b1e-3e12d7f6c445"
    /dev/nvme0n1p3: UUID="201acba5-ff20-46ee-9000-34efefef3fbe" TYPE="crypto_LUKS" PARTUUID="16858e70-eb08-4de8-b944-50689cad9d9f"
    /dev/sda1: LABEL="ST64GB" UUID="624AB7B308FE9F38" TYPE="ntfs" PTTYPE="dos"
    /dev/mapper/vgubuntu-swap_1: UUID="af3b29a2-ba6b-44de-89dd-072f4233aaf9" TYPE="swap"
    
    
    Run Code Online (Sandbox Code Playgroud)

    在这种情况下,UUID 是2331fe68-3e7a-4937-9cfa-74fc7a4b79f6. 保留此 UUID。d. 接下来,我们需要找到交换文件的偏移量。运行此命令:

    $ sudo filefrag -v /swapfile
    
    Filesystem type is: ef53
    File size of /swapfile is 17179869184 (4194304 blocks of 4096 bytes)
    ext:     logical_offset:        physical_offset: length:   expected: flags:
      0:        0..   32767:     835584..    868351:  32768:            
      1:    32768..   49151:     868352..    884735:  16384:            
      2:    49152..   81919:     886784..    919551:  32768:  
      ...
    
    Run Code Online (Sandbox Code Playgroud)

    我们寻找第一个块的 pysical_offset。在上述情况下,它将是835584。也保留这个号码。e. 我们现在需要更新 grub。运行以下命令:

    $ sudoedit /etc/default/grub
    
    Run Code Online (Sandbox Code Playgroud)

    更新以下内容。我们更新GRUB_CMDLINE_LINUX_DEFAULT并添加GRUB_RECORDFAIL_TIMEOUT=0.

    # If you change this file, run 'update-grub' afterwards to update
    # /boot/grub/grub.cfg.
    # For full documentation of the options in this file, see:
    #   info -f grub -n 'Simple configuration'
    
    GRUB_DEFAULT=0
    GRUB_TIMEOUT_STYLE=hidden
    GRUB_TIMEOUT=0
    GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
    GRUB_CMDLINE_LINUX_DEFAULT="quiet splash resume=UUID=2331fe68-3e7a-4937-9cfa-74fc7a4b79f6 resume_offset=835584"
    GRUB_CMDLINE_LINUX=""
    
    # Avoiding grub to show up in boot when resuming from hibernation
    GRUB_RECORDFAIL_TIMEOUT=0
    
    Run Code Online (Sandbox Code Playgroud)

    F。更新 grub 文件后,运行以下命令:

    $ sudo update-grub
    
    Run Code Online (Sandbox Code Playgroud)

应该是这样。现在您可以通过运行使系统进入休眠状态

$ sudo systemctl hibernate
Run Code Online (Sandbox Code Playgroud)


Aip*_*hee 6

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


小智 6

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

  1. sudo apt install hibernate 它将安装休眠和休眠所需的其他依赖项
  2. grep swap /etc/fstab (指 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
Run Code Online (Sandbox Code Playgroud)

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

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


fgb*_*ist 5

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

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

  2. 查找这些部分(它们彼此相邻):

    [upower 中默认禁用休眠] Identity=unix-user:* Action=org.freedesktop.upower.hibernate ResultActive=no

    [logind 中默认禁用休眠] Identity=unix-user:* Action=org.freedesktop.login1.hibernate;org.freedesktop.login1.handle-hibernate-key; 结果有效=否

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

  4. Ctrl + O保存文件。
  5. 重新启动计算机
  6. 现在,您的电源菜单中提供了“休眠”选项。

编辑:Gunnar 指出,如果某个包被更新,这个文件就会被覆盖,所以根据你的意图,它很可能不是最好的解决方案。

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


kel*_*ove 3

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

您的机器应该休眠。休眠后唤醒您的机器,观察其是否行为异常或是否正常。如果您在休眠后出现任何异常情况,建议您不要继续执行以下操作。但是,如果它工作正常,请通过执行以下操作继续激活休眠状态:

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

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

[Re-enable hibernation]
Identity=unix-user:*
Action=org.freedesktop.upower.hibernate
ResultActive=yes
Run Code Online (Sandbox Code Playgroud)

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


Moo*_*key 2

您必须花费一点力气手动启用它。默认情况下它已被禁用。

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

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

  • 答案是指14.04,而问题是关于16.04。 (2认同)