Вопрос или проблема
Я установил SuspendState=freeze
в /etc/systemd/sleep.conf. С тех пор система не просыпается, пока я не закрою и не открою крышку ноутбука.
Я сверил вводимые устройства, перечисленные командой
cat /proc/bus/input/devices
с выводом команды
sudo find /sys/ -iname wakeup -type f | less
чтобы определить файлы пробуждения для переключателя крышки, кнопки сна, клавиатуры и кнопки питания, а также чтобы определить, было ли пробуждение включено или отключено для них:
$ echo Lid Switch: `cat /sys/devices/platform/PNP0C0D:00/power/wakeup`
Lid Switch: disabled
$ echo Sleep Button: `cat /sys/devices/platform/PNP0C0E:00/power/wakeup`
Sleep Button: disabled
$ echo Keyboard: `cat /sys/devices/platform/i8042/serio0/power/wakeup`
Keyboard: enabled
$ echo Power Button: `cat /sys/devices/LNXSYSTM:00/LNXPWRBN:00/power/wakeup`
Power Button: enabled
Устройства пробуждения:
$ cat /proc/acpi/wakeup
Device S-state Status Sysfs node
GLAN S4 *enabled pci:0000:00:1f.6
XHC S3 *enabled pci:0000:00:14.0
XDCI S4 *disabled
HDAS S4 *disabled pci:0000:00:1f.3
RP01 S4 *enabled pci:0000:00:1c.0
PXSX S4 *disabled pci:0000:02:00.0
RP02 S4 *disabled
PXSX S4 *disabled
PXSX S4 *disabled
RP04 S4 *disabled
PXSX S4 *disabled
RP05 S4 *disabled
PXSX S4 *disabled
RP06 S4 *disabled
PXSX S4 *disabled
RP07 S4 *enabled pci:0000:00:1c.6
PXSX S4 *disabled pci:0000:04:00.0
RP08 S4 *disabled
PXSX S4 *disabled
RP09 S4 *enabled pci:0000:00:1d.0
PXSX S4 *enabled pci:0000:07:00.0
RP10 S4 *disabled
PXSX S4 *disabled
RP11 S4 *enabled pci:0000:00:1d.2
PXSX S4 *disabled pci:0000:40:00.0
RP12 S4 *disabled
PXSX S4 *disabled
RP13 S4 *disabled
PXSX S4 *disabled
RP14 S4 *disabled
PXSX S4 *disabled
RP15 S4 *disabled
PXSX S4 *disabled
RP16 S4 *disabled
PXSX S4 *disabled
RP17 S4 *disabled
PXSX S4 *disabled
RP18 S4 *disabled
PXSX S4 *disabled
RP19 S4 *disabled
PXSX S4 *disabled
RP20 S4 *disabled
PXSX S4 *disabled
RP21 S4 *disabled
PXSX S4 *disabled
RP22 S4 *disabled
PXSX S4 *disabled
RP23 S4 *disabled
PXSX S4 *disabled
RP24 S4 *disabled
PXSX S4 *disabled
SLPB S3 *enabled platform:PNP0C0E:00
LID S4 *enabled platform:PNP0C0D:00
Кнопка питания отсутствует в списке устройств пробуждения.
Моя система поддерживает Suspend-to-Idle (обозначенный как freeze
):
$ cat /sys/power/state
freeze mem disk
$ cat /sys/power/mem_sleep
s2idle [deep]
/etc/systemd/sleep.conf
[Sleep]
#AllowSuspend=yes
#AllowHibernation=yes
#AllowSuspendThenHibernate=yes
#AllowHybridSleep=yes
#SuspendMode=
#SuspendState=mem standby freeze
#HibernateMode=platform shutdown
#HibernateState=disk
#HybridSleepMode=suspend platform shutdown
#HybridSleepState=disk
#HibernateDelaySec=
#SuspendEstimationSec=60min
SuspendState=freeze
Документация ядра говорит следующее о Suspend-to-Idle:
Система просыпается из этого состояния по входящим прерываниям, поэтому теоретически любые устройства, которые могут вызвать генерацию прерываний в рабочем состоянии, также могут быть настроены как устройства пробуждения для S2Idle.
Я предполагаю, что открытие крышки ноутбука является асинхронным прерыванием, как описано в Что такое прерывание?:
Асинхронные прерывания, часто называемые прерываниями, – это внешние события, генерируемые устройствами ввода-вывода. Например, сетевая карта генерирует прерывание для того, чтобы сигнализировать о прибытии пакета.
Означает ли это, что программная экосистема Linux не поддерживает пробуждение устройств в состоянии Suspend-to-Idle с использованием аппаратных триггеров пробуждения кнопками?
Архив Вики говорит:
Триггеры пробуждения – это источники событий, которые могут пробуждать систему из любого из аппаратных режимов энергосбережения. Очевидными примерами являются кнопка питания или кнопка сна, функция Wake-on-LAN или переключатель крышки в ноутбуках. Триггеры пробуждения могут управляться через различные интерфейсы ядра, перечисленные ниже. Не существует единого интерфейса, охватывающего все возможные триггеры.
Выделенное не кажется верным.
Я включил пробуждение от клавиатуры, как описано в Интерфейсы триггеров пробуждения. Однако клавиатура всё равно не пробуждает систему из состояния питания Suspend-to-Idle:
echo enabled | sudo tee /sys/devices/platform/i8042/serio0/power/wakeup
Интерфейсы триггеров пробуждения также утверждает:
/sys/class/wakeup/*
Почти все триггеры пробуждения можно найти в каталоге /sys/class/wakeup, который содержит символические ссылки на все соответствующие устройства. Это полезно для поиска возможных триггеров пробуждения, пройдя по подкаталогам. Некоторые из триггеров могут соответствовать виртуальным устройствам, в то время как аппаратные триггеры пробуждения — это те, которые содержат по крайней мере один из этих файлов:
/sys/class/wakeup/*/device/physical_node/power/wakeup
/sys/class/wakeup/*/device/power/wakeup
Однако на моей системе нет триггеров пробуждения в каталоге /sys/class/wakeup/. Поэтому в моем случае триггеры пробуждения не могут быть управляемы из интерфейса триггеров пробуждения ядра /sys/class/wakeup/*.
Когда состояние питания было Suspend-to-RAM, клавиатура и кнопка питания могли пробуждать систему из спячки. Единственная проблема с Suspend-to-RAM заключается в том, что система не просыпается, если перед переходом в режим сна выполнялся rsync.
Нажатие клавиши на клавиатуре или кнопки питания должно пробуждать ноутбук из состояния Suspend-to-Idle.
.
Ответ или решение
Проблема, связанная с невозможностью пробуждения системы из режима сна с помощью клавиатуры или кнопки питания, несмотря на то, что соответствующие устройства пробуждения включены, является общей для пользователей, которые изменяют конфигурацию режима сна на своих системах. В представленной проблеме автор использует режим Suspend-to-Idle (обозначается как "freeze"), который, по своим характеристикам, может вестись менее предсказуемо по сравнению с более традиционными режимами сна, такими как Suspend-to-RAM.
Теория
Suspend-to-Idle (S2Idle) — это режим энергосбережения, который минимизирует активность системы, оставляя при этом возможность обработки прерываний. Это отличается от других более известных режимов сна, таких как Suspend-to-RAM (S3), который отключает питание большинства компонентов. Преимущество S2Idle состоит в его меньших потребностях по части совместимости оборудования и потребления энергии, однако это иногда приводит к непредсказуемому поведению, в частности, при пробуждении системы.
Согласно документации ядра Linux, система может быть пробуждена в этом состоянии за счет внешних прерываний, которые срабатывают при получении сигналов от различных устройств, например, клавиатуры или кнопки питания. Однако каждая система и аппаратное обеспечение могут по-разному поддерживать эту функциональность, что приводит к вариациям в поведении.
Пример
У пользователя, описавшего проблему, пробуждение из спящего режима работает только при закрытии и открытии крышки ноутбука, несмотря на то, что пробуждение для клавиатуры и кнопки питания включено:
echo Keyboard: `cat /sys/devices/platform/i8042/serio0/power/wakeup`
Keyboard: enabled
echo Power Button: `cat /sys/devices/LNXSYSTM:00/LNXPWRBN:00/power/wakeup`
Power Button: enabled
Также пользователем было замечено, что в списке wakeup-устройств /proc/acpi/wakeup
отсутствует Power Button, что является одной из причин непредвиденного поведения. Однако закрытие и открытие крышки работает, так как оно в списке присутствует:
LID S4 *enabled platform:PNP0C0D:00
Применение
-
Проверьте совместимость оборудования: Первое, что следует сделать, это убедиться, что ваше оборудование поддерживает возобновление работы из режима S2Idle. Некоторые системы могут не поддерживать все прерывания, в особенности те, которые ассоциированы с кнопкой питания или клавиатурой.
-
Проверьте статус устройств пробуждения: Некорректное отображение или понимание статусов wakeup-устройств также может быть причиной проблемы. Вы уже проверили статус кнопок и клавиш, но убедитесь, что другие устройства, такие как USB-контроллеры, также правильно настроены. Проанализируйте с помощью:
cat /proc/bus/input/devices
И свяжите это с результатами:
sudo find /sys/ -iname wakeup -type f | less
-
Измените настройки ACPI: Практика показывает, что не все устройства перечислены в
/proc/acpi/wakeup
, и частая рекомендация — попробовать изменить настройки ACPI, которые могут закрывать доступ для пробуждения. Например, явно включите Power Button в ACPI настройках:echo PWRB | sudo tee /proc/acpi/wakeup
-
Использование зависимости от ядра: В зависимости от используемой версии ядра Linux, можно попробовать обновить ядро или протестировать его более новый вариант. Поддержка определенных функций может быть улучшена в новых версиях.
-
Дополнительные настройки systemd: Проверьте ваши конфигурации
systemd
, возможно, разумно будет использовать дополнительные тесты или настройки, которые могут помочь выявить, почему ваша система не реагирует на пробуждение от клавиатуры и кнопки питания. -
Обратная связь с сообществом: Если проблема сохраняется, привлеките внимание сообщества на форумах, связанных с вашим дистрибутивом. Часто пользователи делятся успешными решениями похожих проблем и могут предложить обновления или патчи, которые могут решить проблему.
Как видно из примера, Suspend-to-Idle достаточно сложный в плане поддерживаемых функций. Настоятельно рекомендуется всесторонняя диагностика с обновлением всех задействованных компонентов системы для достижения желаемого результата. Разделение процесса на небольшие тестируемые шаги поможет локализовать причину проблемы и эффективно решить ее.