Sunday, November 21, 2021

udev events, making an udev rule and debugging rules.



udev is a device manager for the linux kernel.

when you connect some device (pendrive, camera, microphone) on a linux machine, you have a daemon listen to events that are fired when the kernel register a new device. All devices are mapped to a file on /dev so you could check some info about the device with this command:

udevadm info -a -n  /dev/DEVICE_NAME

i.e.: udevadm info -a -n  /dev/ttyUSB2

udevadm info -a -n  /dev/ttyUSB2 | grep '{devpath}' | head -n 1
udevadm info -a -n  /dev/ttyUSB2 | grep '{idVendor}' | head -n 1
udevadm info -a -n  /dev/ttyUSB2 | grep '{idProduct}' | head -n 1
udevadm info -a -n  /dev/ttyUSB2 | grep '{serial}' | head -n 1


knowing the device info we could make a rule based in the information and execute a new action: make a file, make a symlink or execute a script. For example I want to create a rule that match with the attributes devpath, idVendor, idProduct, serial and generate a new symlink.

we need to create a file into:

/etc/udev/rules.d/99-some-rule.rules

- in this file we need to use "" in the values.
- each line is a rule.
- each line has many or one attribute and one action. When the attributes matched  the action is executed, that's all.
- if you edit or create a new rule, you need to load and trigger all rules again.

udevadm control --reload-rules && udevadm trigger


- so sometimes is tricky check why some rule is not executed. For debug you have:

    - udevadm test /devices/platform/soc/3f980000.usb/usb1/1-1/1-1.3/1-1.3:1.0/ttyUSB0/tty/ttyUSB0

      the devices path you could obtain with the comand udevadm info.

    - udevadm monitor

      show the events that are fired.
    
    - udevadm control --log-priority=debug

      set the environment on debug mode.

    - udevadm test $(udevadm info --query=path --name=ttyUSB0)
      
      test all rules associated to the device name ttyUSB0

- when you have an syntax error on some rules file, this will appear in the logs:
    - journalctl -f

- restart service:
    - systemctl restart systemd-udevd
 

- kernel messages
    - dmesg

- example: file called 99-new-rule.rules:

SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", ATTRS{devpath}=="1.2", ATTRS{bcdDevice}=="0264", SYMLINK+="FANCY_NAME"

The 99 number indicated the priority for execution. in this case would be the last one to execute.

It's important to put double quotes instead single quote.

No comments:

Post a Comment