Как мне использовать pm-suspend-hybrid по умолчанию вместо pm-suspend?

Я хотел бы использовать гибридный метод приостановки вместо приостановки при закрытии крышки или выборе «Suspend» из меню.

Я могу себе представить, чтобы скрипт pm-suspend делал это автоматически, но может быть более удобный / более простой способ.

43
задан 2 June 2012 в 14:38

7 ответов

Непрямой гибридный спящий режим

Это более старый метод: сначала приостановить, а затем выйти из спящего режима после задержки (по умолчанию 15 минут). Используйте это с ядром Linux до 3.6, или, если хотите, он больше не потребляет питание через 15 минут.

Добавьте файл /etc/pm/config.d/00-use-suspend- гибрид :

# 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, вы можете использовать следующее, которое с самого начала приостановит и диск, и оперативную память.

Добавьте файл / etc /pm/config.d/00-use-suspend-hybrid:[1216 impression Это всегда будет записывать образ на диск, а затем приостанавливать его в ОЗУ, имея преимущества, заключающиеся в том, что возобновление всегда будет быстрым (пока батарея не заканчивается), и что машина не просыпается в течение короткого времени (после PM_HIBERNATE_DELAY) для реального перехода в спящий режим.

Недостатком является то, что процесс занимает больше времени (потому что он всегда переходит в спящий режим на диск), и что ваша батарея может закончиться в долгосрочной перспективе (например, через 12 часов).

44
ответ дан 2 June 2012 в 14:38

В 12.04 я заметил, что при срабатывании спящего режима (с помощью PM_HIBERNATE_DELAY=XX), сценарии оболочки не сбрасывают переменную grub recordfail. Поэтому grub не осуществляет автозагрузку.

Тайм-аут установлен на -1 и ждет выбора пользователя. Полагаю, это требует некоторого редактирования скриптов в /etc/pm/sleep.d/10_grub-common. Я новичок, поэтому, к сожалению, не смог разобраться с точным изменением.

4
ответ дан 2 June 2012 в 14:38

Tas jautājums Google tīklā parādās pietiekami bieži, ka, manuprāt, ir vērts sasist. Šeit aprakstītā metode ir (imo) nevis hibrīda suspensija. Tas ir "pārziemojis pēc X minūtes apturēšanas". Patiesa hibrīda apturēšana izraksta jūsu RAM uz diska un pēc tam iet mazjaudas stāvoklī (miega režīmā). Lai gan tas prasa ilgāku laiku, atsākšana notiek uzreiz, kamēr mašīnai ir atstāts akumulators, pretējā gadījumā atsāk no cietā diska. Šo uzvedību lielākā daļa cilvēku zina kā miega miegu un pēc noklusējuma to izmanto jaunākajos Windows un Mac klēpjdatoros.

Lūk, kā iespējot reālā hibrīda apturēšanu:

  • Izpildiet augšējā atbilde. Tas ignorē zvanu "apturēt", lai veiktu "hybrid_suspend" pm-utils.
    % cat /etc/pm/config.d/00-use-suspend-hybrid
    # Always use suspend_hybrid instead of suspend
    if [ "$METHOD" = "suspend" ]; then
        METHOD=suspend_hybrid
    fi
  • Izveidojiet / usr / lib / pm-utils / pm-function
  • dublējumu. Ielādējiet ielāpu šeit: https: //bugs.freedesktop.org/attachment.cgi?id=68712
    • Šis plāksteris ļauj hibrīda apturēšanu, ja tāda ir pieejama (ti, kodolos 3.6 +).
  • Vai nu lietojiet to, izmantojot 'patch -p0', vai manuāli apvienojiet, ja neizdodas

Šī metode man der manam Sony Vaio SVS.

PS: Ja šeit fails tiks izdzēsts, šeit atkārtot plāksteri:

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 "disk" > /sys/power/state
+       RET=$?
+       echo -n "$HIBERNATE_MODE_SAVE" > /sys/power/disk
+       return "$RET"
+   }
+fi
+
+# for kernels that support suspend to both (i.e. hybrid suspend)
+# since kernel 3.6
+if [ -z "$SUSPEND_HYBRID_MODULE" ] && \
+   [ -f /sys/power/disk ] && \
+   grep -q disk /sys/power/state && \
+   grep -q suspend /sys/power/disk; then
+   SUSPEND_HYBRID_MODULE="kernel"
+   do_suspend_hybrid()
+   {
+       HIBERNATE_MODE="suspend"
+       do_hibernate
    }
 fi

Avoti:

3
ответ дан 2 June 2012 в 14:38

Ответ пользователя 68186 для Ubuntu 16.04 у меня не сработал. Однако решение здесь сработало.

