SuspendからHibernateに自動的に移動する方法は?


53

「サスペンド鎮静」とも呼ばれるサスペンドからUbuntuを休止状態にすることは可能ですか?

私が探しているのはこれです:
蓋を閉じると、ラップトップはサスペンド状態になります。その後、事前に決められた時間の後(バッテリーが強くなっても)、まだ使用しない場合は、バッテリー電力を節約するために休止状態になります。

たとえば、蓋を閉じると、ラップトップはサスペンドに入るように設定されています。その後、1日中使用しないと、バッテリーが切れます。これは、サスペンドモードでもハードウェアが少量の電力を消費し、最終的にバッテリーが放電するためです。私が望んでいるのは、Ubuntuが中断されていても、数時間の非アクティブ状態が続いた後でもHibernateに入る必要があることをUbuntuに伝えることができるようにすることです。

Windowsはそれを行うことができます。Ubuntuは、タイマーでスタンバイまたは休止状態に入るようにプログラムできますが、両方ではありません。


私の研究では、同じLinux Mintスレッドが見つかりましたが、「Suspend Sedation」はその機能のMicrosoftの公式用語ではありません。
ayan4m1

その機能にはもっと良い名前がありますか?
セルゲイスタドニック

私が知る限り、この機能に広く受け入れられている名前はありません。一部の人は「ハイブリッドサスペンド」を使用し、そのLinux Mintフォーラムのユーザーは「サスペンド鎮静」を使用します。以前は、プロセスを参照するために「休止状態とサスペンド」が使用されていました。少なくともWindows 7では、Microsoftは公式に「ハイブリッドスリープ」と呼んでいます。
ayan4m1

2
@ ayan4m1これは古い質問だと思いますが、これを明確にすることが重要だと思います。ハイパービッドスリープは、「スリープしてから指定した時間後に休止状態にする」とは異なります。ハイブリッドスリープは、電源が切れると、バッテリーが切れて単純に休止状態になります。OPで記述されている動作では、ハイブリッドスリープを有効にする必要はありません。
ポール

回答:


20

Ubuntu 18.04、それははるかに容易になります。でsystemdに新しいモードが利用可能であるサスペンド、その後、休止状態。この関数の使用を開始するには、次のコンテンツを含むファイル/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。次に、次のコマンドでsystemd-logindサービスを再起動する必要があります(警告!ユーザーセッションが再起動されます)。

sudo systemctl restart systemd-logind.service

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


これはスポットでした。Pop!_OS 18.10(別名Ubuntu 18.10)で使用します。
eduncan911

素晴らしいありがとう!sleep.confは、何らかの方法で休止状態モードにも影響しますか、それともsuspend-then-hibernateのみに影響しますか?
user2428107


35

これに対する解決策は簡単です。まず、中断時と再開、午後サスペンドプログラムがで一連のスクリプトを実行/etc/pm/sleep.dしてを/usr/lib/pm-utils/sleep.d。したがって、私の解決策は、次のことを行うスクリプトを追加することです。

  1. 中断したら、現在の時刻を記録し、rtcwakeを使用してウェイクアップイベントを登録します。
  2. 再開したら、現在の時刻を上から記録された時刻と照合します。十分な時間が経過した場合は、おそらくrtcタイマーイベントにより目が覚めました。それ以外の場合、ユーザーイベント(ラップトップ画面を開くなど)が原因で早起きしました。
  3. rtcタイマーが原因で目が覚めた場合は、すぐに「pm-hibernate」コマンドを発行して休止状態に入ります。

これを行うスクリプトを次に示します。名前を付け0000rtchibernate/etc/pm/sleep.dディレクトリに配置します(スクリプトが一時停止時に最初に実行され、最後に再開時に実行されるように、0000が重要です)。

#!/bin/bash
# Script name: /etc/pm/sleep.d/0000rtchibernate
# Purpose: Auto hibernates after a period of sleep
# Edit the "autohibernate" variable below to set the number of seconds to sleep.
curtime=$(date +%s)
autohibernate=7200
echo "$curtime $1" >>/tmp/autohibernate.log
if [ "$1" = "suspend" ]
then
    # Suspending.  Record current time, and set a wake up timer.
    echo "$curtime" >/var/run/pm-utils/locks/rtchibernate.lock
    rtcwake -m no -s $autohibernate
fi

