Система не выходит из спящего режима при использовании клавиатуры или кнопки питания.

Вопрос или проблема

Я установил 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

Применение

  1. Проверьте совместимость оборудования: Первое, что следует сделать, это убедиться, что ваше оборудование поддерживает возобновление работы из режима S2Idle. Некоторые системы могут не поддерживать все прерывания, в особенности те, которые ассоциированы с кнопкой питания или клавиатурой.

  2. Проверьте статус устройств пробуждения: Некорректное отображение или понимание статусов wakeup-устройств также может быть причиной проблемы. Вы уже проверили статус кнопок и клавиш, но убедитесь, что другие устройства, такие как USB-контроллеры, также правильно настроены. Проанализируйте с помощью:

    cat /proc/bus/input/devices

    И свяжите это с результатами:

    sudo find /sys/ -iname wakeup -type f | less
  3. Измените настройки ACPI: Практика показывает, что не все устройства перечислены в /proc/acpi/wakeup, и частая рекомендация — попробовать изменить настройки ACPI, которые могут закрывать доступ для пробуждения. Например, явно включите Power Button в ACPI настройках:

    echo PWRB | sudo tee /proc/acpi/wakeup
  4. Использование зависимости от ядра: В зависимости от используемой версии ядра Linux, можно попробовать обновить ядро или протестировать его более новый вариант. Поддержка определенных функций может быть улучшена в новых версиях.

  5. Дополнительные настройки systemd: Проверьте ваши конфигурации systemd, возможно, разумно будет использовать дополнительные тесты или настройки, которые могут помочь выявить, почему ваша система не реагирует на пробуждение от клавиатуры и кнопки питания.

  6. Обратная связь с сообществом: Если проблема сохраняется, привлеките внимание сообщества на форумах, связанных с вашим дистрибутивом. Часто пользователи делятся успешными решениями похожих проблем и могут предложить обновления или патчи, которые могут решить проблему.

Как видно из примера, Suspend-to-Idle достаточно сложный в плане поддерживаемых функций. Настоятельно рекомендуется всесторонняя диагностика с обновлением всех задействованных компонентов системы для достижения желаемого результата. Разделение процесса на небольшие тестируемые шаги поможет локализовать причину проблемы и эффективно решить ее.

Оцените материал
Добавить комментарий

Капча загружается...