デフォルトでpm-suspendの代わりにpm-suspend-hybridを使用するにはどうすればよいですか?


41

ふたを閉じるとき、またはメニューから「サスペンド」を選択するとき、サスペンドの代わりにハイブリッドサスペンドメソッドを使用したいと思います。

pm-suspendスクリプトを変更して自動的に変更することを想像できますが、より保守的で簡単な方法があるかもしれません。

回答:


44

間接ハイブリッド睡眠

これは古い方法です。最初にサスペンドしてから、遅延(デフォルトでは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

次のコードを使用して、ハイブリッド方式がシステムでサポートされていることを確認する必要がある場合があります。「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後)ウェイクアップしないという利点があります。実際に休止状態になります。

欠点は、プロセスがより長くかかり(常にディスクに休止状態になるため)、長時間実行すると(たとえば12時間後)バッテリーがなくなる可能性があることです。


2
「sudo pm-is-supported --suspend-hybrid && echo $?」ではなく、「sudo pm-is-supported --suspend-hybrid」を使用してください。エコー$? ' pm-is-supportedの戻り値は0がサポートされており、1がサポートされていないためです。
ジェームズカチェーゼ

1
@JamesCaccese:シェルスクリプトの世界では、0は「true」を意味し、それ以外は「false」を意味します。スクリプトレットは機能しますが、元のポスターのスクリプトレットも意図したとおりに機能し、サポートされている場合は「0」を、サポートされていない場合は何も出力しません。常にサポートされている、またはサポートされていないというメッセージが必要な場合は、 'sudo pm-is-supported --suspend-hybrid && echo "supported"を試してください|| エコー「サポートされていない」 '
zanfur

@zanfur-両方の状態を印刷するためにあなたがその後提供するソリューションが好きですが(そして、pm-is-supportedが期待どおりに実行されず、エラー状態に未知のことをする予期しない理由のために何もしません)、私はJames Cacceseの言及に感謝します前述の理由により、その警告。
user66001

16.04を使用している場合は以下の回答を参照してください。
カパッド

私にとって唯一欠けているのはのresume議論でした/etc/default/grub.conf。また、nvidiaユーザーとして設定する必要がありましたnomodeset。したがって、私の場合のgrubエントリは次のようになりGRUB_CMDLINE_LINUX_DEFAULT="nomodeset resume=UUID=uuidofswappartition"ます。忘れないでgrub-update。そしてまた、いくつかのモジュールはとてもアンロードファイルを作成する必要があります/etc/pm/config.d/00-unload_modulesラインとSUSPEND_MODULES="ath5k r8169"し、念私も00-使用サスペンド・ハイブリッドに名前を変更するために10-use-suspend-hybrid
mauron85

31

Ubuntu 18.04時限オプション

Ubuntu 18.04新しい時限式のオプションを持っています。でsystemd新しいモードが利用可能ですsuspend-then-hibernate。これはスリープモードで開始され、一定時間後に休止状態モードに移行します。

このhybrid-sleepモードでは、バッテリーが非常に少なくなってシステムがシャットダウンした場合にのみ、休止状態部分が有効になります。

この関数の使用を開始するに/etc/systemd/sleep.confは、次のコンテンツを含むファイルを作成する必要があります。

[Sleep]
HibernateDelaySec=3600

これは、1時間のスリープの後、スリープから休止状態に移行します。編集HibernateDelaySecして遅延を休止状態に変更できます。

まず、systemdを使用してsuspend-then-hibernateが機能するかどうかをテストします

Ctrl+ Alt+ Tを押してターミナルを開き、次を入力します。

sudo systemctl suspend-then-hibernate

動作する場合は、永続的にします。

  • 蓋を閉めると次のように動作ます。

任意の/etc/systemd/logind.confエディターを使用してファイルを開きます。次の方法で管理者の電力を起動する必要がありますsudogksudoまたはpkexecこのファイルを編集します。

2行を見つけます。

#HandleSuspendKey=suspend
#HandleLidSwitch=suspend

注、これらの行は#その前にコメントアウトされています。これsuspendがデフォルトのアクションです。を削除し、これらの2行をに#変更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以降

ソリューションによってblueyed のLinux 3.6以降で中断実ハイブリッドのためには、私のために動作しませんでした。これは、Ubuntu 16.04 systemdがファイルを使用しているため、使用していないためと思われます/etc/pm/config.d/00-use-suspend-hybrid

まず、systemdを使用して、休止状態とハイブリッドスリープが機能するかどうかをテストします。

Ctrl+ Alt+ Tを押してターミナルを開き、次を入力します。

sudo systemctl hibernate

これにより、コンピューターが休止状態になります。ハイブリッドスリープを試すには、次のように入力します。

sudo systemctl hybrid-sleep

動作する場合は、永続的にします。

  • 蓋を閉めると次のように動作ます。

任意の/etc/systemd/logind.confエディターを使用してファイルを開きます。次の方法で管理者の電力を起動する必要がありますsudogksudoまたはpkexecこのファイルを編集します。

2行を見つけます。

#HandleSuspendKey=suspend
#HandleLidSwitch=suspend

注、これらの行は#その前にコメントアウトされています。これsuspendがデフォルトのアクションです。を削除し、これらの2行をに#変更suspendしてhybrid-sleep、次のようにします。

HandleSuspendKey=hybrid-sleep
HandleLidSwitch=hybrid-sleep

ファイルを保存します。ログアウトしてからログインし直します。

注意:

  • 3番目のオプション以外、suspendまたはhybrid-sleepがありますhibernate
  • 私のラップトップには物理的なスリープボタンがありません。そのため、テストできませんでした。
  • Suspendコグメニューからをクリックすると、コンピューターはハイブリッドスリープではなく通常のサスペンド状態になります。

