Современные компьютеры могут выходить из спящего режима ("WakeUp") по событиям от переферийных устройств. Это позволяет экономить электричество: например при использовании компьютера в качестве медиа-центра он может находиться в спящем режиме и выходить из него по событию от пульта. Однако в ряде случаев это может доставлять неудобства. Например ноутбук, просыпающийся в сумке по сигналу от беспроводной мыши, на которой случайно была задета кнопка, может оказаться разряженным в самый неподходящий момент.
К счастью в Linux можно включать и выключать wakeup для отдельных устройств. К сожалению сделать это можно только через запись флагов в специальные файлы в недрах SysFS. Какого-либо графического интерфейса для этого не предусмотрено.
Собственно включение и выключение wakeup для устройства производиться путём записи строки "enabled"/"disabled" в файл "wakeup", расположенный в поддиректории "power", директории устройства в недрах SysFS (обычно монтируется как "/sys"). Остаётся определить директорию устройства. Сделать это удобнее всего запустив при отключенном устройстве команду:
sudo udevadm monitor --kernel | grep '/devices/' -m 1
И после этого сразу подключить устройство. В результате получим примерно вот такой вывод:
KERNEL[885240.361166] add /devices/pci0000:00/0000:00:14.0/usb1/1-1 (usb)
Здесь "/devices/pci0000:00/0000:00:14.0/usb1/1-1" и есть искомый путь. Соответствено включить wakeup для этого устройства можно командой:
echo enabled > /sys//devices/pci0000:00/0000:00:14.0/usb1/1-1/power/wakeup
А выключить командой:
echo disabled > /sys//devices/pci0000:00/0000:00:14.0/usb1/1-1/power/wakeup
Вобщем-то ничего сверхсложного, но задавать режим (если нас не устраивает режим по умолчанию) нужно после каждого подключения устройства. К тому же USB-устройство может получить другой путь если оно подключено в другой порт и/или через USB-хаб. К счастью и здесь есть решение.
Для начала чтобы уйти от абстракции и рассматривать живой пример конкретизируем задачу: нужно отключить wakeup для Microsoft Sculpt Mobile Mouse.
Первым делом нужно узнать VendorID/ProductID нашего USB-устройства. Для этого выполняем команду:
lsusb
В результате получаем примерно вот такой вывод:
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 001 Device 004: ID 138a:00ab Validity Sensors, Inc. Bus 001 Device 003: ID 04f2:b669 Chicony Electronics Co., Ltd HP HD Camera Bus 001 Device 034: ID 8087:0aaa Intel Corp. Bus 001 Device 046: ID 045e:07b2 Microsoft Corp. 2.4GHz Transceiver v8.0 used by mouse Wireless Desktop 900 Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Находим наше устройство. В данном случае оно определилось как "Bus 001 Device 046: ID 045e:07b2 Microsoft Corp. 2.4GHz Transceiver v8.0 used by mouse Wireless Desktop 900". Здесь VendorID это "045e", а ProductID это "07b2". Получив эти данные мы можем воспользоваться ими чтобы написать правила для сервиса udev, ответственного за начальную настройку устройств в Linux.
Правила udev храняться в нескольких локациях. Для пользовательских правил предпочтительной является директория "/etc/udev/rules.d". Создадим в ней файл "99-wakeup.rules" следующего содержания:
SUBSYSTEM=="usb", \ ENV{DEVTYPE}=="usb_device", \ ATTR{idVendor}=="045e", \ ATTR{idProduct}=="07b2", \ RUN+="/bin/sh -c 'echo disabled > /sys$devpath/power/wakeup'"
Здесь описывается правило, которое в ответ на любое событие от USB-устройства 045e:07b2 выполняет команду, отклчюающую wakeup для этого устройства. Правило начнёт работать после перезагрузки системы. ЧТобы правило начало работать до перезагрузки необходимо "попросить" udev перечитать правила. Делается это командой:
udevadm control --reload
После этого достаточно переподключить устройство и всё должно работать. Если же что-то не работает то надо внимательно всё перепроверить. Если сходу ошибка не видно то можно включить режим отладки udev и внимательно изучить логи. Режим отладки включается командой:
udevadm control --log-priority=debug
Логи можно смотреть командой:
journalctl -f
Отключить режим отладки можно командой:
udevadm control --log-priority=info
На этом всё. Приятной работы!