当前位置: 首页>>技术问答>>正文


如何在默认情况下使用pm-suspend-hybrid而不是pm-suspend?

, ,

问题描述

我想在关闭盖子或从菜单中选择”Suspend”时使用混合挂起方法而不是挂起。

我可以想象更改pm-suspend脚本以自动执行此操作,但可能有更可维护/更简单的方法。

最佳解决办法

间接混合睡眠

这是较旧的方法:首先暂停,然后在延迟(默认为15分钟)后唤醒休眠。在3.6之前的Linux内核中使用它,或者如果你喜欢它,它在15分钟后不再使用任何电源。

添加文件/etc/pm/config.d/00-use-suspend-hybrid

# Always use suspend_hybrid instead of suspend
if [ "$METHOD" = "suspend" ]; then
  METHOD=suspend_hybrid
fi
# The delay after which hibernation gets triggered (default: 900 seconds, 15 minutes):
PM_HIBERNATE_DELAY=900

You might want to make sure that the hybrid method is supported on your system via the following code. If it says “0” it should work:

sudo pm-is-supported --suspend-hybrid && echo $? 

真正的混合使用Linux 3.6+暂停

如果您有Linux 3.6内核,则可以使用以下内容,它将从头开始挂起到磁盘和RAM。

添加文件/etc/pm/config.d/00-use-suspend-hybrid

# WORKAROUND: always set the default hibernate mode first (normal mode)
# (not required if you have the patch mentioned by Rohan below (http://askubuntu.com/a/344879/169))
HIBERNATE_MODE=platform

# Always use hibernate instead of suspend, but with "suspend to both"
if [ "$METHOD" = "suspend" ]; then
  METHOD=hibernate
  HIBERNATE_MODE=suspend
fi

# Make sure to use the kernel's method, in case uswsusp is installed etc.
SLEEP_MODULE=kernel

这将始终将图像写入磁盘,然后暂停到RAM,具有恢复的好处总是很快(只要电池没电),并且机器不会在短时间内唤醒(在PM_HIBERNATE_DELAY之后)冬眠是真的。

缺点是该过程需要更长时间(因为它总是休眠到磁盘),并且您的电池可能会长时间耗尽(例如12小时后)。

次佳解决办法

Ubuntu 18.04是一个定时选项

在Ubuntu 18.04中有一个新的定时选项。在systemd中可用新模式suspend-then-hibernate。这将从睡眠模式开始,然后在固定时间后转换到休眠模式。

hybrid-sleep模式下,只有当电池电量严重不足且系统关闭时,休眠部分才会生效。

要开始使用此功能,您需要创建一个带有下一个内容的文件/etc/systemd/sleep.conf

[Sleep]
HibernateDelaySec=3600

睡眠1小时后,这将从睡眠状态变为休眠状态。您可以编辑HibernateDelaySec以将延迟更改为休眠。

首先,测试suspend-then-hibernate是否使用systemd工作

Ctrl + Alt + T打开终端并输入:

sudo systemctl suspend-then-hibernate

如果它的工作原理使其永久化。

  • 当我关上盖子时,以下工作。

使用首选编辑器打开文件/etc/systemd/logind.conf。您需要通过sudogksudopkexec调用您的管理权限来编辑此文件。

找到两行:

#HandleSuspendKey=suspend
#HandleLidSwitch=suspend

注意,这些行在它们前面用#注释掉。 suspend是默认操作。删除#并在这两行中将suspend更改为suspend-then-hibernate,使它们看起来像这样:

HandleSuspendKey=suspend-then-hibernate
HandleLidSwitch=suspend-then-hibernate

保存文件。通过以下命令注销并重新登录或重新启动logind服务:

systemctl restart systemd-logind.service

警告!您的用户会话将重新启动

资料来源:Lid Closed Suspend then Hibernate

Ubuntu 16.04及以上版本

蓝眼为Linux 3.6+的Real混合暂停的解决方案对我不起作用。我怀疑这是因为Ubuntu 16.04使用systemd并且不使用文件/etc/pm/config.d/00-use-suspend-hybrid

首先,测试hibernate和hybrid-sleep是否使用systemd工作

Ctrl + Alt + T打开终端并输入:

sudo systemctl hibernate

这应该让你的计算机休眠。要尝试hybrid-sleep,请输入:

sudo systemctl hybrid-sleep

如果它的工作原理使其永久化。

  • 当我关上盖子时,以下工作。

使用首选编辑器打开文件/etc/systemd/logind.conf。您需要通过sudogksudopkexec调用您的管理权限来编辑此文件。

找到两行:

#HandleSuspendKey=suspend
#HandleLidSwitch=suspend

注意,这些行在它们前面用#注释掉。 suspend是默认操作。删除#并在这两行中将suspend更改为hybrid-sleep,使它们看起来像这样:

HandleSuspendKey=hybrid-sleep
HandleLidSwitch=hybrid-sleep

保存文件。退出并重新登录。

注意:

  • suspendhybrid-sleep外,还有第三种选择,hibernate

  • 我的笔记本电脑没有物理睡眠按钮。所以我无法测试它。

  • 从cog菜单中单击Suspend可使计算机正常挂起而不是hybrid-sleep。

资料来源:https://superuser.com/questions/719447/how-to-use-systemd-hybrid-sleep-instead-of-suspend-under-gnome-in-linux

我希望这有帮助

第三种解决办法

在12.04中,我注意到当触发休眠时(使用PM_HIBERNATE_DELAY=XX),恢复/解冻shell脚本不会取消设置grub recordfail变量。因此grub不会自动引导。

超时设置为-1,等待用户选择。我猜这需要在/etc/pm/sleep.d/10_grub-common中编辑脚本。我不是新手,所以我还没有想到要弄清楚确切的变化。

第四种办法

这个问题在Google中经常出现,我觉得值得一试。这里描述的方法是(imo)不是混合暂停。它是“在暂停X分钟后休眠”。 True混合挂起将RAM写入磁盘,然后进入low-power状态(睡眠模式)。虽然需要更长的时间,但是当机器剩余电量时,恢复是即时的,否则恢复形成硬盘。这种行为是大多数人所知的混合睡眠,并且在较新的Windows和Mac笔记本电脑中默认使用。

以下是如何启用真正的混合暂停:

  • 按照最佳答案的第一部分。这将覆盖”suspend”调用以在pm-utils中执行”hybrid_suspend”。


    % cat /etc/pm/config.d/00-use-suspend-hybrid
    # Always use suspend_hybrid instead of suspend
    if [ "$METHOD" = "suspend" ]; then
        METHOD=suspend_hybrid
    fi

这个方法适用于我的Sony Vaio SVS。

PS:如果将来删除文件,请在此处重新生成补丁:


diff --git a/pm/pm-functions.in b/pm/pm-functions.in
--- a/pm/pm-functions.in
+++ b/pm/pm-functions.in
@@ -316,8 +316,28 @@ if [ -z "$HIBERNATE_MODULE" ] && \
    {
        [ -n "${HIBERNATE_MODE}" ] && \
        grep -qw "${HIBERNATE_MODE}" /sys/power/disk && \
+       HIBERNATE_MODE_SAVE=$(cat /sys/power/disk) && \
+       HIBERNATE_MODE_SAVE="${HIBERNATE_MODE_SAVE##*[}" && \
+       HIBERNATE_MODE_SAVE="${HIBERNATE_MODE_SAVE%%]*}" && \
        echo -n "${HIBERNATE_MODE}" > /sys/power/disk
        echo -n "disk" > /sys/power/state
+       RET=$?
+       echo -n "$HIBERNATE_MODE_SAVE" > /sys/power/disk
+       return "$RET"
+   }
+fi
+
+# for kernels that support suspend to both (i.e. hybrid suspend)
+# since kernel 3.6
+if [ -z "$SUSPEND_HYBRID_MODULE" ] && \
+   [ -f /sys/power/disk ] && \
+   grep -q disk /sys/power/state && \
+   grep -q suspend /sys/power/disk; then
+   SUSPEND_HYBRID_MODULE="kernel"
+   do_suspend_hybrid()
+   {
+       HIBERNATE_MODE="suspend"
+       do_hibernate
    }
 fi

资料来源:

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/2063.html,未经允许,请勿转载。