Ноутбук на Linux уходит в сон, но при пробуждении показывает чёрный экран — типичный признак того, что стандартный режим приостановки ядра не подходит вашему железу, и его поведение нужно переопределить через параметры ядра или настройки systemd. Чаще всего проблема связана с выбором состояния сна: современные платформы Intel и AMD используют s2idle, тогда как многие дистрибутивы по умолчанию ориентируются на классический режим deep (suspend-to-RAM).
В этой статье разберём, как определить текущий режим приостановки, переопределить его через параметры ядра и конфигурацию systemd-sleep, а также как отладить зависания при входе в сон и выходе из него. Все шаги обратимы и не требуют перепрошивки или модификации оборудования.
Как ядро Linux реализует приостановку
Ядро Linux поддерживает несколько состояний сна, которые перечислены в файле /sys/power/state. Основные из них: freeze (минимальное энергосбережение без отключения устройств), mem (suspend-to-RAM, содержимое памяти сохраняется, питание большинства компонентов отключается) и disk (гибернация, образ памяти записывается на диск).
Режим mem сам по себе имеет внутренние варианты, перечисленные в /sys/power/mem_sleep. Текущий активный вариант выделен квадратными скобками. Именно здесь чаще всего и требуется переопределение: если прошивка материнской платы некорректно поддерживает S3 (режим deep), система может зависать или мгновенно просыпаться.
- 🔍 s2idle — лёгкий сон, процессор остаётся в состоянии низкого энергопотребления, пробуждение почти мгновенное.
- 💤 shallow — промежуточный вариант, зависит от поддержки платформы.
- 🛌 deep — классический suspend-to-RAM через ACPI S3, максимальная экономия заряда.
- 💾 disk — гибернация, требует настроенного swap достаточного объёма.
Диагностика: определяем текущий режим
Прежде чем что-то переопределять, проверьте, какие режимы доступны на вашей машине и какой активен сейчас. Для этого достаточно двух команд в терминале:
cat /sys/power/state
cat /sys/power/mem_sleep
Вывод второй команды покажет список вариантов, например s2idle [deep] — это означает, что система использует deep. Если в квадратных скобках стоит s2idle, а ноутбук быстро разряжается в закрытом состоянии, возможная причина — слишком «лёгкий» сон. Обратная ситуация: при deep машина не просыпается — тогда стоит попробовать переключиться на s2idle.
Дополнительно полезно посмотреть журнал последнего цикла сна. Команда journalctl -b -u systemd-suspend.service покажет, на каком этапе произошёл сбой — при входе в сон или при пробуждении. Если журнал обрывается на этапе входа, подозрение падает на конкретный драйвер устройства.
Перед любыми изменениями сохраните вывод команд cat /sys/power/state и cat /sys/power/mem_sleep в текстовый файл — так вы всегда сможете вернуться к исходной конфигурации.
Временное переопределение режима приостановки
Самый безопасный способ проверить другой режим — переключить его на лету, без перезагрузки и правки конфигов. Для этого значение записывается напрямую в файл /sys/power/mem_sleep:
echo s2idle | sudo tee /sys/power/mem_sleep
После этого закройте крышку или выполните systemctl suspend и проверьте поведение: входит ли система в сон, просыпается ли по клавише, работает ли экран после пробуждения. Такое изменение действует только до перезагрузки — это удобно для экспериментов, поскольку неудачный выбор ничем не грозит.
Если тест прошёл успешно, режим можно закрепить постоянно. Здесь есть два пути: через параметр ядра mem_sleep_default или через конфигурацию systemd. Оба варианта рассмотрим ниже.
Постоянное переопределение через параметры ядра
Чтобы режим сохранялся после перезагрузки, добавьте параметр mem_sleep_default в командную строку ядра. Для систем с загрузчиком GRUB откройте файл /etc/default/grub и дополните строку GRUB_CMDLINE_LINUX_DEFAULT:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash mem_sleep_default=s2idle"
После правки необходимо обновить конфигурацию загрузчика. В большинстве дистрибутивов это делается командой sudo update-grub, в Fedora и системах с BLS — через sudo grub2-mkconfig -o /boot/grub2/grub.cfg или штатный инструмент дистрибутива. Точную команду сверьте с документацией вашей системы, так как пути различаются.
⚠️ Внимание: ошибка в строке параметров ядра может привести к тому, что система не загрузится. Перед правкой /etc/default/grub сделайте резервную копию файла и убедитесь, что умеете редактировать параметры загрузки из меню GRUB (клавиша «e» на этапе выбора системы).
☑️ Порядок безопасного переопределения режима сна
Альтернатива: настройка через systemd-sleep
Если вы не хотите трогать параметры ядра, переопределить поведение можно на уровне systemd. Файл /etc/systemd/sleep.conf управляет тем, какое состояние используется для каждого действия: SuspendState= задаёт режим для обычной приостановки, HibernateState= — для гибернации.
[Sleep]
SuspendState=mem
MemorySleepMode=s2idle
Обратите внимание: параметр MemorySleepMode поддерживается не во всех версиях systemd. Если после настройки поведение не изменилось, проверьте версию командой systemctl --version и документацию к вашему выпуску. Как запасной вариант остаётся параметр ядра из предыдущего раздела — он работает независимо от системы инициализации.
Также в sleep.conf можно переопределить действия по закрытию крышки и таймауты, хотя часть этих настроек относится к logind.conf. Не смешивайте конфликтующие директивы в обоих файлах — это частая причина «непослушного» поведения ноутбука.
Отладка зависаний: параметры no_console_suspend и pm_debug_messages
Когда система зависает при входе в сон или пробуждении, стандартных журналов часто недостаточно — сообщения ядра просто не успевают записаться. Здесь помогают отладочные параметры ядра, которые переопределяют поведение консоли и подсистемы управления питанием на время цикла сна.
| Параметр ядра | Что делает | Когда использовать |
|---|---|---|
no_console_suspend | Не отключает консоль во время сна, сообщения видны | Зависание на этапе входа в suspend |
pm_debug_messages | Включает подробные сообщения подсистемы PM | Поиск драйвера, который мешает сну |
initcall_debug | Логирует время выполнения функций инициализации | Медленный вход в сон или пробуждение |
mem_sleep_default=s2idle | Задаёт режим сна по умолчанию | Некорректная работа deep-режима |
Практический приём: добавьте no_console_suspend pm_debug_messages, затем запустите тестовый цикл через sudo rtcwake -m mem -s 30 — система уснёт и проснётся автоматически через указанное число секунд. После этого изучите dmesg: последние строки перед сном обычно указывают на устройство или драйвер, вызвавший проблему.
⚠️ Внимание: отладочные параметры заметно увеличивают объём журнала и могут замедлить загрузку. После завершения диагностики удалите их из конфигурации загрузчика и снова обновите GRUB.
Что делать, если виноват драйвер устройства
Если в dmesg видно, что зависание происходит на конкретном устройстве (часто это модули Wi-Fi, Bluetooth или дискретной графики), попробуйте выгрузить модуль перед сном командой modprobe -r и повторить тест. Постоянное решение — создать хук в /usr/lib/systemd/system-sleep/, который выгружает модуль при засыпании и загружает обратно при пробуждении. Точное имя модуля смотрите в выводе lsmod и lspci -k.
Типичные проблемы и способы их решения
Самопроизвольное пробуждение через секунды после засыпания почти всегда вызвано устройством, у которого включён wakeup — чаще всего это USB-контроллеры, тачпад или сетевой адаптер. Список источников пробуждения находится в /proc/acpi/wakeup: там видно, какие устройства активны (статус enabled).
Отключить лишний источник можно записью его имени обратно в тот же файл, например echo XHC | sudo tee /proc/acpi/wakeup переключает состояние. Имейте в виду: если отключить пробуждение от клавиатуры и кнопки питания, разбудить машину станет сложнее. Меняйте по одному устройству и тестируйте.
Отдельный случай — мгновенное пробуждение на некоторых ноутбуках с современными платформами, где прошивка сигнализирует о событии сразу после входа в s2idle. Возможная причина — активность встроенного контроллера, и универсального решения здесь нет: проверяйте обновления BIOS/UEFI производителя и журнал journalctl на предмет повторяющихся событий пробуждения.
Переопределение режима приостановки в Linux сводится к трём шагам: определить доступные режимы через /sys/power/mem_sleep, протестировать нужный временно, закрепить результат через mem_sleep_default или sleep.conf.
Часто задаваемые вопросы
Чем s2idle отличается от deep и что выбрать?
s2idle — лёгкий сон с быстрым пробуждением, но более высоким расходом батареи; deep — классический suspend-to-RAM с минимальным энергопотреблением, но он требует корректной поддержки S3 прошивкой. Если ноутбук не просыпается из deep, переходите на s2idle; если быстро разряжается во сне — попробуйте deep при условии стабильного пробуждения.
Изменение через echo в /sys/power/mem_sleep не сохраняется после перезагрузки — это нормально?
Да, интерфейсы sysfs сбрасываются при перезагрузке. Для постоянного эффекта используйте параметр ядра mem_sleep_default или настройку в /etc/systemd/sleep.conf.
Можно ли переопределить приостановку без root-прав?
Нет. Запись в /sys/power/mem_sleep, правка конфигурации загрузчика и файлов systemd требуют привилегий суперпользователя — это системные настройки управления питанием.
Система зависает при входе в сон, и журнал пуст. Что делать?
Добавьте параметры ядра no_console_suspend и pm_debug_messages, затем выполните тестовый цикл через rtcwake и изучите dmesg. Если и там пусто, возможная причина — сбой на уровне прошивки; проверьте обновления BIOS/UEFI для вашей модели.
Подходит ли эта инструкция для всех дистрибутивов?
Механизмы ядра (/sys/power, параметры загрузки) одинаковы во всех дистрибутивах. Различия касаются команды обновления конфигурации загрузчика и версии systemd — эти детали сверяйте с документацией вашего дистрибутива.