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이 지원되지 않습니다.
James Caccese 2012 년

1
@JamesCaccese : 쉘 스크립트 세계에서 0은 "true"를 의미하고 다른 것은 "false"를 의미합니다. 스크립틀릿은 작동하지만 원래 포스터의 스크립틀릿은 의도 한대로 작동하여 지원되는 경우 '0'을 인쇄하고 지원되지 않는 경우에는 아무것도 인쇄하지 않습니다. 항상 지원되거나 지원되지 않는다고 말하는 것을 원한다면 'sudo pm-is-supported --suspend-hybrid && echo "supported"|| echo "unsupported" '
zanfur

@zanfur-두 상태를 인쇄하기위한 후속 공급 솔루션을 좋아하지만 ( pm-is-supported 예상치 못한 이유 가 예상대로 실행되지 않아 오류 상태에 알 수없는 일이 발생하지는 않습니다 ) James Caccese의 언급에 감사드립니다. 대 그주의, 전술 한 이유.
user66001 2016 년

당신이 사용하는 경우 16.04 볼 아래에 답을.
kapad

나를 위해 누락 된 부분은의 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

우분투 18.04 시간 옵션

에서 우분투 18.04 가 새로운 시간 제한 옵션이 있습니다. 에서이 systemd새로운 모드 availiable이다 suspend-then-hibernate. 절전 모드로 시작한 다음 고정 된 시간이 지나면 최대 절전 모드로 전환됩니다.

에서 hybrid-sleep배터리가 시스템 닫힌다 아래로 매우 낮고 경우에만 모드, 최대 절전 모드 부분은 효과적인 가져옵니다.

이 기능을 사용하려면 /etc/systemd/sleep.conf다음 내용 으로 파일을 작성해야 합니다.

[Sleep]
HibernateDelaySec=3600

이것은 1 시간의 수면 후 절전 모드에서 최대 절전 모드로 전환됩니다. HibernateDelaySec지연을 최대 절전 모드로 변경하도록 편집 할 수 있습니다 .

먼저 systemd를 사용하여 일시 중단 후 최대 절전 모드가 작동하는지 테스트하십시오.

Ctrl+ Alt+ 를 눌러 터미널을 열고 다음을 T입력하십시오.

sudo systemctl suspend-then-hibernate

작동하면 영구적으로 만듭니다.

  • 뚜껑을 닫으면 다음이 작동합니다 .

/etc/systemd/logind.conf원하는 편집기를 사용하여 파일 을여십시오. 다음과 같은 방법으로 당신의 관리 능력을 호출해야합니다 sudo, gksudo또는 pkexec이 파일을 편집 할 수 있습니다.

두 줄을 찾으십시오.

#HandleSuspendKey=suspend
#HandleLidSwitch=suspend

이 줄은 #그 앞에 주석 처리되어 있습니다. 은 suspend기본 동작입니다. 다음 두 줄 을 제거하고 다음 #과 같이 변경 하십시오.suspendsuspend-then-hibernate

HandleSuspendKey=suspend-then-hibernate
HandleLidSwitch=suspend-then-hibernate

파일을 저장하십시오. logind다음 명령으로 로그 아웃했다가 다시 로그인하거나 서비스를 다시 시작 하십시오.

systemctl restart systemd-logind.service

경고! 사용자 세션이 다시 시작됩니다

출처 : 뚜껑 닫힘 일시 중단 후 최대 절전 모드

우분투 16.04 이상

솔루션 에 의해 blueyed 리눅스 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원하는 편집기를 사용하여 파일 을여십시오. 다음과 같은 방법으로 당신의 관리 능력을 호출해야합니다 sudo, gksudo또는 pkexec이 파일을 편집 할 수 있습니다.

두 줄을 찾으십시오.

#HandleSuspendKey=suspend
#HandleLidSwitch=suspend

이 줄은 #그 앞에 주석 처리되어 있습니다. 은 suspend기본 동작입니다. 다음 두 줄 을 제거하고 다음 #과 같이 변경 하십시오.suspendhybrid-sleep

HandleSuspendKey=hybrid-sleep
HandleLidSwitch=hybrid-sleep

파일을 저장하십시오. 로그 아웃했다가 다시 로그인하십시오.

노트 :

  • 이외에 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에서 문제가 해결되었습니다. 감사.
kapad

천만에요. 이제 14.04에서 16.04로 옮겼으므로 시간이 지남에 따라 천천히 체계적으로 작업을 수행하는 새로운 방법을 찾고 있습니다.
user68186

1
Ubuntu GNOME 16.04.1
HarlemSquirrel

4

12.04에서 나는 최대 절전 모드가 트리거 될 때 (을 사용하여 PM_HIBERNATE_DELAY=XX) 쉘 스크립트 재개 / 해동이 grub recordfail 변수를 설정 해제하지 않는다는 것을 알았습니다. 따라서 grub은 자동 부팅되지 않습니다.

제한 시간이 -1로 설정되고 사용자 선택을 기다립니다. 나는 이것이에서 스크립트를 편집해야한다고 생각합니다 /etc/pm/sleep.d/10_grub-common. 초보자이기 때문에 불행히도 정확한 변화를 파악하려고 애 쓰지 않았습니다.


