我如何默认使用pm-suspend-hybrid而不是pm-suspend?

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

我可以设想改变pm-suspend脚本来自动执行此操作,但可能有一种更易于维护/更简单的方法。

间接混合睡眠

这是较旧的方法:首先暂停,然后在延迟(默认为15分钟)后唤醒hibernate。 在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 

您可能希望通过以下代码确保系统支持混合方法。 如果它显示“0”它应该工作:

 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之后)冬眠是真的。

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

  • 相应的博文(未更新)

Ubuntu 18.04是一个定时选项

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

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

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

 [Sleep] HibernateDelaySec=3600 

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

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

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

 sudo systemctl suspend-then-hibernate 

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

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

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

找到两行:

 #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然后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 

这应该让你的计算机hibernate。 要尝试混合睡眠,请输入:

 sudo systemctl hybrid-sleep 

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

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

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

找到两行:

 #HandleSuspendKey=suspend #HandleLidSwitch=suspend 

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

 HandleSuspendKey=hybrid-sleep HandleLidSwitch=hybrid-sleep 

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

注意:

  • 除了suspendhybrid-sleep还有第三种选择,即hibernate
  • 我的笔记本电脑没有物理睡眠按钮。 所以我无法测试它。
  • 单击cog菜单中的Suspend将计算机置于正常挂起状态而不是混合睡眠状态。

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

我希望这有帮助

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

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

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

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

  • 按照最佳答案的第一部分。 这会覆盖“暂停”调用以在pm-utils中执行“hybrid_suspend”。
     %cat /etc/pm/config.d/00-use-suspend-hybrid
     #始终使用suspend_hybrid而不是暂停
     if [“$ METHOD”=“暂停”]; 然后
         METHOD = suspend_hybrid
    科幻
  • 备份/ usr / lib / pm-utils / pm-functions
  • 从这里获取补丁: https : //bugs.freedesktop.org/attachment.cgi?id = 68712
    • 此补丁启用混合挂起(如果可用)(即在内核3.6+上)
  • 使用’patch -p0’应用它,或者如果失败则手动合并它

这个方法适用于我的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
 +返回“$ RET”
 +}
 +网络
 +
 +#用于支持暂停两者的内核(即混合暂停)
 +#自内核3.6
 +如果[-z“$ SUSPEND_HYBRID_MODULE”] && \
 + [-f / sys / power / disk] && \
 + grep -q disk / sys / power / state && \
 + grep -q suspend / sys / power / disk; 然后
 + SUSPEND_HYBRID_MODULE =“内核”
 + do_suspend_hybrid()
 + {
 + HIBERNATE_MODE =“暂停”
 + do_hibernate
     }
 科幻

资料来源:

没有在config.d中添加任何文件的另一种解决方案,只需在/ sys / class / rtc / rtc0中使用wakealarm。 在注释#since后,在pm函数(/ usr / lib / pm-utils)中使用过时的代码,因为内核不直接支持…,(’当前内核(在3.6之后)直接支持)。 恢复该代码并放入do_suspend()部分而不是do_suspend_hybrid(),并使用pm函数的补丁(直到他们修复它)。

过时的代码(挂起然后在调用suspend_hybrid时hibernate):

 # since the kernel does not directly support hybrid sleep, we do # something else -- suspend and schedule an alarm to go into # hibernate if we have slept long enough. # Only do this if we do not need to do any special video hackery on resume # from hibernate, though. if [ -z "$SUSPEND_HYBRID_MODULE" -a -w "$PM_RTC/wakealarm" ] && \ check_suspend && check_hibernate && ! is_set $HIBERNATE_RESUME_POST_VIDEO; \ then SUSPEND_HYBRID_MODULE="kernel" do_suspend_hybrid() { WAKETIME=$(( $(cat "$PM_RTC/since_epoch") + PM_HIBERNATE_DELAY)) echo >"$PM_RTC/wakealarm" echo $WAKETIME > "$PM_RTC/wakealarm" if do_suspend; then NOW=$(cat "$PM_RTC/since_epoch") if [ "$NOW" -ge "$WAKETIME" -a "$NOW" -lt $((WAKETIME + 30)) ]; then log "Woken by RTC alarm, hibernating." # if hibernate fails for any reason, go back to suspend. do_hibernate || do_suspend else echo > "$PM_RTC/wakealarm" fi else # if we cannot suspend, just try to hibernate. do_hibernate fi } fi 

推荐的。 更容易使用uswsusp,同时最大化s2both的好处,即暂停时s2both。 将恢复的代码放在uswsusp模块(/usr/lib/pm-utils/module.d)的do_suspend()部分中。

恢复代码(挂起时调用suspend_hybrid):

  WAKETIME=$(( $(cat "$PM_RTC/since_epoch") + PM_HIBERNATE_DELAY)) echo >"$PM_RTC/wakealarm" echo $WAKETIME > "$PM_RTC/wakealarm" if do_suspend_hybrid; then NOW=$(cat "$PM_RTC/since_epoch") if [ "$NOW" -ge "$WAKETIME" -a "$NOW" -lt $((WAKETIME + 30)) ]; then log "Woken by RTC alarm, hibernating." # if hibernate fails for any reason, go back to suspend_hybrid. do_hibernate || do_suspend_hybrid else echo > "$PM_RTC/wakealarm" fi else # when do_suspend is being called, convert to suspend_hybrid. do_suspend_hybrid fi 

使用uswsusp,我们可以看到暂停/hibernate的进度以及文本中显示的反向过程,甚至我们可以通过按退格键来中止它。 没有uswsusp,暂停/hibernate就会出现 – 消失,特别是当唤醒wakealarm并执行hibernate时(uswsusp中的s2disk)。 在pm-functions文件的通常位置设置hibernate前的睡眠时间。

 # variables to handle hibernate after suspend support PM_HIBERNATE_DELAY=900 # 15 minutes PM_RTC=/sys/class/rtc/rtc0 

