Suspend-then-Hibernate на Steam Deck: сплячий режим без розрядки батареї

Привіт, читачі DOU! Чи знайома вам ситуація, коли ви переводите свою улюблену портативну ігрову консоль у сплячий режим, а через кілька годин виявляєте, що вона повністю розряджена? Ця поширена проблема сплячого режиму (suspend) стала справжнім головним болем для багатьох користувачів. Сьогодні я радий поділитися рішенням, яке може кардинально змінити те, як ми використовуємо наші Steam Deck: працюючим режимом suspend-then-hibernate.

Дисклеймер: У цій статті представлено огляд рішення suspend-then-hibernate для Steam Deck. Для покрокової інструкції рекомендую звернутися до мого повного керівництва на GitHub. Модифікація системи пов’язана з певними ризиками, і вкрай важливо діяти з обережністю та розумінням процесу. Я не даю жодних гарантій, і ви робите це на свій страх і ризик.

Проблема розрядки батареї

Режим призупинення Steam Deck, хоча й зручний для швидкого доступу, має суттєвий недолік: він продовжує споживати енергію навіть у «сплячому» стані. Це призводить до кількох неприємних сценаріїв:

  • Повернення до повністю розрядженого пристрою через кілька днів
  • Втрата ігрового прогресу через неочікувані вимкнення
  • Необхідність постійно повністю вимикати та перезапускати пристрій
  • Необхідність щоразу проходити екрани завантаження

Альтернативою є повне вимкнення пристрою, але тоді ви втрачаєте прогрес і час на повернення до гри.

А якщо я скажу, що можна уникнути цих недоліків?

Що пропонує це рішення

Після обширних досліджень і тестування на моєму Steam Deck OLED, я знайшов робочу конфігурацію, яка:

  • Спочатку переводить ваш Deck у режим призупинення (suspend) для можливості швидкого відновлення
  • Автоматично переходить у повний режим гібернації після заданого часу
  • Зберігає весь стан гри з нульовим споживанням батареї
  • Працює безшовно з SteamOS (немає необхідності в альтернативних операційних системах)

Уявіть: ви берете Steam Deck через тиждень, натискаєте кнопку живлення, і через кілька секунд відновлюєте гру точно в тому місці, де зупинилися — а заряд батареї залишився на тому ж рівні!

Переваги в реальному використанні

З моменту впровадження цього рішення на моєму Steam Deck OLED я помітив кардинальні зміни у використанні пристрою:

  • Збільшений час автономної роботи: Deck зберігає той самий рівень заряду батареї протягом днів, коли не використовується
  • Безшовні ігрові сесії: я можу продовжити точно з того місця, де зупинився, навіть після тривалих перерв
  • Душевний спокій: більше жодного занепокоєння про те, що я забув повністю вимкнути пристрій

Обмеження та особливості

Хоча це рішення чудово працює у більшості випадків, є кілька моментів, які слід враховувати:

  • Реалізація вимагає певного комфорту з операціями в командному рядку
  • Графічно важкі ігри іноді можуть вимагати особливого підходу

Існуючі проблеми

Розробка цього рішення не обійшлася без проблем. Деякі ключові труднощі, з якими я зіткнувся:

  • Драйвери AMD іноді «відмовляються» працювати під час гібернації з графічно інтенсивними іграми
  • Альтернативні ОС на Steam Deck створюють більше проблем, ніж вирішують
  • Офіційна SteamOS не має повноцінної функціональності suspend-then-hibernate з коробки
  • Деяке обладнання не працює належним чином після відновлення, але є обхідні шляхи

Огляд керівництва: крок за кроком

Ось короткий покроковий огляд для реалізації suspend-then-hibernate на вашому Steam Deck. І знову, рекомендую звернутися до повного керівництва на GitHub. Тут лише коротко викладаю основні кроки.

Підготовка системи

  • Встановіть розмір буфера UMA на 1 ГБ у BIOS для оптимальної продуктивності
  • (За бажанням) Вимкніть швидке завантаження в BIOS для економії заряду батареї при вимкненому пристрої.

Підготовка файлу підкачки (для файлової системи ext4 за замовчуванням)

  • Розширте файл підкачки до 20 ГБ для достатнього простору гібернації
  • (За бажанням) Дефрагментуйте файл підкачки для забезпечення безперервного зберігання
  • Отримайте UUID розділу файлу підкачки та зміщення для правильного відновлення:

Офсет файлу:Отримайте UUID монтування файлу підкачки (home):

sudo findmnt -no UUID -T /home/swapfile
sudo filefrag -v /home/swapfile | awk '$1=="0:" {print substr($4, 1, length($4)-2)}'