ソース:https : //superuser.com/questions/719447/how-to-use-systemd-hybrid-sleep-instead-of-suspend-under-gnome-in-linux

これが役立つことを願っています


2
この答えにはさらに投票が必要です。16.04での問題を修正しました。ありがとう。
カパッド

どういたしまして。14.04から16.04に移動したので、時間の経過とともにゆっくりと物事を行う新しいシステム化された方法を見つけています。
user68186

1
Ubuntu GNOME 16.04.1でも動作します-HarlemSquirrel
1

4

12.04では、休止状態がトリガーされたときに(を使用してPM_HIBERNATE_DELAY=XX)、シェルスクリプトの再開/解凍がgrub recordfail変数を設定解除しないことに気付きました。したがって、grubは自動起動しません。

タイムアウトは-1に設定され、ユーザーの選択を待機します。これにはのスクリプトの編集が必要だと思います/etc/pm/sleep.d/10_grub-common。初心者なので、残念ながら正確な変更を理解するために手を出していない。


1
おそらくバグレポートや12.10以降で動作するかどうかをテストする価値があります。
12

12.10
MDCore

3

この質問はGoogleで頻繁に出てくるので、ぶつかりたいと思います。ここで説明する方法は(imo)ハイブリッドサスペンドではありません。「X分のサスペンド後の休止」です。真のハイブリッドサスペンドは、RAMをディスクに書き込み、低電力状態になります(スリープモード)。時間がかかりますが、マシンのバッテリーが残っている間は再開されますが、そうでない場合はハードディスクから再開されます。この動作は、ほとんどの人がハイブリッドスリープとして知っており、新しいWindowsおよびMacラップトップでデフォルトで使用されています。

実際のハイブリッドサスペンドを有効にする方法は次のとおりです。

  • トップアンサーの最初の部分に従ってください。これは、pm-utilsで「hybrid_suspend」を実行する「suspend」呼び出しをオーバーライドします。
    %cat /etc/pm/config.d/00-use-suspend-hybrid
    #一時停止の代わりに常にsuspend_hybridを使用する
    if ["$ METHOD" = "suspend"]; それから
        METHOD = suspend_hybrid
    fi
  • / 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」を返す
+}
+ fi
+
+#両方へのサスペンドをサポートするカーネル(ハイブリッドサスペンド)
+#カーネル3.6以降
+ if [-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 = "suspend"
+ do_hibernate
    }
 fi

ソース:


1
あなたは、ハイブリッドサスペンドについて正しいです。最近、自分でスニペットを変更しました。METHOD = hibernateおよびHIBERNATE_MODE = suspendを使用すると、同じ結果を得ることができます(まったく同じ)。以前のバージョン(パッチの動作)を保存および復元する代わりに、ファイルの先頭にHIBERNATE_MODE = platformを設定しています。上記の回答を更新します。
2013年

それは素晴らしいですね、編集のおかげで、@ blueyed
Rohan Dhruva

1

/ sys / class / rtc / rtc0のwakealarmを使用するだけで、config.dにファイルを追加せずに別のソリューションがあります。カーネルが直接サポートしていないため、コメントの後にpm-functions(/ usr / lib / pm-utils)で廃止されたコードを使用してください...((現在のカーネル(3.6以降)は直接サポートしています)そのコードを元に戻し、do_suspend_hybrid()の代わりにdo_suspend()部分を入れて、pm関数用のパッチを使用します(修正するまで)。

廃止されたコード(suspend_hybridが呼び出されたときにサスペンドしてから休止状態にする):

# 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を使用すると、サスペンド/ハイバネートの進行状況とリバースプロセスがテキストで表示されます。バックスペースを押して中止することもできます。uswsuspを使用しないと、特にwakealarmがトリガーされ、休止状態(uswsuspのs2disk)を実行する場合に、サスペンド/ハイバネートが迷惑なように見えます。休止状態になる前のスリープ期間をpm-functionsファイルの通常の場所に設定します。

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

uswsusp modを次に示します(このモジュールはpm-functionsから呼び出されるため、挿入される変数は同じです)。

#!/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  

0

Ubuntu 16.04に対するuser68186による回答は、私にとってはうまくいきませんでした。しかし、ここでの解決策そうでした。

最初に、休止状態が機能することを確認します。それから

Ubuntu Softwareでdconf Editorを検索してインストールします。それを起動し、組織-> gnome->設定デーモン->プラグイン->電源に移動します。

「lid-close-ac-action」および「lid-close-battery-action」の値を変更します。

電源設定では、これらのオプションは空白として表示されますが、意図したとおりに機能します。


0

Ubuntu 18.04それがはるかにeaser。でsystemdに availiable新しいモードがあるサスペンド、その後、休止状態。この関数の使用を開始するには、次の内容で/etc/systemd/sleep.confファイルを作成する必要があります。

[Sleep]
HibernateDelaySec=3600

次に、コマンドでテストできます。

sudo systemctl suspend-then-hibernate

(HibernateDelaySecを編集して、休止状態への遅延を減らすことができます)。すべてが正常に機能する場合は、Lid Close Actionを変更できます。変更するには、ファイル/etc/systemd/logind.confを編集する必要があります

オプションHandleLidSwitch =を見つけてコメントを外しHandleLidSwitch = suspend-then-hibernateに変更する必要があります。次に、次のコマンドでlogindサービスを再起動する必要があります(警告!ユーザーセッションが再起動されます)。

systemctl restart systemd-logind.service

それで全部です!これで、この便利な関数を使用できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.