Проблемы с правилом udev для пульта дистанционного управления Desview

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

Я испытываю трудности с запуском пользовательского правила 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 позволило успешно запустить службу. Давайте рассмотрим этот подход:

  1. Правило для добавления устройства:

    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.

  2. Правило для удаления устройства:

    ACTION=="remove", KERNEL=="0005:07D7:0000.*", RUN+="/bin/su -c '/usr/bin/systemctl --user --no-block stop antimicrox.service && killall antimicrox' myusercomeshere"

    Это правило реагирует на событие remove и останавливает службу, а затем завершает все процессы animicrox.

Применение

На практике, рассмотрим несколько шагов, чтобы убедиться, что правила правильно применяются и устройство распознается:

  1. Создание правил:
    Создайте файл в /etc/udev/rules.d/, например, 99-desview.rules и добавьте в него вышеописанные правила.

  2. Замена имени пользователя:
    Замените myusercomeshere на фактическое имя пользователя в вашей системе.

  3. Перезагрузка udev:
    После создания или редактирования файлов правил перезапустите службу udev с помощью:

    sudo udevadm control --reload-rules
    sudo udevadm trigger

    Это обновит правила без необходимости перезагрузки системы.

  4. Проверка работоспособности:
    Подключите устройство и проверьте журнал с помощью команды:

    journalctl --user -xe | grep animicrox

    Это поможет отслеживать любые ошибки или сообщения, связанные с запуском службы.

  5. Дополнительные настройки:
    В случае сложности с завершением дочерних процессов GUI, вы можете написать отдельный скрипт для более детального управления этими процессами и вызывать его из правила udev.

Таким образом, в вашей конфигурации правил используется метод, основанный на идентификаторах ядра устройства. Это позволяет гарантировать правильную идентификацию устройства и запуск необходимых служб в нужном контексте пользователя.

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

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