if [ "$1" = "resume" ]
then
    # Coming out of sleep
    sustime=$(cat /var/run/pm-utils/locks/rtchibernate.lock)
    rm /var/run/pm-utils/locks/rtchibernate.lock
    # Did we wake up due to the rtc timer above?
    if [ $(($curtime - $sustime)) -ge $autohibernate ]
    then
        # Then hibernate
        rm /var/run/pm-utils/locks/pm-suspend.lock
        /usr/sbin/pm-hibernate
    else
        # Otherwise cancel the rtc timer and wake up normally.
        rtcwake -m no -s 1
    fi
fi

うまくいけば、このコードがこの伝言板に掲載されることを願っています(これが私の最初の投稿です)。

autohibernate=7200上部のタイムアウト値を編集しますが、休止状態に入る前にスリープする秒数を設定します。上記の現在の値は2時間です。ラップトップは休止状態機能を実行している間、数秒間その時点で起動します。

そのため、ラップトップをケースに入れる予定がある場合は、中断せずに休止状態にしてください。そうしないと、ラップトップが特に過熱する可能性があります。ぴったり合ったスリップケースにある場合(ただし、数秒から1分間しか点灯しません)。

過去数日間この方法を使用してきましたが、これまでのところ成功しています(そして今日の午後、バッテリー切れから救われました)。楽しい。

systemdUbuntuバージョンを使用する他のLinuxディストリビューションでは、スクリプト/usr/lib/systemd/system-sleep/etc/pm/sleep.d。また、/usr/sbin/pm-hibernateコマンドをに置き換えsystemctl hibernateます。


ここで機能しましたが、Xを全員に追加するためにファイルをchmodedしてからです。私は大規模な初心者であり、把握するのに2日かかりました。非常に優れたスクリプトであり、これが問題を抱えている人に役立つことを願っています。ありがとうございました。

2
これにより、有用なUbuntu / Debianパッケージが作成されます。
PetrPudlák12年

ただ疑問に思う:これはまだUbuntu 13.04に有効ですか?まさにこのソリューションが必要ですが、新しいバージョンで問題が発生することが判明した場合、妻のラップトップを台無しにしたくありません。
トーベンGundtofte・ブルーン

スクリプトをありがとう。Ubuntu 14.04で正常に動作します!改善点の1つは、ラップトップがウェイクアップして休止状態になったときに、AC電源に接続されているかどうかを確認できる場合です。もしそうなら、私はそれが冬眠する代わりに再び中断することを望みます。休止状態から復元すると、時間がかかり、それは...に差し込まれているとき、私は実際に休止状態にそれを必要としない
maddentim

どうもありがとうございます!!!!このスクリプトは私が夢見ていた魔法です!!
ヤンパス

12

これがどのように機能するかを説明するために(これはWindowsに似ています)簡単な言葉で:バッテリーが低下してもマシンがスタンバイ状態からウェイクアップせず、マシンの状態をスワップパーティションに保存できるため、すべてをすぐにスワップパーティションに保存しますスタンバイ状態で、バッテリーがなくなると、スワップパーティションから状態を読み込むことで回復します(休止状態の場合のように)。

AFAIK linuxは、ハードウェアで動作することがわかっている場合、「通常の」スタンバイの代わりにハイブリッドスタンバイ/休止状態を使用します。あまりにも多くのバグや何かが原因でこれが現在無効になっている可能性もあります...;)

実験が好きなら、多分pm-suspend-hybridで良い結果が得られるかどうかを確認できます。

以下が幸運だと言っている場合、理論的にはシステムでハイブリッドサスペンドがサポートされています。

pm-is-supported --suspend-hybrid && echo "you're lucky"

1
シェルコマンドの単一のアポストロフィは、誤解を招く混乱を招く可能性があります...エスケープしてください。
ayan4m1

1
ああ、それはコマンドラインとして考えずに、他のテキスト内に埋め込まれたコマンドラインを編集するときに起こることです...ありがとうございます。
-JanC

問題ありません。2つのプロセスの異なるヘッドスペースについて理解しました。
ayan4m1

6

s2bothに興味があるかもしれません。uswsuspUbuntu 10.10 のパッケージで提供されます。ディスクにサスペンドしますが、システムをシャットダウンする代わりに、S3に入れます。これは通常、Ubuntuの「サスペンド」オプションに関連付けられている電源モードです。pm-suspend-hybridは、同じことを行うことを目的とした別のツールです。

ふたを閉じるときにこれを自動化するには、ふたイベントがキャッチされたときに任意のスクリプトを実行できる次のガイドを参照してください。

http://ubuntuforums.org/showthread.php?t=1076486

