配置 suspend-then-hibernate 以使用 uswsusp
我使用 uswsusp 通过 systemd 挂起到 RAM 并挂起到磁盘(休眠)。因此我调整了/etc/systemd/system/systemd-suspend.service.d/override.conf
和/etc/systemd/system/systemd-hibernate.service.d/override.conf
。
使用 uswsusp 查找挂起和休眠工作。我的问题是 systemd 仍然使用内核的 swsusp 进行挂起然后休眠。当然,这会导致从休眠状态恢复时由于错误的 mkinitcpio 挂钩而失败。
/etc/systemd/system/systemd-suspend-then-hibernate.service.d/override.conf
我认为还需要调整 suspend-then-hibernate () 的 systemd 配置。但我不知道它一定是什么样子。是否有可能或者是否需要 uswsusp 支持暂停然后休眠?
我在 arch linux 上。这个问题在某种程度上与这个。
/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
受到@AdamLett 的回答的启发,我实施了以下解决方案/解决方法。
我编辑了 systemd-suspend-then-hibernate 服务以使用我在 /usr/local/bin/s2ram-then-s2disk.sh 创建的自定义脚本
#!/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
我想做同样的事情,但和你陷入了同样的困境,不知道如何配置它。最后我在这里的答案中找到了一个对我有用的解决方法:https://superuser.com/a/1153147
它不使用实际的 systemd 配置进行先挂后休眠,而是使用正常的挂起,然后在您选择的延迟后运行一个脚本,唤醒系统并将其置于休眠状态
(请注意,对于我来说,在 Ubuntu 18.04 上,正确的路径是/lib/systemd/system-sleep/
而不是/usr/lib/systemd/system-sleep/
)
答案3
我遇到了这个问题的答案,但没有 URL(当时在家庭系统上工作)。您需要在“-a pre”和“-a post”ExecStart 行之后添加“-a hibernate”。我还必须更改系统睡眠的路径,因为我使用的是 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
答案4
为混合睡眠(暂停然后休眠)创建以下 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-sleep
和的使用s2both
。]
我昨晚将其添加到我的系统中,并将我的机器保持在这种状态作为测试。一个简短的测试证明暂停有效,但我想让我的电池耗尽以测试今晚从休眠状态的恢复。