Як я можу використовувати за замовчуванням pm-suspend-гібрид замість pm-suspend?


41

Я хотів би використати гібридний метод призупинення замість призупинення при закриванні кришки або вибору в меню "Призупинити".

Я можу уявити, щоб змінити сценарій вечірнього призупинення, щоб зробити це автоматично, але може бути більш ремонтований / простіший спосіб.

Відповіді:


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-support --suspend-hybrid && echo $?', використовуйте 'sudo pm-is-support --suspend-hybrid; ехо $? ' оскільки повернене значення pm-is-підтримується 0 для підтримується, а 1 for - ні.
Джеймс Каксейз

1
@JamesCaccese: У світі оболонки 0 означає "справжнє", а все інше означає "хибне". Ваш сценарій буде працювати, але сценарій оригінального плаката також працюватиме за призначенням, друкуючи "0" на підтримуваному, а нічого не підтримується. Якщо ви хочете щось, що завжди скаже, що підтримується чи не підтримується, спробуйте "sudo pm-is-support --suspend-hybrid & & echo" підтримується "|| echo "непідтримуваний" '
zanfur

@zanfur - Хоча мені подобається, що ваше подальше рішення для друку обох станів (і нічого, з несподіваної причини, вечір підтримується не виконується так, як очікувалося, це могло б зробити невідомі речі до стану помилок ), я вдячний згадкою Джеймса Каксеза про це застереження, з вищезгаданої причини.
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-hybrid10-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щоб змінити затримку на сплячку.

По-перше, перевіряйте, чи працює призупинення, а потім сплячий режим, використовуючи 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з гвинтиком комп'ютер нормально зупиняє роботу, а не гібридний сон.

Джерело: 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 не завантажується автоматично.

Час очікування встановлено на -1, і він очікує вибору користувача. Я здогадуюсь, що це потребує певного редагування сценаріїв у /etc/pm/sleep.d/10_grub-common. Я новачок, тому я, на жаль, не намагався з'ясувати точну зміну.


1
Можливо, варто повідомити про помилку, ймовірно, та / або тестуючи, якщо він працює у 12.10+.
синюха

Я бачу таку ж проблему в 12.10
MDCore

3

Це питання виникає досить часто в Google, і я вважаю, що варто зупинитися. Описаний тут спосіб (imo) не є гібридним призупиненням. Це "сплячий режим після Хвилини в призупиненні". Справжня гібридна зупинка записує вашу оперативну пам’ять на диск, а потім переходить у стан малої потужності (режим сну). Хоча це займає більше часу, резюме залишається миттєвим, поки у апарату залишився акумулятор, інакше відновиться на жорсткому диску. Така поведінка - це те, що більшість людей знає як гібридний сон, і використовується за замовчуванням у новіших ноутбуках Windows та Mac.

Ось як увімкнути справжнє гібридне призупинення:

  • Дотримуйтесь першої частини верхньої відповіді. Це переосмислює виклик "призупинити", щоб зробити "hybrid_suspend" у pm-utils.
    % cat /etc/pm/config.d/00-use-suspend-hybrid
    # Завжди використовуйте suspend_hybrid замість призупинення
    if ["$ METHOD" = "призупинити"]; тоді
        METHOD = suspend_hybrid
    фі
  • Зробіть резервну копію / usr / lib / pm-utils / pm-функцій
  • Отримайте виправлення тут: https://bugs.freedesktop.org/attachment.cgi?id=68712
    • Цей патч дозволяє гібридне призупинення, якщо воно доступне (тобто на ядрах 3.6+)
  • Або застосуйте його за допомогою "patch -p0" або об'єднайте його вручну, якщо це не вдасться

Цей метод працює для мене на моїй Sony Vaio SVS.

PS: Відтворення тут виправлення у випадку, якщо файл буде видалено в майбутньому:

diff --біт a / pm / pm-functions.in b / pm / pm-functions.in
--- a / pm / pm-functions.in
+++ b / pm / pm-functions.in
@@ -316,8 +316,28 @@ якщо [-z "$ HIBERNATE_MODULE"] && \
    {
        [-n "$ {HIBERNATE_MODE}"] && \
        grep -qw "$ {HIBERNATE_MODE}" / sys / power / диск && \
+ 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 / диск
        echo -n "диск"> / sys / power / state
+ RET = $?
+ echo -n "$ HIBERNATE_MODE_SAVE"> / sys / power / disk
+ повернути "$ RET"
+}
+ фі
+
+ # для ядер, які підтримують призупинення обох (тобто гібридне призупинення)
+ # з ядра 3.6
+ якщо [-z "$ SUSPEND_HYBRID_MODULE"] && \
+ [-f / sys / power / disk] && \
+ grep -q диск / sys / power / state && \
+ grep -q призупинити / sys / power / диск; тоді
+ SUSPEND_HYBRID_MODULE = "ядро"
+ do_suspend_hybrid ()
+ {
+ HIBERNATE_MODE = "призупинити"
+ do_hibernate
    }
 фі

Джерела:


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

Це виглядає чудово, дякую за редагування, @blueyed
Rohan

1

Є ще одне рішення без додавання жодного файлу в 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, коли викликається призупинення):

        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, призупинення / сплячка просто з'являються-зникають дратівливо, особливо коли спрацьовує будильник і виконується сплячий режим (s2disk у uswsusp). Встановіть період сну перед сном у звичайному місці на файлі функцій pm.

# 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. Потім запустіть його та перейдіть до org -> gnome -> daemon settings -> plugins -> power.

Змініть значення "кришка-закрити-дію" та "кришка-закрити-акумулятор-дія".

У моїх параметрах живлення ці параметри відображаються як порожні, але вони працюють за призначенням.


0

В Ubuntu 18.04 він набагато легше. У systemd доступний новий режим призупинення- переходу в сплячку . Щоб почати використовувати цю функцію, вам потрібно створити файл /etc/systemd/sleep.conf із наступним вмістом:

[Sleep]
HibernateDelaySec=3600

Потім ви можете перевірити його командою:

sudo systemctl suspend-then-hibernate

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

Вам потрібно знайти варіант HandleLidSwitch = , відменюйте його та перейдіть на HandleLidSwitch = призупинити- перейти в сплячку . Тоді вам потрібно перезапустити службу реєстрації (wirning! Ви будете перезапущено сеанс користувача) наступною командою:

systemctl restart systemd-logind.service

Це все! Тепер ви можете використовувати цю приємну функцію.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.