Как стать автором
Обновить

# Suspend-then-Hibernate на Steam Deck: спящий режим без рязряда батареи

Уровень сложностиСредний
Автор оригинала: Deckorator

Привет хабровчане! Знакома ли вам ситуация, когда вы переводите свою любимую портативную игровую консоль в спящий режим, а через несколько часов обнаруживаете, что она полностью разряжена? Эта распространенная проблема спящего режима (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. Здесь лишь кратко излагаю основные шаги.

  1. Подготовка системы

    • Установите размер буфера UMA на 1 ГБ в BIOS для оптимальной производительности

    • (По желанию) Отключите быструю загрузку в BIOS для экономии заряда батареи при выключенном устройстве.

  2. Подготовка файла подкачки (для файловой системы ext4 по умолчанию)

    Для пользователей BTRFS обратитесь к полному руководству на GitHub.

    • Расширьте файл подкачки до 20 ГБ для достаточного пространства гибернации

    • (По желанию) Дефрагментируйте файл подкачки для обеспечения непрерывного хранения

    • Получите UUID раздела файла подкачки и смещение для правильного восстановления:

    Оффсет файла:

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

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

    sudo findmnt -no UUID -T /home/swapfile
  3. Настройка гибернации с файла

    • Настройте ядро для восстановления из файла подкачки при загрузке

    • Отредактируйте /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
  4. Включение 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
  5. Обход проблем с 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
  6. Устранение неполадок

    • Проверьте перезаписанные файлы после обновлений SteamOS

    • Настройте параметры для игр с высоким использованием памяти так, чтобы использование RAM + VRAM не превышало 15 ГБ.

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

Заключение

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

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

Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.