我如何默认使用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
。 您需要通过sudo
, gksudo
或pkexec
调用您的管理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
。 您需要通过sudo
, gksudo
或pkexec
调用您的管理pkexec
来编辑此文件。
找到两行:
#HandleSuspendKey=suspend #HandleLidSwitch=suspend
注意,这些行在它们前面用#
注释掉。 suspend
是默认操作。 在这两行中删除#
并将suspend
更改为hybrid-sleep
,使它们看起来像这样:
HandleSuspendKey=hybrid-sleep HandleLidSwitch=hybrid-sleep
保存文件。 退出并重新登录。
注意:
- 除了
suspend
或hybrid-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。