这是uswsusp mod :(记住,这个模块是从pm函数调用的,所以插入的变量是相同的)

 #!/bin/sh # disable processing of 90chvt and 99video. # s2ram and s2disk handle all this stuff internally. uswsusp_hooks() { disablehook 99video "disabled by uswsusp" } # Since we disabled 99video, we need to take responsibility for proper # quirk handling. s2ram handles all common video quirks internally, # so all we have to do is translate the HAL standard options to s2ram options. uswsusp_get_quirks() { OPTS="" ACPI_SLEEP=0 for opt in $PM_CMDLINE; do case "${opt##--quirk-}" in # just quirks, please dpms-on) ;; # no-op dpms-suspend) ;; # no-op radeon-off) OPTS="$OPTS --radeontool" ;; reset-brightness) ;; # no-op s3-bios) ACPI_SLEEP=$(($ACPI_SLEEP + 1)) ;; s3-mode) ACPI_SLEEP=$(($ACPI_SLEEP + 2)) ;; vbe-post) OPTS="$OPTS --vbe_post" ;; vbemode-restore) OPTS="$OPTS --vbe_mode" ;; vbestate-restore) OPTS="$OPTS --vbe_save" ;; vga-mode-3) ;; # no-op save-pci) OPTS="$OPTS --pci_save" ;; none) QUIRK_NONE="true" ;; *) continue ;; esac done [ $ACPI_SLEEP -ne 0 ] && OPTS="$OPTS --acpi_sleep $ACPI_SLEEP" # if we were told to ignore quirks, do so. # This is arguably not the best way to do things, but... [ "$QUIRK_NONE" = "true" ] && OPTS="" } # Since we disabled 99video, we also need to handle displaying # help info for the quirks we handle. uswsusp_help() { echo # first echo makes it look nicer. echo "s2ram video quirk handler options:" echo echo " --quirk-radeon-off" echo " --quirk-s3-bios" echo " --quirk-s3-mode" echo " --quirk-vbe-post" echo " --quirk-vbemode-restore" echo " --quirk-vbestate-restore" echo " --quirk-save-pci" echo " --quirk-none" } # This idiom is used for all sleep methods. Only declare the actual # do_ method if: # 1: some other sleep module has not already done so, and # 2: this sleep method can actually work on this system. # # For suspend, if SUSPEND_MODULE is set then something else has already # implemented do_suspend. We could just check to see of do_suspend was # already declared using command_exists, but using a dedicated environment # variable makes it easier to debug when we have to know what sleep module # ended up claiming ownership of a given sleep method. if [ -z "$SUSPEND_MODULE" ] && command_exists s2ram && \ ( grep -q mem /sys/power/state || \ ( [ -c /dev/pmu ] && check_suspend_pmu; ); ); then SUSPEND_MODULE="uswsusp" do_suspend() { WAKETIME=$(( $(cat "$PM_RTC/since_epoch") + PM_HIBERNATE_DELAY)) echo >"$PM_RTC/wakealarm" echo $WAKETIME > "$PM_RTC/wakealarm" if do_suspend_hybrid; then NOW=$(cat "$PM_RTC/since_epoch") if [ "$NOW" -ge "$WAKETIME" -a "$NOW" -lt $((WAKETIME + 30)) ]; then log "Woken by RTC alarm, hibernating." # if hibernate fails for any reason, go back to suspend_hybrid. do_hibernate || do_suspend_hybrid else echo > "$PM_RTC/wakealarm" fi else # when do_suspend is being called, convert to suspend_hybrid. do_suspend_hybrid fi } fi if [ -z "$HIBERNATE_MODULE" ] && \ [ -f /sys/power/disk ] && \ grep -q disk /sys/power/state && \ [ -c /dev/snapshot ] && command_exists s2disk; then HIBERNATE_MODULE="uswsusp" do_hibernate() { s2disk } fi if [ -z "$SUSPEND_HYBRID_MODULE" ] && grep -q mem /sys/power/state && \ command_exists s2both && \ check_hibernate; then SUSPEND_HYBRID_MODULE="uswsusp" do_suspend_hybrid() { uswsusp_get_quirks s2both --force $OPTS } if [ "$METHOD" = "suspend_hybrid" ]; then add_before_hooks uswsusp_hooks add_module_help uswsusp_help fi fi 

用户68186对Ubuntu 16.04的回答对我不起作用。 但是,解决方案确实如此。

首先,确保hibernate正常。 然后

在Ubuntu软件中搜索并安装dconf编辑器。 然后启动它并导航到org – > gnome – > settings daemon – > plugins – > power。

更改“lid-close-ac-action”和“lid-close-battery-action”的值。

在我的电源设置中,这些选项显示为空白,但它们按预期工作。

Ubuntu 18.04中它更加轻松。 在systemd中可以使用新模式suspend-then-hibernate 。 要开始使用此function,您需要使用下一个内容创建一个文件/etc/systemd/sleep.conf

 [Sleep] HibernateDelaySec=3600 

然后你可以通过命令测试它:

 sudo systemctl suspend-then-hibernate 

(您可以编辑HibernateDelaySec以减少hibernate延迟)。 如果一切正常,你可以改变Lid Close Action,为此你需要编辑文件/etc/systemd/logind.conf

您需要找到选项HandleLidSwitch = ,取消注释并更改为HandleLidSwitch = suspend-then-hibernate 。 然后,您需要通过下一个命令重新启动logind服务(wirning!您将重启用户会话):

 systemctl restart systemd-logind.service 

就这样! 现在你可以使用这个不错的function。