Ноутбук на 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» на этапе выбора системы).

☑️ Порядок безопасного переопределения режима сна

Выполнено: 0 / 5

Альтернатива: настройка через 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 — эти детали сверяйте с документацией вашего дистрибутива.