LINUX.ORG.RU

Не получается создать правило для udev

 


1

2

Перейду сразу к делу. При подключении/отключении некоторых USB устройств должен выполняться какой-то скрипт. Пусть это будут USB мыши. udevadm monitor --env при подключении мыши выдаёт кучу всякой каши, я выбираю следующее:

UDEV  [3972.485338] add      /devices/pci0000:00/0000:00:14.0/usb2/2-2/2-2:1.0/0003:046D:C05F.000C/input/input28/mouse2 (input)
.INPUT_CLASS=mouse
.MM_USBIFNUM=00
ACTION=add
DEVLINKS=/dev/input/by-id/usb-Logitech_USB_Optical_Mouse-mouse /dev/input/by-path/pci-0000:00:14.0-usb-0:2:1.0-mouse
DEVNAME=/dev/input/mouse2
DEVPATH=/devices/pci0000:00/0000:00:14.0/usb2/2-2/2-2:1.0/0003:046D:C05F.000C/input/input28/mouse2
ID_BUS=usb
ID_INPUT=1
ID_INPUT_MOUSE=1
ID_MODEL=USB_Optical_Mouse
ID_MODEL_ENC=USB\x20Optical\x20Mouse
ID_MODEL_ID=c05f
ID_PATH=pci-0000:00:14.0-usb-0:2:1.0
ID_PATH_TAG=pci-0000_00_14_0-usb-0_2_1_0
ID_REVISION=5300
ID_SERIAL=Logitech_USB_Optical_Mouse
ID_TYPE=hid
ID_USB_DRIVER=usbhid
ID_USB_INTERFACES=:030102:
ID_USB_INTERFACE_NUM=00
ID_VENDOR=Logitech
ID_VENDOR_ENC=Logitech
ID_VENDOR_ID=046d
MAJOR=13
MINOR=34
SEQNUM=3078
SUBSYSTEM=input
USEC_INITIALIZED=3972254002

Я так понимаю, для всех мышей нужно указать ключи KERNEL="mouse*" и SUBSYSTEM="input". В итоге получается что-то вроде этого:

SUBSYSTEM=="input", KERNEL=="mouse*", ACTION=="add", RUN+="/home/common/scripts/xswitch 'DLLC6AD:00 06CB:75BF Touchpad'"
SUBSYSTEM=="input", KERNEL=="mouse*", ACTION=="remove", RUN+="/home/common/scripts/xswitch 'DLLC6AD:00 06CB:75BF Touchpad'"

И всё. Если перезагрузить udev service udev restart нужного эффекта не происходит. Пробовал запускать udevadm test /devices/pci0000:00/0000:00:14.0/usb2/2-2/2-2:1.0/0003:046D:C05F.000C/input/input28/mouse2, он даёт следующий выхлоп:

