web-dev-qa-db-ja.com

systemdでsuspes-then-hibernateにuswsuspを使用する方法は?

Uswsuspを使用するようにsuspend-then-hibernateを構成します

Uswsuspを使用してRAMにサスペンドし、systemdを介してディスクにサスペンド(休止状態)します。したがって、/etc/systemd/system/systemd-suspend.service.d/override.conf/etc/systemd/system/systemd-hibernate.service.d/override.confを調整しました。

一時停止および休止状態の作業は、uswsuspを使用して検索します。私の問題は、systemdがまだカーネルのswsuspをsuspend-then-hibernateに使用していることです。もちろん、これにより、mkinitcpioフックが間違っているため、休止状態からの復元中にエラーが発生します。

Suspend-then-hibernate(/etc/systemd/system/systemd-suspend-then-hibernate.service.d/override.conf)のsystemd構成も調整する必要があると思います。しかし、私はそれがどのように見えなければならないのか分かりません。それも可能ですか、それともsuswsuspがsuspend-then-hibernateをサポートする必要がありますか?

私はArchLinuxを使用しています。この質問はどういうわけか これ に関連しています。

/etc/systemd/system/systemd-suspend.service.d/override.conf:

[Service]
ExecStart=
ExecStartPre=-/usr/bin/run-parts -v -a pre /usr/lib/systemd/system-sleep
ExecStart=/usr/bin/s2ram
ExecStartPost=-/usr/bin/run-parts -v --reverse -a post /usr/lib/systemd/system-sleep

/etc/systemd/system/systemd-hibernate.service.d/override.conf:

[Service]
ExecStart=
ExecStartPre=-/usr/bin/run-parts -v -a pre /usr/lib/systemd/system-sleep
ExecStart=/usr/bin/s2disk
ExecStartPost=-/usr/bin/run-parts -v --reverse -a post /usr/lib/systemd/system-sleep
1
jojoob

私は同じことをしようとしていて、あなたと同じ時点で立ち往生し、それを構成する方法を知りませんでした。結局、私はここの答えで私のために働いた回避策を見つけました: https://superuser.com/a/1153147

Suspend-then-hibernateに実際のsystemd構成を使用せず、代わりに通常のサスペンドを使用しますが、選択した遅延の後にスクリプトを実行して、システムをウェイクアップし、休止状態にします。

(Ubuntu 18.04の私にとって、正しいパスは/lib/systemd/system-sleep/ではなく/usr/lib/systemd/system-sleep/であったことに注意してください)

2
Adam Lett

次の解決策/回避策に実装した@AdamLettの回答に触発されました。

/usr/local/bin/s2ram-then-s2disk.shで作成したカスタムスクリプトを使用するようにsystemd-suspend-then-hibernateサービスを編集しました

#!/bin/bash
# Custom suspend-then-hibernate script using uswsusp.

# Edit the "HibernateDelaySec" variable below to set the number
# of seconds to remain in suspend before hibernate.
HibernateDelaySec=1200

curtime=$(date +%s)
lock=/tmp/rtchibernate.lock

# Suspending... Record current time and set a wake up timer.
echo "$curtime" > $lock
rtcwake -m no -s $HibernateDelaySec
s2ram

# The systen is now suspended.

# Coming out of sleep...
curtime=$(date +%s)
sustime=`cat $lock`
rm $lock

# Did we wake up due to the rtc timer above?
if [ $(($curtime - $sustime)) -ge $HibernateDelaySec ]; then
    # Hibernate (suspend to disk)...
    s2disk
else
    # Cancel the rtc timer and wake up normally.
    rtcwake -m disable
fi

/etc/systemd/system/systemd-suspend-then-hibernate.service.d/override.conf

[Service]
ExecStart=
ExecStartPre=-/usr/bin/run-parts -v -a pre /usr/lib/systemd/system-sleep
ExecStart=/usr/local/bin/s2ram-then-s2disk.sh
ExecStartPost=-/usr/bin/run-parts -v --reverse -a post /usr/lib/systemd/system-sleep
2
jojoob

私はこれに対する答えに出くわしましたが、URLがありません(当時はホームシステムで作業していました)。 「-apre」および「-apost」ExecStart行の後に「-ahibernate」を追加する必要があります。以前の投稿で述べたようにUbuntuを使用しているので、システムスリープのパスも変更する必要がありました。

例:

[Service] 
ExecStart=
ExecStartPre=-/usr/bin/run-parts -v -a pre -a hibernate /lib/systemd/system-sleep
ExecStart=/usr/bin/s2disk
ExecStartPost=-/usr/bin/run-parts -v --reverse -a post -a hibernate /lib/systemd/system-sleep
1
Kevin Thompson

ハイブリッドスリープ用に次のsystemdサービスを作成します(一時停止してから休止状態にします)。

ファイル名:/etc/systemd/system/systemd-hybrid-sleep.service.d/override.conf

[Service] 
ExecStart=
ExecStartPre=-/usr/bin/run-parts -v -a pre -a hybrid-sleep /lib/systemd/system-sleep
ExecStart=/usr/bin/s2both
ExecStartPost=-/usr/bin/run-parts -v --reverse -a post -a hybrid-sleep /lib/systemd/system-sleep

[編集:-a hybrid-sleeps2bothの使用に注意してください。]

私は昨夜これをシステムに追加し、テストとしてマシンをこの状態のままにしました。短いテストでサスペンドが機能することが証明されましたが、今夜の休止状態からの復元をテストするためにバッテリーを消耗させたいと思いました。

0
Kevin Thompson