たまたまThinkPadを持っている場合、のマンページtpctlは引数を参照し--pm-sedation-hibernate-from-suspend-timerます。これは、探している機能を提供しているようです。私は、ThinkPad以外のハードウェアでこれを試すことに対して警告します。

参考のために、hibernate.confのマンページを調べました。関連するオプションはないようですが、一読する価値があるかもしれません。


5

Ubuntu 16.04-所定の時間が経過するとサスペンド/スリープから休止状態になります

Ubuntu 16.04では状況が少し異なるようです。そのため、私がそれを機能させるために行った手順は次のとおりです。

  1. 実行時に休止状態が期待どおりに機能していることを確認します

    systemctl hibernate
    
  2. 元のsuspend.targetファイルをコピーします。

    sudo cp /lib/systemd/system/suspend.target /etc/systemd/system/suspend.target
    

    次に、ファイル/etc/systemd/system/suspend.targetを編集して次の行を追加します。

    Requires=delayed-hibernation.service
    

    [Unit]そのファイルのセクションに。

  3. /etc/systemd/system/delayed-hibernation.service次の内容でファイルを作成します。

[単位]
Description =遅延休止トリガー
Before = suspend.target
Conflicts = hibernate.target hybrid-suspend.target
StopWhenUnneeded = true

[サービス]
タイプ=ワンショット
RemainAfterExit = yes
ExecStart = / usr / local / bin / delayed-hibernation.sh pre suspend
ExecStop = / usr / local / bin / delayed-hibernation.sh post suspend

[インストール]
WantedBy = sleep.target
  1. /etc/delayed-hibernation.conf次の内容でスクリプトの構成ファイルを作成します。
# 'delayed-hibernation.sh'スクリプトの構成ファイル

#コンピューターが休止状態になる前にスリープモードで過ごす時間を秒単位で指定する
タイムアウト= 1200秒で、20分を与えます
  1. 実際にハードワークを行うスクリプトを作成します。

    /usr/local/bin/delayed-hibernation.shコンテンツを含むファイルを作成します。

#!/ bin / bash
#スクリプト名:delayed-hibernation.sh
#目的:一定期間のスリープ後の自動休止状態
# `$ hibernation_conf`ファイルの` TIMEOUT`変数を編集して、スリープする秒数を設定します。

hibernation_lock = '/ var / run / delayed-hibernation.lock'
hibernation_fail = '/ var / run / delayed-hibernation.fail'
hibernation_conf = '/ etc / delayed-hibernation.conf'

#構成ファイルの確認
if [!-f $ hibernation_conf]; それから
    echo "構成ファイル( '$ hibernation_conf')がありません、中止します。"
    1番出口
fi
hibernation_timeout = $(grep "^ [^#]" $ hibernation_conf | grep "TIMEOUT =" | awk -F '=' '{print $ 2}' | awk -F '#' '{print $ 1}' | tr -d '[[\ t]]')
if ["$ hibernation_timeout" = ""]; それから
    echo "構成ファイル( '$ hibernation_conf')から 'TIMEOUT'パラメーターが欠落しています。中止します。"
    1番出口
エリフ[[!"$ hibernation_timeout" =〜^ [0-9] + $]]; それから
    echo "構成ファイル( '$ hibernation_conf')の不正な 'TIMEOUT'パラメーター( '$ hibernation_timeout')、予想される秒数、中止。
    1番出口
fi

#指定されたパラメーターの処理
if ["$ 2" = "suspend"]; それから
    curtime = $(日付+%s)
    if ["$ 1" = "pre"]; それから
        if [-f $ hibernation_fail]; それから
            echo "RTCウェイクアップタイマーの設定をスキップして、休止状態が検出されました。"
        他に
            echo "サスペンドが検出されました。録画時間、RTCタイマーの設定"
            echo "$ curtime"> $ hibernation_lock
            rtcwake -m no -s $ hibernation_timeout
        fi
    elif ["$ 1" = "post"]; それから
        if [-f $ hibernation_fail]; それから
            rm $ hibernation_fail
        fi
        if [-f $ hibernation_lock]; それから
            sustime = $(cat $ hibernation_lock)
            rm $ hibernation_lock
            if [$(($ curtime-$ sustime))-ge $ hibernation_timeout]; それから
                echo "サスペンドからの自動再開が検出されました。休止中..."
                systemctl hibernate
                if [$?-ne 0]; それから
                    echo "自動休止状態に失敗しました。代わりにサスペンドしようとしています。"
                    $ hibernation_failをタッチします
                    systemctlサスペンド
                    if [$?-ne 0]; それから
                        echo "自動休止状態とフェールオーバーの中断に失敗しました。他に試すことはありません。"
                    fi
                fi
            他に
                echo「サスペンドからの手動再開が検出されました。RTCタイマーをクリアしています」
                rtcwake -m disable
            fi
        他に
            echo "ファイル '$ hibernation_lock'が見つかりませんでした。
        fi
    他に
        echo "認識されない最初のパラメーター: '$ 1'、予期される 'pre'または 'post'"
    fi
