# Suspend-then-Hibernate на Steam Deck: спящий режим без рязряда батареи
Привет хабровчане! Знакома ли вам ситуация, когда вы переводите свою любимую портативную игровую консоль в спящий режим, а через несколько часов обнаруживаете, что она полностью разряжена? Эта распространенная проблема спящего режима (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 по умолчанию)
Для пользователей 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
Настройка гибернации с файла
Настройте ядро для восстановления из файла подкачки при загрузке
Отредактируйте /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
Устранение неполадок
Проверьте перезаписанные файлы после обновлений SteamOS
Настройте параметры для игр с высоким использованием памяти так, чтобы использование RAM + VRAM не превышало 15 ГБ.
Для пользователей BTRFS и более подробных инструкций обратитесь к полному руководству на GitHub.
Заключение
Steam Deck — невероятное устройство, и реализация suspend-then-hibernate устраняет один из его наиболее значительных недостатков. Я рад поделиться этим решением с сообществом и надеюсь, что оно улучшит ваш опыт использования Steam Deck так же, как и мой. Теперь я могу сказать что мой стимдек полностью идеален.
А вы уже пробовали реализовать suspend-then-hibernate на своем Steam Deck? Буду рад услышать о вашем опыте в комментариях!