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? Буду радий почути про ваш досвід у коментарях!
2 коментарі
Додати коментар Підписатись на коментаріВідписатись від коментарів