Во-первых, убедитесь, что спящий режим работает. Затем

Найдите и установите редактор dconf в программном обеспечении Ubuntu. Затем запустите его и перейдите в org -> gnome -> settings daemon -> plugins -> мощность.

Измените значение «закрытие крышки переменного тока» и «Lid-close-battery-action».

В моих настройках питания эти параметры отображаются как пустые, но работают должным образом.

0
ответ дан 2 June 2012 в 14:38

В Ubuntu 18.04 это намного проще. В systemd доступен новый режим suspend-then-hibernate. Для начала использования этой функции необходимо создать файл /etc/systemd/sleep.conf со следующим содержимым:

[Sleep]
HibernateDelaySec=3600

Затем вы можете протестировать его командой:

sudo systemctl suspend-then-hibernate

(вы можете отредактировать HibernateDelaySec, чтобы уменьшить задержку до спячки). Если все работает нормально, вы можете изменить действие по закрытию крышки, для этого нужно отредактировать файл /etc/systemd/logind.conf

Вам нужно найти опцию HandleLidSwitch=, прокомментировать ее и поменять на HandleLidSwitch=suspend-then-hibernate. Затем необходимо перезапустить службу логирования (wirning! you user session will be restarted) следующей командой:

systemctl restart systemd-logind.service

Вот и все! Теперь вы можете использовать эту замечательную функцию.

0
ответ дан 2 June 2012 в 14:38

Ubuntu 18.04 временная опция

В Ubuntu 18.04 есть новая временная опция. В systemd доступен новый режим приостановка-затем-гибернация . Это начнется с режима сна, а затем перейдет в режим гибернации через фиксированное время.

В режиме гибридного спящего режима часть гибернации вступает в силу только тогда, когда уровень заряда батареи критически низкий и система выключается.

Чтобы начать использовать эту функцию, вам необходимо создать файл /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 на suspend-then-hibernate в этих двух строках, чтобы они выглядели следующим образом:

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

Сохраните файл. Выйдите из системы и войдите снова или перезапустите службу logind с помощью команды:

systemctl restart systemd-logind.service

предупреждение! ваш сеанс пользователя будет перезапущен

Источник: Lid Closed Suspend, затем Hibernate

Ubuntu 16.04 и выше

Решение от blueyed для приостановки реального гибрида с Linux 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 на hybrid-sleep в этих двух строках, чтобы они выглядели следующим образом:

HandleSuspendKey=hybrid-sleep
HandleLidSwitch=hybrid-sleep

Сохраните файл. Выйдите из системы и войдите снова.

Примечание:

  • Кроме приостановить или гибридный спящий режим , существует третий вариант, спящий режим .
  • ] На моем ноутбуке нет физической кнопки сна. Так что я не смог это проверить.
  • Щелчок по Приостановить в меню шестеренки переводит компьютер в нормальная приостановка, а не гибридный сон.

Источник: https://superuser.com/questions/719447/how-to-use-systemd-hybrid-sleep-instead-of-suspend-under-gnome-in -linux

Надеюсь, это поможет

34
ответ дан 2 June 2012 в 14:38

Есть другое решение, не добавляя никаких файлов в config.d, просто используя wakealarm в / sys / class / rtc / rtc0. Используйте устаревший код в pm-функциях (/ usr / lib / pm-utils) после комментариев #, поскольку ядро ​​не поддерживает напрямую ..., (потому что текущее ядро ​​(что-то после 3.6) поддерживает напрямую). Верните этот код и вставьте часть do_suspend () вместо do_suspend_hybrid () и используйте патч для pm-функций (пока они не исправят его).

Устаревший код (приостановить, а затем перейти в спящий режим при вызове 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, когда они приостановлены. Поместите восстановленный код в часть do_suspend () модуля uswsusp (/usr/lib/pm-utils/module.d).

Отмененный код (suspend_hybrid при вызове 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      

С uswsusp мы можем видеть прогресс приостановки / гибернации и обратный процесс, отображаемый в тексте, даже если мы можем прервать его, нажав клавишу возврата. Без uswsusp режимы приостановки / гибернации просто появляются-исчезают досадно, особенно когда срабатывает wakealarm и запускается спящий режим (s2disk в uswsusp). Установите период ожидания перед переходом в спящий режим в обычном месте в файле pm-functions.

# variables to handle hibernate after suspend support
PM_HIBERNATE_DELAY=900  # 15 minutes
PM_RTC=/sys/class/rtc/rtc0

Вот мод uswsusp: (помните, этот модуль вызывается из pm-функций, поэтому вставленные переменные одинаковы)

#!/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  
1
ответ дан 2 June 2012 в 14:38

Другие вопросы по тегам:

Похожие вопросы: