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


41

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

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

Ответы:


44

Косвенный гибридный сон

Это более старый метод: сначала приостановите, а затем просыпайтесь в спящий режим через некоторое время (по умолчанию 15 минут). Используйте это с ядром Linux до 3.6, или, если вам нравится, он больше не потребляет энергию через 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, вы можете использовать следующее, что с самого начала приостановит работу как диска, так и ОЗУ.

Добавьте файл /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

Это всегда будет записывать образ на диск, а затем приостанавливать его в ОЗУ, имея преимущество в том, что возобновление всегда будет быстрым (до тех пор, пока не разрядится батарея) и что машина не будет просыпаться в течение короткого времени (после PM_HIBERNATE_DELAY) в спячку по-настоящему.

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


2
одна небольшая заметка, вместо 'sudo pm-is-поддерживается --suspend-hybrid && echo $?', используйте 'sudo pm-is-поддерживается --suspend-hybrid; эхо $? поскольку возвращаемое значение pm-is-Поддерживается 0 для поддерживается, и 1 для не поддерживается.
Джеймс Каччезе

1
@JamesCaccese: в мире шеллскриптов 0 означает «истина», а все остальное означает «ложь». Ваш скриптлет будет работать, но скриптлет оригинального плаката также будет работать так, как задумано, печатая «0» на поддерживаемых и ничего на неподдерживаемых. Если вы хотите что-то, что всегда говорит, что поддерживается или не поддерживается, попробуйте 'sudo pm-is-support --suspend-hybrid && echo "support" || echo "unsupported" '
zanfur

@zanfur - Хотя мне нравится ваше последующее решение для печати обоих состояний (и ничего по какой-либо неожиданной причине, которую pm-is- support не выполняет должным образом , что могло бы сделать неизвестные вещи с состоянием ошибки ), я ценю упоминание Джеймса Каччезе о это предостережение, по вышеупомянутой причине.
user66001

Если вы используете 16.04, см. Этот ответ ниже.
Капад

Единственный недостающий кусок для меня был resumeаргумент в /etc/default/grub.conf. Также как пользователь nvidia я должен был установить nomodeset. Таким образом , в результате чего запись потайного в моем случае: GRUB_CMDLINE_LINUX_DEFAULT="nomodeset resume=UUID=uuidofswappartition". Не стоит забывать grub-update. А также некоторые модули должны быть выгружены, поэтому созданный файл /etc/pm/config.d/00-unload_modulesсо строкой SUSPEND_MODULES="ath5k r8169"и просто для того, чтобы я также переименовал 00-use-suspend-hybrid в10-use-suspend-hybrid
mauron85

31

Ubuntu 18.04 - выбор времени

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

В этом hybrid-sleepрежиме часть режима гибернации становится эффективной только тогда, когда батарея разряжена до критического уровня и система отключается.

Чтобы начать использовать эту функцию, вам нужно создать файл /etc/systemd/sleep.confсо следующим содержанием:

[Sleep]
HibernateDelaySec=3600

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

Сначала проверьте, работает ли suspend-then-hibernate с помощью systemd.

Откройте терминал, нажав Ctrl+ Alt+, Tи введите:

sudo systemctl suspend-then-hibernate

Если это работает, сделайте это постоянным.

  • Следующее работает, когда я закрываю крышку .

Откройте файл /etc/systemd/logind.confс помощью предпочитаемого вами редактора. Вам нужно будет ссылаться на вашу административную власть sudo, gksudoили pkexecредактировать этот файл.

Найдите две строки:

#HandleSuspendKey=suspend
#HandleLidSwitch=suspend

Обратите внимание, эти строки закомментированы #перед ними. Действие suspendпо умолчанию. Удалите #и измените suspendна suspend-then-hibernateэти две строки, чтобы они выглядели так:

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

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

systemctl restart systemd-logind.service

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

Источник: Крышка закрыта Приостановить, а затем перевести в спящий режим

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по умолчанию. Удалите #и измените suspendна hybrid-sleepэти две строки, чтобы они выглядели так:

HandleSuspendKey=hybrid-sleep
HandleLidSwitch=hybrid-sleep

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

Заметка:

  • Кроме suspendили hybrid-sleepесть третий вариант hibernate.
  • Мой ноутбук не имеет физической кнопки сна. Поэтому я не смог проверить это.
  • Нажатие на Suspendиз меню Cog переводит компьютер в обычный режим ожидания, а не в режим гибридного сна.

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

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


2
Этот ответ нуждается в большем количестве голосов. Исправлены проблемы для меня в 16.04. Спасибо.
Капад

Добро пожаловать. Теперь, когда я перешел с 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+.
синеватый

Я вижу ту же проблему в 12.10
MDCore

3

Этот вопрос возникает в Google достаточно часто, и я думаю, что его стоит столкнуть. Описанный здесь метод (imo) не является гибридной приостановкой. Это "спящий режим после X минут в режиме ожидания". Настоящая гибридная приостановка записывает вашу оперативную память на диск, а затем переходит в режим пониженного энергопотребления (спящий режим). Хотя это занимает больше времени, возобновление происходит мгновенно, пока в машине остался аккумулятор, в противном случае возобновляется работа с жесткого диска. Такое поведение большинство людей называют гибридным сном и по умолчанию используется в новых ноутбуках с Windows и Mac.

Вот как включить реальную гибридную приостановку:

  • Следуйте первой части верхнего ответа. Это переопределяет вызов «suspend» для создания «hybrid_suspend» в pm-utils.
    % cat /etc/pm/config.d/00-use-suspend-hybrid
    # Всегда используйте suspend_hybrid вместо suspend
    if ["$ METHOD" = "suspend"]; тогда
        METHOD = suspend_hybrid
    фи
  • Сделайте резервную копию / usr / lib / pm-utils / pm-functions
  • Получить патч можно здесь: https://bugs.freedesktop.org/attachment.cgi?id=68712
    • Этот патч включает гибридную приостановку, если она доступна (например, в ядрах 3.6+)
  • Либо примените его с помощью 'patch -p0', либо объедините вручную, если это не удалось

Этот метод работает для меня на моем Sony Vaio SVS.

PS: Воспроизведение патча здесь на случай, если файл будет удален в будущем:

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"
+}
+ фи
+
+ # для ядер, поддерживающих приостановку к обоим (т.е. гибридную приостановку)
+ # начиная с ядра 3.6
+ if [-z "$ SUSPEND_HYBRID_MODULE"] && \
+ [-f / sys / power / disk] && \
+ grep -q диск / sys / power / state && \
+ grep -q suspend / sys / power / disk; тогда
+ SUSPEND_HYBRID_MODULE = "ядро"
+ do_suspend_hybrid ()
+ {
+ HIBERNATE_MODE = "приостановить"
+ do_hibernate
    }
 фи

Источники:


1
Вы правы насчет гибридной приостановки. Я недавно изменил свой фрагмент самостоятельно. Вы можете получить (вполне) тот же результат, используя METHOD = hibernate и HIBERNATE_MODE = suspend. Я устанавливаю HIBERNATE_MODE = платформу в верхней части файла, вместо сохранения и восстановления предыдущей версии (что делает патч). Я обновлю свой ответ выше.
синеватый

Это выглядит великолепно, спасибо за редактирование, @blueyed
Рохан Дхрува,

1

Есть другое решение без добавления какого-либо файла в config.d, просто с помощью wakealarm в / sys / class / rtc / rtc0. Используйте устаревший код в pm-functions (/ 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 мы можем видеть ход приостановки / гибернации и обратный процесс, отображаемый в тексте, даже мы можем прервать его, нажав клавишу backspace. Без uswsusp suspend / hibernate просто раздражающе появляется-исчезает, особенно когда срабатывает wakealarm и выполняется hibernate (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  

0

Ответ user68186 для Ubuntu 16.04 у меня не сработал. Тем не менее, решение здесь сделал.

Во-первых, обеспечьте работу спячки. затем

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

Измените значение «lid-close-ac-action» и «lid-close-battery-action».

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


0

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

[Sleep]
HibernateDelaySec=3600

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

sudo systemctl suspend-then-hibernate

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

Вам необходимо найти параметр HandleLidSwitch = , раскомментировать его и изменить на HandleLidSwitch = suspend-then-hibernate . Затем вам нужно перезапустить сервис logind (wirning! Ваш пользовательский сеанс будет перезапущен) следующей командой:

systemctl restart systemd-logind.service

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.