Вопрос или проблема
Я испытываю трудности с запуском пользовательского правила udev для Bluetooth-пульта Desview. Это ограниченный геймпад, используемый для управления телесуфлёром. К сожалению, он не поддерживает Linux. Операционная система — Ubuntu 24.04.
Моя идея — использовать animicrox
как службу (она работает), но мне нужно вручную запускать службу каждый раз при подключении устройства. Поэтому я пытаюсь автоматизировать процесс запуска/остановки, и здесь начинаются трудности. Я уже протестировал:
ACTION=="add", SUBSYSTEM=="hid", ATTRS{HID_NAME}=="desview", RUN+="/usr/bin/systemctl --user start antimicrox.service"
ACTION=="add", SUBSYSTEM=="input", ATTRS{HID_NAME}=="desview", RUN+="/usr/bin/systemctl --user start antimicrox.service"
ACTION=="add", SUBSYSTEM=="hid", ATTRS{HID_NAME}=="Desview", RUN+="/usr/bin/systemctl --user start antimicrox.service"
ACTION=="add", SUBSYSTEM=="input", ATTRS{HID_NAME}=="Desview", RUN+="/usr/bin/systemctl --user start antimicrox.service"
ACTION=="add", SUBSYSTEM=="hid", RUN+="/usr/bin/systemctl --user start antimicrox.service"
ACTION=="add", SUBSYSTEM=="input", RUN+="/usr/bin/systemctl --user start antimicrox.service"
Ни одно из них не работает.
Буду признателен за любую помощь.
Следы из монитора представлены ниже.
монитор распечатает полученные события для:
UDEV - событие, которое udev отправляет после обработки правила
KERNEL - событие ядра
KERNEL[5597.776083] add /devices/pci0000:00/0000:00:14.0/usb3/3-10/3-10:1.0/bluetooth/hci0/hci0:2048 (bluetooth)
ACTION=add
DEVPATH=/devices/pci0000:00/0000:00:14.0/usb3/3-10/3-10:1.0/bluetooth/hci0/hci0:2048
SUBSYSTEM=bluetooth
DEVTYPE=link
SEQNUM=12404
UDEV [5597.779695] add /devices/pci0000:00/0000:00:14.0/usb3/3-10/3-10:1.0/bluetooth/hci0/hci0:2048 (bluetooth)
ACTION=add
DEVPATH=/devices/pci0000:00/0000:00:14.0/usb3/3-10/3-10:1.0/bluetooth/hci0/hci0:2048
SUBSYSTEM=bluetooth
DEVTYPE=link
SEQNUM=12404
USEC_INITIALIZED=5597776078
.LOCAL_ifNum=00
SYSTEMD_ALIAS=/sys/subsystem/bluetooth/devices/hci0:2048
SYSTEMD_WANTS=bluetooth.target
SYSTEMD_USER_WANTS=bluetooth.target
TAGS=:systemd:
CURRENT_TAGS=:systemd:
KERNEL[5597.817564] add /devices/virtual/misc/uhid/0005:07D7:0000.001C (hid)
ACTION=add
DEVPATH=/devices/virtual/misc/uhid/0005:07D7:0000.001C
SUBSYSTEM=hid
HID_ID=0005:000007D7:00000000
HID_NAME=Desview
HID_PHYS=98:bd:80:4d:10:f1
HID_UNIQ=dc:53:10:05:3f:cf
MODALIAS=hid:b0005g0001v000007D7p00000000
SEQNUM=12405
KERNEL[5597.817785] add /devices/virtual/misc/uhid/0005:07D7:0000.001C/input/input69 (input)
ACTION=add
DEVPATH=/devices/virtual/misc/uhid/0005:07D7:0000.001C/input/input69
SUBSYSTEM=input
PRODUCT=5/7d7/0/110
NAME="Desview Mouse"
PHYS="98:bd:80:4d:10:f1"
UNIQ="dc:53:10:05:3f:cf"
PROP=0
EV=17
KEY=1f0000 0 0 0 0
REL=903
MSC=10
MODALIAS=input:b0005v07D7p0000e0110-e0,1,2,4,k110,111,112,113,114,r0,1,8,B,am4,lsfw
SEQNUM=12406
KERNEL[5597.817842] add /devices/virtual/misc/uhid/0005:07D7:0000.001C/input/input69/mouse6 (input)
ACTION=add
DEVPATH=/devices/virtual/misc/uhid/0005:07D7:0000.001C/input/input69/mouse6
SUBSYSTEM=input
DEVNAME=/dev/input/mouse6
SEQNUM=12407
MAJOR=13
MINOR=38
KERNEL[5597.817852] add /devices/virtual/misc/uhid/0005:07D7:0000.001C/input/input69/event24 (input)
ACTION=add
DEVPATH=/devices/virtual/misc/uhid/0005:07D7:0000.001C/input/input69/event24
SUBSYSTEM=input
DEVNAME=/dev/input/event24
SEQNUM=12408
MAJOR=13
MINOR=88
KERNEL[5597.817878] add /devices/virtual/misc/uhid/0005:07D7:0000.001C/input/input70 (input)
ACTION=add
DEVPATH=/devices/virtual/misc/uhid/0005:07D7:0000.001C/input/input70
SUBSYSTEM=input
PRODUCT=5/7d7/0/110
NAME="Desview Keyboard"
PHYS="98:bd:80:4d:10:f1"
UNIQ="dc:53:10:05:3f:cf"
PROP=0
EV=10001f
KEY=3f00033fff 0 0 483ffff17aff32d bfd4444600000000 1 130ff38b17d007 ffff7bfad9415fff ffbeffdfffefffff fffffffffffffffe
REL=1040
ABS=100000000
MSC=10
MODALIAS=input:b0005v07D7p0000e0110-e0,1,2,3,4,14,k71,72,73,74,75,77,78,79,7A,7B,7C,7D,7E,7F,80,81,82,83,84,85,86,87,88,89,8A,8B,8C,8E,90,96,98,9B,9C,9E,9F,A1,A3,A4,A5,A6,A7,A8,A9,AB,AC,AD,AE,B0,B1,B2,B3,B4,B5,B6,B7,B8,B9,BA,BB,BC,BD,BE,BF,C0,C1,C2,CC,CE,CF,D0,D1,D2,D4,D8,D9,DB,DF,E0,E1,E4,E5,E6,E7,E8,E9,EA,EB,F0,F1,F4,100,161,162,166,16A,16E,172,174,176,177,178,179,17A,17B,17C,17D,17F,180,182,183,185,188,189,18C,18D,18E,18F,190,191,192,193,195,197,198,199,19A,19C,1A0,1A1,1A2,1A3,1A4,1A5,1A6,1A7,1A8,1A9,1AA,1AB,1AC,1AD,1AE,1AF,1B0,1B1,1B7,1BA,240,241,242,243,244,245,246,247,248,249,24A,24B,24C,24D,250,251,260,261,262,263,264,265,r6,C,a20,m4,lsfw
SEQNUM=12409
KERNEL[5597.817897] add /devices/virtual/misc/uhid/0005:07D7:0000.001C/input/input70/event25 (input)
ACTION=add
DEVPATH=/devices/virtual/misc/uhid/0005:07D7:0000.001C/input/input70/event25
SUBSYSTEM=input
DEVNAME=/dev/input/event25
SEQNUM=12410
MAJOR=13
MINOR=89
KERNEL[5597.817912] add /devices/virtual/misc/uhid/0005:07D7:0000.001C/input/input71 (input)
ACTION=add
DEVPATH=/devices/virtual/misc/uhid/0005:07D7:0000.001C/input/input71
SUBSYSTEM=input
PRODUCT=5/7d7/0/110
NAME="Desview"
PHYS="98:bd:80:4d:10:f1"
UNIQ="dc:53:10:05:3f:cf"
PROP=0
EV=1b
KEY=ffff000000000000 0 0 0 0
ABS=30627
MSC=10
MODALIAS=input:b0005v07D7p0000e0110-e0,1,3,4,k130,131,132,133,134,135,136,137,138,139,13A,13B,13C,13D,13E,13F,ra0,1,2,5,9,A,10,11,m4,lsfw
SEQNUM=12411
KERNEL[5597.817928] add /devices/virtual/misc/uhid/0005:07D7:0000.001C/input/input71/event26 (input)
ACTION=add
DEVPATH=/devices/virtual/misc/uhid/0005:07D7:0000.001C/input/input71/event26
SUBSYSTEM=input
DEVNAME=/dev/input/event26
SEQNUM=12412
MAJOR=13
MINOR=90
KERNEL[5597.817939] add /devices/virtual/misc/uhid/0005:07D7:0000.001C/input/input71/js0 (input)
ACTION=add
DEVPATH=/devices/virtual/misc/uhid/0005:07D7:0000.001C/input/input71/js0
SUBSYSTEM=input
DEVNAME=/dev/input/js0
SEQNUM=12413
MAJOR=13
MINOR=0
KERNEL[5597.817960] add /devices/virtual/misc/uhid/0005:07D7:0000.001C/hidraw/hidraw9 (hidraw)
ACTION=add
DEVPATH=/devices/virtual/misc/uhid/0005:07D7:0000.001C/hidraw/hidraw9
SUBSYSTEM=hidraw
DEVNAME=/dev/hidraw9
SEQNUM=12414
MAJOR=241
MINOR=9
KERNEL[5597.817983] bind /devices/virtual/misc/uhid/0005:07D7:0000.001C (hid)
ACTION=bind
DEVPATH=/devices/virtual/misc/uhid/0005:07D7:0000.001C
SUBSYSTEM=hid
DRIVER=hid-generic
HID_ID=0005:000007D7:00000000
HID_NAME=Desview
HID_PHYS=98:bd:80:4d:10:f1
HID_UNIQ=dc:53:10:05:3f:cf
MODALIAS=hid:b0005g0001v000007D7p00000000
SEQNUM=12415
UDEV [5597.818543] add /devices/virtual/misc/uhid/0005:07D7:0000.001C (hid)
ACTION=add
DEVPATH=/devices/virtual/misc/uhid/0005:07D7:0000.001C
SUBSYSTEM=hid
HID_ID=0005:000007D7:00000000
HID_NAME=Desview
HID_PHYS=98:bd:80:4d:10:f1
HID_UNIQ=dc:53:10:05:3f:cf
MODALIAS=hid:b0005g0001v000007D7p00000000
SEQNUM=12405
USEC_INITIALIZED=5597817534
DRIVER=hid-generic
UDEV [5597.819341] add /devices/virtual/misc/uhid/0005:07D7:0000.001C/input/input69 (input)
ACTION=add
DEVPATH=/devices/virtual/misc/uhid/0005:07D7:0000.001C/input/input69
SUBSYSTEM=input
PRODUCT=5/7d7/0/110
NAME="Desview Mouse"
PHYS="98:bd:80:4d:10:f1"
UNIQ="dc:53:10:05:3f:cf"
PROP=0
EV=17
KEY=1f0000 0 0 0 0
REL=903
MSC=10
MODALIAS=input:b0005v07D7p0000e0110-e0,1,2,4,k110,111,112,113,114,r0,1,8,B,am4,lsfw
SEQNUM=12406
USEC_INITIALIZED=5597817730
ID_INPUT=1
ID_INPUT_MOUSE=1
ID_BUS=bluetooth
TAGS=:seat:
CURRENT_TAGS=:seat:
UDEV [5597.820204] add /devices/virtual/misc/uhid/0005:07D7:0000.001C/input/input71 (input)
ACTION=add
DEVPATH=/devices/virtual/misc/uhid/0005:07D7:0000.001C/input/input71
SUBSYSTEM=input
PRODUCT=5/7d7/0/110
NAME="Desview"
PHYS="98:bd:80:4d:10:f1"
UNIQ="dc:53:10:05:3f:cf"
PROP=0
EV=1b
KEY=ffff000000000000 0 0 0 0
ABS=30627
MSC=10
MODALIAS=input:b0005v07D7p0000e0110-e0,1,3,4,k130,131,132,133,134,135,136,137,138,139,13A,13B,13C,13D,13E,13F,ra0,1,2,5,9,A,10,11,m4,lsfw
SEQNUM=12411
USEC_INITIALIZED=5597817914
ID_INPUT=1
ID_INPUT_JOYSTICK=1
ID_BUS=bluetooth
TAGS=:seat:
CURRENT_TAGS=:seat:
UDEV [5597.820394] add /devices/virtual/misc/uhid/0005:07D7:0000.001C/input/input69/mouse6 (input)
ACTION=add
DEVPATH=/devices/virtual/misc/uhid/0005:07D7:0000.001C/input/input69/mouse6
SUBSYSTEM=input
DEVNAME=/dev/input/mouse6
SEQNUM=12407
USEC_INITIALIZED=5597817768
ID_INPUT=1
ID_INPUT_MOUSE=1
ID_BUS=bluetooth
MAJOR=13
MINOR=38
UDEV [5597.820539] add /devices/virtual/misc/uhid/0005:07D7:0000.001C/input/input70 (input)
ACTION=add
DEVPATH=/devices/virtual/misc/uhid/0005:07D7:0000.001C/input/input70
SUBSYSTEM=input
PRODUCT=5/7d7/0/110
NAME="Desview Keyboard"
PHYS="98:bd:80:4d:10:f1"
UNIQ="dc:53:10:05:3f:cf"
PROP=0
EV=10001f
KEY=3f00033fff 0 0 483ffff17aff32d bfd4444600000000 1 130ff38b17d007 ffff7bfad9415fff ffbeffdfffefffff fffffffffffffffe
REL=1040
ABS=100000000
MSC=10
MODALIAS=input:b0005v07D7p0000e0110-e0,1,2,3,4,14,k71,72,73,74,75,77,78,79,7A,7B,7C,7D,7E,7F,80,81,82,83,84,85,86,87,88,89,8A,8B,8C,8E,90,96,98,9B,9C,9E,9F,A1,A3,A4,A5,A6,A7,A8,A9,AB,AC,AD,AE,B0,B1,B2,B3,B4,B5,B6,B7,B8,B9,BA,BB,BC,BD,BE,BF,C0,C1,C2,CC,CE,CF,D0,D1,D2,D4,D8,D9,DB,DF,E0,E1,E4,E5,E6,E7,E8,E9,EA,EB,F0,F1,F4,100,161,162,166,16A,16E,172,174,176,177,178,179,17A,17B,17C,17D,17F,180,182,183,185,188,189,18C,18D,18E,18F,190,191,192,193,195,197,198,199,19A,19C,1A0,1A1,1A2,1A3,1A4,1A5,1A6,1A7,1A8,1A9,1AA,1AB,1AC,1AD,1AE,1AF,1B0,1B1,1B7,1BA,240,241,242,243,244,245,246,247,248,249,24A,24B,24C,24D,250,251,260,261,262,263,264,265,r6,C,a20,m4,lsfw
SEQNUM=12409
USEC_INITIALIZED=5597817870
ID_INPUT=1
ID_INPUT_KEY=1
ID_INPUT_KEYBOARD=1
ID_BUS=bluetooth
TAGS=:seat:
CURRENT_TAGS=:seat:
UDEV [5597.821457] add /devices/virtual/misc/uhid/0005:07D7:0000.001C/hidraw/hidraw9 (hidraw)
ACTION=add
DEVPATH=/devices/virtual/misc/uhid/0005:07D7:0000.001C/hidraw/hidraw9
SUBSYSTEM=hidraw
DEVNAME=/dev/hidraw9
SEQNUM=12414
USEC_INITIALIZED=5597818235
MAJOR=241
MINOR=9
UDEV [5597.822062] add /devices/virtual/misc/uhid/0005:07D7:0000.001C/input/input71/js0 (input)
ACTION=add
DEVPATH=/devices/virtual/misc/uhid/0005:07D7:0000.001C/input/input71/js0
SUBSYSTEM=input
DEVNAME=/dev/input/js0
SEQNUM=12413
USEC_INITIALIZED=5597817941
ID_INPUT=1
ID_INPUT_JOYSTICK=1
ID_BUS=bluetooth
MAJOR=13
MINOR=0
TAGS=:seat:uaccess:
CURRENT_TAGS=:seat:uaccess:
UDEV [5597.844170] add /devices/virtual/misc/uhid/0005:07D7:0000.001C/input/input71/event26 (input)
ACTION=add
DEVPATH=/devices/virtual/misc/uhid/0005:07D7:0000.001C/input/input71/event26
SUBSYSTEM=input
DEVNAME=/dev/input/event26
SEQNUM=12412
USEC_INITIALIZED=5597817928
ID_INPUT=1
ID_INPUT_JOYSTICK=1
ID_BUS=bluetooth
ID_INPUT_JOYSTICK_INTEGRATION=external
LIBINPUT_DEVICE_GROUP=5/7d7/0:98:bd:80:4d:10:f1
MAJOR=13
MINOR=90
TAGS=:seat:uaccess:
CURRENT_TAGS=:seat:uaccess:
UDEV [5597.844493] add /devices/virtual/misc/uhid/0005:07D7:0000.001C/input/input70/event25 (input)
ACTION=add
DEVPATH=/devices/virtual/misc/uhid/0005:07D7:0000.001C/input/input70/event25
SUBSYSTEM=input
DEVNAME=/dev/input/event25
SEQNUM=12410
USEC_INITIALIZED=5597817895
ID_INPUT=1
ID_INPUT_KEY=1
ID_INPUT_KEYBOARD=1
ID_BUS=bluetooth
XKBMODEL=pc105
XKBLAYOUT=pl
XKBVARIANT=
XKBOPTIONS=
BACKSPACE=guess
LIBINPUT_DEVICE_GROUP=5/7d7/0:98:bd:80:4d:10:f1
MAJOR=13
MINOR=89
TAGS=:power-switch:
CURRENT_TAGS=:power-switch:
UDEV [5597.848282] add /devices/virtual/misc/uhid/0005:07D7:0000.001C/input/input69/event24 (input)
ACTION=add
DEVPATH=/devices/virtual/misc/uhid/0005:07D7:0000.001C/input/input69/event24
SUBSYSTEM=input
DEVNAME=/dev/input/event24
SEQNUM=12408
USEC_INITIALIZED=5597817791
ID_INPUT=1
ID_INPUT_MOUSE=1
ID_BUS=bluetooth
LIBINPUT_DEVICE_GROUP=5/7d7/0:98:bd:80:4d:10:f1
MAJOR=13
MINOR=88
UDEV [5597.848967] bind /devices/virtual/misc/uhid/0005:07D7:0000.001C (hid)
ACTION=bind
DEVPATH=/devices/virtual/misc/uhid/0005:07D7:0000.001C
SUBSYSTEM=hid
DRIVER=hid-generic
HID_ID=0005:000007D7:00000000
HID_NAME=Desview
HID_PHYS=98:bd:80:4d:10:f1
HID_UNIQ=dc:53:10:05:3f:cf
MODALIAS=hid:b0005g0001v000007D7p00000000
SEQNUM=12415
USEC_INITIALIZED=5597818255
Тестирование правил для устройства дает некоторую ошибку, но я не знаю, имеет ли это значение:
...
Чтение файла правил: /etc/udev/rules.d/99-antimicrox.rules
Чтение файла правил: /etc/udev/rules.d/99-jlink.rules
Чтение файла правил: /usr/lib/udev/rules.d/99-libsane1.rules
Чтение файла правил: /usr/lib/udev/rules.d/99-systemd.rules
sd-device: Не удалось найти ссылки в "/devices/virtual/misc/uhid/0005:07D7:0000.002A".
значение '[dmi/id]sys_vendor' это 'LENOVO'
значение '[dmi/id]sys_vendor' это 'LENOVO'
0005:07D7:0000.002A: /usr/lib/udev/rules.d/50-udev-default.rules:20 Импорт свойств из результатов встроенной команды 'hwdb --subsystem=hid'
0005:07D7:0000.002A: hwdb ключ modalias: "hid:b0005g0001v000007D7p00000000"
0005:07D7:0000.002A: Нет записи в hwdb.
0005:07D7:0000.002A: /usr/lib/udev/rules.d/50-udev-default.rules:20 Не удалось выполнить встроенный 'hwdb --subsystem=hid': данные недоступны
0005:07D7:0000.002A: /usr/lib/udev/rules.d/80-drivers.rules:5 RUN 'kmod load'
DEVPATH=/devices/virtual/misc/uhid/0005:07D7:0000.002A
DRIVER=hid-generic
HID_ID=0005:000007D7:00000000
HID_NAME=Desview
HID_PHYS=98:bd:80:4d:10:f1
HID_UNIQ=dc:53:10:05:3f:cf
MODALIAS=hid:b0005g0001v000007D7p00000000
ACTION=add
SUBSYSTEM=hid
USEC_INITIALIZED=14962112722
run: 'kmod load'
Выгрузка индекса модуля ядра.
Выгружен контекст конфигурации ссылок.
По какой-то причине, единственное рабочее совпадение для этого устройства основано на их идентификаторах, которые используют путь KERNEL
, а не другие атрибуты. Я подозреваю, что это из-за того, что Ubuntu 24.04 в общем случае не содержит файла .device
для этого устройства, что может сломать выполнение udev
(просто не знаю).
Следующие правила работают:
ACTION=="add", KERNEL=="0005:07D7:0000.*", RUN+="/bin/su -c '/usr/bin/systemctl --user --no-block start antimicrox.service' myusercomeshere"
ACTION=="remove", KERNEL=="0005:07D7:0000.*", RUN+="/bin/su -c '/usr/bin/systemctl --user --no-block stop antimicrox.service && killall antimicrox' myusercomeshere"
Так как служба установлена для пользователя (и выполняет дополнительное управляющее устройство в системной панели), единственный вариант — запускать команды в контексте myusercomeshere
(обновите его для соответствующего пользователя). При отключении устройства также необходимо убивать управляющее устройство в системной панели, поскольку оно не останавливается автоматически вместе с остановкой службы.
Ответ или решение
Для решения проблемы с автоматическим запуском и остановкой службы для Bluetooth-контроллера Desview на Ubuntu 24.04 через правила udev, необходимо учитывать несколько аспектов. Давайте разберемся с теоретической частью, примером и практическим применением данной задачи.
Теория
Udev — это подсистема Linux, которая управляет динамическим созданием и удалением устройств в системе. Она использует набор правил для определения, какие действия должны выполняться при определенных событиях — таких как подключение или отключение устройства. Каждое правило представляет собой строку, которая состоит из нескольких ключевых и значений, которые описывают, когда это правило должно быть применено и какие действия должны выполняться.
Важным аспектом является то, что правила udev выполняются в контексте root, а у вашего случая служба animicrox должна запускаться в пользовательском контексте. Таким образом, чтобы запустить systemctl --user start/stop
в контексте конкретного пользователя, необходимо использовать команду su
или sudo -u
.
Пример
Вы описали проблему, где подход с использованием таких атрибутов, как SUBSYSTEM
и ATTRS{HID_NAME}
, не сработал. Однако, использование KERNEL
с регулярным выражением, оканчивающимся на .*
в сочетании с su -c
позволило успешно запустить службу. Давайте рассмотрим этот подход:
-
Правило для добавления устройства:
ACTION=="add", KERNEL=="0005:07D7:0000.*", RUN+="/bin/su -c '/usr/bin/systemctl --user --no-block start antimicrox.service' myusercomeshere"
Это правило реагирует на событие
add
для устройства с идентификатором ядра, который начинается с0005:07D7:0000
, и выполняет запуск службыanimicrox
от имени пользователяmyusercomeshere
. -
Правило для удаления устройства:
ACTION=="remove", KERNEL=="0005:07D7:0000.*", RUN+="/bin/su -c '/usr/bin/systemctl --user --no-block stop antimicrox.service && killall antimicrox' myusercomeshere"
Это правило реагирует на событие
remove
и останавливает службу, а затем завершает все процессыanimicrox
.
Применение
На практике, рассмотрим несколько шагов, чтобы убедиться, что правила правильно применяются и устройство распознается:
-
Создание правил:
Создайте файл в/etc/udev/rules.d/
, например,99-desview.rules
и добавьте в него вышеописанные правила. -
Замена имени пользователя:
Заменитеmyusercomeshere
на фактическое имя пользователя в вашей системе. -
Перезагрузка udev:
После создания или редактирования файлов правил перезапустите службу udev с помощью:sudo udevadm control --reload-rules sudo udevadm trigger
Это обновит правила без необходимости перезагрузки системы.
-
Проверка работоспособности:
Подключите устройство и проверьте журнал с помощью команды:journalctl --user -xe | grep animicrox
Это поможет отслеживать любые ошибки или сообщения, связанные с запуском службы.
-
Дополнительные настройки:
В случае сложности с завершением дочерних процессов GUI, вы можете написать отдельный скрипт для более детального управления этими процессами и вызывать его из правила udev.
Таким образом, в вашей конфигурации правил используется метод, основанный на идентификаторах ядра устройства. Это позволяет гарантировать правильную идентификацию устройства и запуск необходимых служб в нужном контексте пользователя.