... МНОГА "Reading rules file:", затем ...
rules contain 393216 bytes tokens (32768 * 12 bytes), 36838 bytes strings
24589 strings (207569 bytes), 20980 de-duplicated (174341 bytes), 3610 trie nodes used
value '[dmi/id]sys_vendor' is 'Dell Inc.'
value '[dmi/id]sys_vendor' is 'Dell Inc.'
IMPORT builtin 'input_id' /lib/udev/rules.d/50-udev-default.rules:14
capabilities/ev raw kernel attribute: 17
capabilities/abs raw kernel attribute: 0
capabilities/rel raw kernel attribute: 103
capabilities/key raw kernel attribute: 70000 0 0 0 0
properties raw kernel attribute: 0
test_key: checking bit block 0 for any keys; found=0
test_key: checking bit block 64 for any keys; found=0
test_key: checking bit block 128 for any keys; found=0
test_key: checking bit block 192 for any keys; found=0
GROUP 135 /lib/udev/rules.d/50-udev-default.rules:30
IMPORT builtin 'usb_id' /lib/udev/rules.d/60-persistent-input.rules:7
/sys/devices/pci0000:00/0000:00:14.0/usb2/2-2/2-2:1.0: if_class 3 protocol 0
LINK 'input/by-id/usb-Logitech_USB_Optical_Mouse-mouse' /lib/udev/rules.d/60-persistent-input.rules:22
IMPORT builtin 'path_id' /lib/udev/rules.d/60-persistent-input.rules:31
LINK 'input/by-path/pci-0000:00:14.0-usb-0:2:1.0-mouse' /lib/udev/rules.d/60-persistent-input.rules:32
RUN '/home/common/scripts/xswitch 'DLLC6AD:00 06CB:75BF Touchpad'' /etc/udev/rules.d/99-local.rules:1
handling device node '/dev/input/mouse2', devnum=c13:34, mode=0660, uid=0, gid=135
preserve permissions /dev/input/mouse2, 020660, uid=0, gid=135
preserve already existing symlink '/dev/char/13:34' to '../input/mouse2'
found 'c13:34' claiming '/run/udev/links/\x2finput\x2fby-id\x2fusb-Logitech_USB_Optical_Mouse-mouse'
creating link '/dev/input/by-id/usb-Logitech_USB_Optical_Mouse-mouse' to '/dev/input/mouse2'
preserve already existing symlink '/dev/input/by-id/usb-Logitech_USB_Optical_Mouse-mouse' to '../mouse2'
found 'c13:34' claiming '/run/udev/links/\x2finput\x2fby-path\x2fpci-0000:00:14.0-usb-0:2:1.0-mouse'
creating link '/dev/input/by-path/pci-0000:00:14.0-usb-0:2:1.0-mouse' to '/dev/input/mouse2'
preserve already existing symlink '/dev/input/by-path/pci-0000:00:14.0-usb-0:2:1.0-mouse' to '../mouse2'
.INPUT_CLASS=mouse
.MM_USBIFNUM=00
ACTION=add
DEVLINKS=/dev/input/by-path/pci-0000:00:14.0-usb-0:2:1.0-mouse /dev/input/by-id/usb-Logitech_USB_Optical_Mouse-mouse
DEVNAME=/dev/input/mouse2
DEVPATH=/devices/pci0000:00/0000:00:14.0/usb2/2-2/2-2:1.0/0003:046D:C05F.000C/input/input28/mouse2
ID_BUS=usb
ID_INPUT=1
ID_INPUT_MOUSE=1
ID_MODEL=USB_Optical_Mouse
ID_MODEL_ENC=USB\x20Optical\x20Mouse
ID_MODEL_ID=c05f
ID_PATH=pci-0000:00:14.0-usb-0:2:1.0
ID_PATH_TAG=pci-0000_00_14_0-usb-0_2_1_0
ID_REVISION=5300
ID_SERIAL=Logitech_USB_Optical_Mouse
ID_TYPE=hid
ID_USB_DRIVER=usbhid
ID_USB_INTERFACES=:030102:
ID_USB_INTERFACE_NUM=00
ID_VENDOR=Logitech
ID_VENDOR_ENC=Logitech
ID_VENDOR_ID=046d
MAJOR=13
MINOR=34
SUBSYSTEM=input
USEC_INITIALIZED=3972254002
run: '/home/common/scripts/xswitch 'DLLC6AD:00 06CB:75BF Touchpad''
Unload module index
Unloaded link configuration context.

То есть моё моё правило он с устройством вроде как сопоставил, добавил скрипт на выполнение. Не могу понять что означает «Unload module index Unloaded link configuration context.». Насколько я понял скрипт не выполняется (во всяком случае побочного эффекта я не вижу).

Машинка бегает под Ubuntu 16.04. Рассчитываю на вашу помощь, заранее спасибо.

Всё правильно, если в test действие отображается, значит, оно выполнится. Проверь permission bits на скрипте.

А ещё вот что:

Если перезагрузить udev service udev restart нужного эффекта не происходит

Он и не должен. Действия выполняются только при подключении/отключении устройств (т. е., например, во время coldplug при старте системы), а не при перезапуске udev. Попробуй после перезапуска udevadm trigger, но не факт, что это сработает.

/home/common/scripts/xswitch

Если скрипт у тебя на отдельном /home, то при загрузке системы у тебя будет гонка между udev и монтированием /home, в которой наверняка выиграет udev и твой скрипт не выполнится, потому что неоткуда.

intelfx ★★★★★ ()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от intelfx

Если скрипт у тебя на отдельном /home, то при загрузке системы у тебя будет гонка между udev и монтированием /home, в которой наверняка выиграет udev и твой скрипт не выполнится, потому что неоткуда.

А где в линуксе принято держать такие скрипты?

zoroaster ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.