Для користувачів BTRFS зверніться до повного керівництва на GitHub.

Налаштування гібернації з файлу

  • Налаштуйте ядро для відновлення з файлу підкачки при завантаженні
  • Відредагуйте /etc/default/grub для налаштування відновлення з файлу підкачки. Знайдіть GRUB_CMDLINE_LINUX_DEFAULT= і додайте в кінець рядка (всередині лапок) resume=/dev/disk/by-uuid/{{RESUME_PARTITION_UUID}} resume_offset={{OFFSET}} (значення з попередніх кроків). Потім виконайте sudo update-grub для застосування змін.
  • Дозвольте гібернацію з файлом підкачки, налаштувавши конфігурацію служби logind:
systemctl edit systemd-logind.service

Вставте цей контент на початок файлу та збережіть його (Ctrl+O, Ctrl+X):

[Service]       
Environment=SYSTEMD_BYPASS_HIBERNATION_MEMORY_CHECK=1

Увімкнення Suspend-then-Hibernate

  • Замініть звичайний suspend на suspend-then-hibernate, використовуючи симлінк:

sudo ln -sf /usr/lib/systemd/system/systemd-suspend-then-hibernate.service /etc/systemd/system/systemd-suspend.service

  • Налаштуйте sleep.conf для бажаної затримки гібернації:
sudo nano /etc/systemd/sleep.conf

Додайте або змініть наступні рядки:

AllowSuspendThenHibernate=yes 
HibernateDelaySec=60min

Обхід проблем з Bluetooth

  • Створіть та реалізуйте скрипт fix-bluetooth /home/deck/.local/bin/fix-bluetooth.sh з наступним вмістом:
    #!/bin/bash
    PATH=/sbin:/usr/sbin:/bin:/usr/bin
    is_bluetooth_ok() {
        echo "Checking Bluetooth status..."
        bluetoothctl discoverable on
        if [ $? -ne 0 ]; then
            echo "Bluetooth is misbehaving."
            return 1  # Bluetooth needs fixing
        else
            echo "Bluetooth is working fine."
            return 0  # Bluetooth is OK
        fi
    }
    sleep 2 # make sure system woke up completely
    if ! is_bluetooth_ok; then
        # if bluetooth problem detected, reinitialize the driver
        (echo serial0-0 > /sys/bus/serial/drivers/hci_uart_qca/unbind ; sleep 1 && echo serial0-0 > /sys/bus/serial/drivers/hci_uart_qca/bind)
    fi

І зробіть його виконуваним:

sudo chmod +x /home/deck/.local/bin/fix-bluetooth.sh

  • Налаштуйте systemd-сервіс для запуску скрипта після відновлення: Створіть файл /etc/systemd/system/fix-bluetooth-resume.service з наступним вмістом:
    [Unit]
    Description=Fix Bluetooth after resume
    After=hibernate.target hybrid-sleep.target suspend-then-hibernate.target bluetooth.service
    [Service]
    Type=oneshot
    ExecStart=/home/deck/.local/bin/fix-bluetooth.sh
    [Install]
    WantedBy=hibernate.target hybrid-sleep.target suspend-then-hibernate.target
   

Увімкніть сервіс:

sudo systemctl enable fix-bluetooth-resume.service
sudo chmod +x /home/deck/.local/bin/fix-bluetooth.sh

Усунення несправностей

  • Перевірте перезаписані файли після оновлень SteamOS
  • Налаштуйте параметри для ігор з високим використанням пам’яті так, щоб використання RAM + VRAM не перевищувало 15 ГБ.

Для користувачів BTRFS та більш докладних інструкцій зверніться до повного керівництва на GitHub.

Висновок

Steam Deck — неймовірний пристрій, і реалізація suspend-then-hibernate усуває один з його найбільш значних недоліків. Я радий поділитися цим рішенням із спільнотою і сподіваюся, що воно покращить ваш досвід використання Steam Deck так само, як і мій. Тепер я можу сказати, що мій стімдек повністю ідеальний.

А ви вже пробували реалізувати suspend-then-hibernate на своєму Steam Deck? Буду радий почути про ваш досвід у коментарях!

Підписуйтеся на Telegram-канал @gamedev_dou, щоб не пропустити найважливіші статті і новини про геймдев

👍ПодобаєтьсяСподобалось5
До обраногоВ обраному1
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

для decky есть специальный плагин, AutoSuspend

меня больше напрягает, что проблему с периодически ломающимся звуком после сна так и не починили за три года

Так, інколи я помічав що є поскрипування звуку щосекунди. Для цього був фікс та проблема стала рідшою, але траплялася. Покищо після кількох десятків пробуджень із гібернації цієї проблеми не помічав.

Підписатись на коментарі