他に
    echo "このスクリプトは、systemctl delayed-hibernation.serviceで実行されることを意図しています(2番目のパラメータ: 'suspend'が必要です)"
fi
  1. スクリプトを実行可能にします。
chmod 755 /usr/local/bin/delayed-hibernation.sh

https://bbs.archlinux.org/viewtopic.php?pid=1554259のようなインターネット上で見つけたこのスレッド内の他の応答に基づいてこのスクリプトを書くまでにかなりの時間がかかりました

私のバージョンのスクリプトは、休止状態が成功しなかった場合にサスペンド状態に陥るなど、多くの問題に対処しようとしますが、所定の時間が経過しても再び起動しないようにします。

  1. 最後のステップは、ただ実行することだ

    sudo systemctl daemon-reload
    sudo systemctl enable delayed-hibernation.service 
    

    新しいサービス/構成が使用されていることを確認します。

サービスログを確認するには、次を使用できます。

sudo systemctl status delayed-hibernation.service

またはサービス使用の完全なログの場合:

sudo journalctl -u delay-hibernation.service

実行中のサービスから取得する通常のログは次のとおりです。

mile @ mile-ThinkPad:〜$ sudo systemctl status delayed-hibernation.service 
●delayed-hibernation.service-休止状態の遅延トリガー
   ロード済み:ロード済み(/etc/systemd/system/delayed-hibernation.service; enabled; vendor preset:enabled)
   アクティブ:非アクティブ(デッド)

Jun 09 20:35:42 mile-ThinkPad systemd [1]:遅延休止状態トリガーの開始...
Jun 09 20:35:42 mile-ThinkPad delayed-hibernation.sh [2933]:サスペンドが検出されました。録画時間、RTCタイマーの設定
Jun 09 20:35:42 mile-ThinkPad delayed-hibernation.sh [2933]:rtcwake:RTCがUTCを使用すると仮定して...
6月9日20:35:42マイル-ThinkPad delay-hibernation.sh [2933]:rtcwake:6月9日18:55:43に/ dev / rtc0を使用したウェイクアップ
Jun 09 20:55:44 mile-ThinkPad systemd [1]:遅延休止トリガーを開始しました。
Jun 09 20:55:44 mile-ThinkPad systemd [1]:delayed-hibernation.service:ユニットはもう必要ありません。停止します。
Jun 09 20:55:44 mile-ThinkPad systemd [1]:遅延休止状態トリガーを停止しています...
Jun 09 20:55:44 mile-ThinkPad delayed-hibernation.sh [3093]:サスペンドからの自動再開が検出されました。休止中...
Jun 09 20:55:44 mile-ThinkPad systemd [1]:遅延休止状態トリガーを停止しました。
mile @ mile-ThinkPad:〜$ 

だから、これはそれだろう、私はこの便利な機能を動作させるために構成とスクリプトバージョンの正しい組み合わせを見つけようとして何日も費やしていたので、それが本当に誰かを助けることを願っています。


答えてくれてありがとう、これはまだUbuntu 18.04の魅力のように機能します。上記の答えを得ることができませんでした/bin/systemctl hibernate。systemdスクリプトで実行すると、コマンドラインでは正常に動作しますが、実行すると常に1が返されます。
eugenhu

4

万が一何かがうまくいかない場合に備えてpm-hibernate、コンピュータを実行させるよりもサスペンド状態にしたいです。以下を使用できます。

   ...
/usr/sbin/pm-hibernate || /usr/sbin/pm-suspend
   ...

3

ここでの更新されたバージョンだデレクPressnallの答えを持つ作品はsystemdにして含まれていることをEliahケーガンの提案は、ちょうどにドロップ/usr/lib/systemd/system-sleep/delayed_hibernation.shし、それを実行可能にします。

#!/bin/bash

hibernation_timeout=1800  #30 minutes