1
12.10 이상에서 작동한다면 아마도 버그 보고서 및 / 또는 테스트 가치가 있습니다.
blueyed

12.10
MDCore

3

이 질문은 Google에서 자주 제기되어 가치가 있다고 생각합니다. 여기에 설명 된 방법은 하이브리드 일시 중단이 아닌 (imo) 입니다. 「정지 중 × 분 후 최대 절전 모드」입니다. True 하이브리드 일시 중단은 RAM을 디스크에 기록한 다음 저전력 상태 (절전 모드)로 전환합니다. 시간이 더 걸리는 반면 기기에 배터리가 남아있는 동안 재개는 즉시 이루어지며 그렇지 않으면 하드 디스크에서 재개됩니다. 이 동작은 대부분의 사람들이 하이브리드 절전 모드로 알고 있으며 기본적으로 최신 Windows 및 Mac 랩톱에서 사용됩니다.

실제 하이브리드 일시 중단 을 활성화하는 방법은 다음과 같습니다 .

  • 최고 답변의 첫 부분을 따르십시오. pm-utils에서 "hybrid_suspend"를 수행하기위한 "suspend"호출을 무시합니다.
    % cat /etc/pm/config.d/00-use-suspend-hybrid
    # 항상 suspend 대신 suspend_hybrid를 사용하십시오
    [ "$ 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에서 작동합니다.

추신 : 향후 파일이 삭제 될 경우를 대비하여 패치를 재현합니다.

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 "디스크"> / sys / power / state
+ RET = $?
+ echo -n "$ HIBERNATE_MODE_SAVE"> / sys / power / disk
+ "$ RET"반환
+}
+ fi
+
둘 다 일시 중단을 지원하는 커널의 경우 + # (예 : 하이브리드 일시 중단)
커널 3.6 이후 + #
+ 경우 [-z "$ SUSPEND_HYBRID_MODULE"] && \
+ [-f / sys / power / disk] && \
+ grep -q 디스크 / sys / power / state && \
+ grep -q는 / sys / power / disk를 일시 중단합니다. 그때
+ SUSPEND_HYBRID_MODULE = "커널"
+ do_suspend_hybrid ()
+ {
+ HIBERNATE_MODE = "일시 중지"
+ do_hibernate
    }
 fi

출처 :


1
당신은 잡종 중단에 대해 옳습니다. 최근에 내 스 니펫을 직접 변경했습니다. METHOD = hibernate 및 HIBERNATE_MODE = suspend를 사용하여 동일한 결과를 얻을 수 있습니다. 이전 버전 (패치의 기능)을 저장하고 복원하는 대신 파일 맨 위에 HIBERNATE_MODE = platform을 설정하고 있습니다. 위의 답변을 업데이트하겠습니다.
blueyed

편집 해 주셔서 감사합니다. @blueyed
Rohan Dhruva

1

config.d에 파일을 추가하지 않고 / sys / class / rtc / rtc0에서 wakealarm을 사용하는 다른 솔루션이 있습니다. 커널이 직접 지원하지 않기 때문에 # pm-functions (/ usr / lib / pm-utils)에서 쓸모없는 코드를 사용하십시오. 해당 코드를 되돌리고 do_suspend_hybrid () 대신 do_suspend () 부분에 넣고 pm-functions에 대한 패치를 사용하십시오 (해결 될 때까지).

사용되지 않는 코드 (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의 이점을 최대화합니다. 되 돌린 코드를 uswsusp 모듈 (/usr/lib/pm-utils/module.d)의 do_suspend () 부분에 넣습니다.

복귀 된 코드 (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를 사용하면 suspend / hibernate의 진행 상황과 텍스트로 표시된 역 과정을 볼 수 있습니다. 심지어 백 스페이스를 눌러 중단 할 수도 있습니다. 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를 검색하여 설치하십시오. 그런 다음 그것을 시작하고 org-> gnome-> settings daemon-> plugins-> power로 이동하십시오.

"lid-close-ac-action"및 "lid-close-battery-action"값을 변경하십시오.

전원 설정에서이 옵션은 공백으로 표시되지만 의도 한대로 작동합니다.


0

에서 우분투 18.04 훨씬 더 easer. 에서 systemd 새로운 모드가 availiable이다 일시 중지 후 - 최대 절전 모드 . 이 기능을 사용하려면 다음 내용으로 /etc/systemd/sleep.conf 파일을 만들어야합니다 .

[Sleep]
HibernateDelaySec=3600

그런 다음 명령으로 테스트 할 수 있습니다.

sudo systemctl suspend-then-hibernate

(최대 절전으로의 지연을 줄이기 위해 HibernateDelaySec을 편집 할 수 있습니다). 모든 것이 제대로 작동하면 덮개 닫기 조치를 변경할 수 있습니다.이를 수행하려면 /etc/systemd/logind.conf 파일을 편집해야 합니다.

HandleLidSwitch = 옵션을 찾아 주석 처리를 제거하고 HandleLidSwitch = suspend-then-hibernate로 변경해야 합니다 . 그런 다음 다음 명령으로 로그인 서비스를 다시 시작해야합니다 (wirning! 사용자 세션이 다시 시작됨).

systemctl restart systemd-logind.service

그게 다야! 이제이 멋진 기능을 사용할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.