uswsusp를 systemd와 함께 사용하여 일시 중지한 다음 최대 절전 모드로 전환하는 방법은 무엇입니까?

uswsusp를 systemd와 함께 사용하여 일시 중지한 다음 최대 절전 모드로 전환하는 방법은 무엇입니까?

uswsusp를 사용하도록 일시 중지 후 최대 절전 모드 구성

나는 uswsusp를 사용하여 RAM을 일시 중단하고 systemd를 통해 디스크를 일시 중단합니다(최대 절전 모드). 그래서 /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내 생각에는 일시 중지 후 최대 절전 모드()의 시스템 구성도 조정해야 한다고 생각합니다. 하지만 어떤 모습일지는 모르겠습니다. uswsusp가 일시 중지 후 최대 절전 모드를 지원하는 것이 가능하거나 필요합니까?

저는 아치 리눅스를 사용하고 있습니다. 이 문제는 어느 정도 관련이 있습니다.이것.

/etc/systemd/system/systemd-suspens.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의 답변에서 영감을 받아 다음 솔루션/해결 방법을 구현했습니다.

/usr/local/bin/s2ram-then-s2disk.sh에서 생성한 사용자 정의 스크립트를 사용하기 위해 systemd-suspens-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-suspens-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

일시 중지 후 최대 절전 모드에 대한 실제 시스템 구성을 사용하지 않지만 대신 일반 일시 중지를 사용한 다음 시스템을 깨우고 선택한 지연 후 절전 모드로 전환하는 스크립트를 실행합니다.

(나의 경우 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. ]

어젯밤에 시스템에 추가하고 테스트 차원에서 컴퓨터를 이 상태로 두었습니다. 간단한 테스트를 통해 일시 중단이 작동한다는 것이 입증되었지만 오늘 밤 최대 절전 모드에서 다시 시작하는 테스트를 위해 배터리를 소모하고 싶었습니다.

관련 정보