if [ "$2" = "suspend" ]; then
    curtime=$(date +%s)
    if [ "$1" = "pre" ]; then
        echo -e "[($curtime) $@]\nExecuting pre-suspend hook..." >> /tmp/delayed_hibernation.log
        echo "$curtime" > /var/run/delayed_hibernation.lock
        rtcwake -m no -s $hibernation_timeout
    elif [ "$1" = "post" ]; then
        echo -e "[($curtime) $@]\nExecuting post-suspend hook..." >> /tmp/delayed_hibernation.log
        sustime=$(cat /var/run/delayed_hibernation.lock)
        if [ $(($curtime - $sustime)) -ge $hibernation_timeout ]; then
            echo -e "Automatic resume detected, hibernating.\n" >> /tmp/delayed_hibernation.log
            systemctl hibernate || systemctl suspend
        else
            echo -e "Manual resume detected, clearing RTC alarm.\n" >> /tmp/delayed_hibernation.log
            rtcwake -m no -s 1
        fi
        rm /var/run/delayed_hibernation.lock
    fi
fi

これは、15.10で数か月間はうまく機能していましたが、16.04が原因で、スクリプトがまだ実行されていても、休止状態になりません。
ショーン

@Sean このスレッドで回避策を試しましたか?
ニッコロマッジョーニ

私を正しい方向に向けてくれてありがとう。上記のスクリプトを参照するsystemdサービス(/etc/systemd/system/delayed-hibernation.service)を作成し、/ etc / systemd / system / suspend.targetを変更して、delayed-hibernation.serviceを要求しました。
ショーン

2

これが私のレシピです(2つのノートブックUbuntu 16.04でテスト済み):

このスクリプトを好きな場所に置き(私はrootに置きます/syspend.sh)、実行可能にします(chmod +x /suspend.sh

TIMELOG=/tmp/autohibernate.log
ALARM=$(tail -n 1 $TIMELOG)
SLEEPTIME=5000 #edit this line to change timer, e.g. 2 hours "$((2*60*60))"
if [[ $1 == "resume" ]]
then
    if [[ $(date +%s) -ge $(( $ALARM + $SLEEPTIME )) ]]
    then
        echo "hibernate triggered $(date +%H:%M:%S)">>$TIMELOG
        systemctl hibernate 2>> $TIMELOG
    else
        echo "normal wakeup $(date +%H:%M:%S)">>$TIMELOG
    fi
elif [[ $1 == "suspend" ]]
then
    echo "$(date +%s)" >> $TIMELOG
    rtcwake -m no -s $SLEEPTIME
fi

次にsystemdターゲットを作成します: # touch /etc/systemd/system/suspend-to-sleep.target このコンテンツを貼り付けます:

#/etc/systemd/system/suspend-to-hibernate.service
[Unit]
Description=Delayed hibernation trigger
Before=suspend.target
Conflicts=hibernate.target hybrid-suspend.target
StopWhenUnneeded=true

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/bash /suspend.sh suspend
ExecStop=/bin/bash /suspend.sh wakeup

[Install]
WantedBy=sleep.target
RequiredBy=suspend.target

次に、有効にし# systemctl enable suspend-to-sleep.targetます。

私はノートブックの1つで問題に直面しました:ふたを閉じてもこのターゲットをトリガーしませんでした。これはxfce4-power-managerが原因でした。この問題を回避するには2つの方法があります。最初の方法は、/etc/systemd/logind.confファイルを編集してに置き換えるHandleLidSwitch=ignoreことHandleLidSwitch=suspendです。ただし、システム全体に適用されるため、スクリプトにシンボリックリンクを追加しました# ln -s /suspend.sh /etc/pm/sleep.d/0000rtchibernate


1

使用できるもう1つのより一般的な回避策hybrid-sleep(Mac OSと同様)。コンピューターが休止状態をサポートしている場合、この機能を使用できます。

systemctl hybrid-sleep

そのコマンドは、コンピューターを中断してディスクに送信(休止状態)する必要があります。しばらくすると、コンピューターの電源が切れます(電源を入れると、休止状態ファイルを使用して起動します)。

ps:OPが投稿したものとは正確に一致していませんが、かなり近いです


0

そのファイルをchmod + xすることを忘れずに、実行可能にしてください。

/ sys / class / rtc / rtc0でwakealarmを使用する、rtcwakeを使用しない別のソリューションがあります。カーネルが直接サポートしていないため、コメントの後にpm-functions(/ usr / lib / pm-utils)で廃止されたコードを使用します...、( 'cos現在のカーネル(3.6以降)は直接サポートします)。そのコードを元に戻し、do_suspend_hybrid()の代わりにdo_suspend()部分に入れます。

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