I wanted to be able to synchronize my W810i without being root. I used a udev rule to allow permissions. After plugging in my mobile, running the lsusb command yielded that the phone was at Bus 005 Device 010.

$ lsusb
Bus 005 Device 010: ID 0fce:d042 Sony Ericsson Mobile Communications AB
...

Now that we know the path udev will use, I’ll query the information that udev has for it.

$ udevinfo -a -p $(udevinfo -q path -n /dev/bus/usb/005/010)
...
looking at parent device '/devices/pci0000:00/0000:00:1d.7/usb5/5-8/5-8.1/5-8.1.2':
KERNELS=="5-8.1.2"
SUBSYSTEMS=="usb"
...
ATTRS{idProduct}=="d042"
ATTRS{idVendor}=="0fce"
...

I’m going to use the SUBSYSTEMS, ATTRS{idProduct}, and ATTRS{idVendor} keys here. Create a custom file in
/etc/udev/rules.d. I called it custom.rules. There is where we’ll put the new rule.

SUBSYSTEMS=="usb", ATTRS{idVendor}=="0fce", ATTRS{idProduct}=="d042", MODE="0660", OWNER="YOUR-USERNAME"

using the information from the udevinfo command we ran above. MODE is the permissions, and OWNER
is of course your username.

To test that it works:

$ udevtest $(udevinfo -q path -n /dev/bus/usb/005/011)

This program is for debugging only, it does not run any program,
specified by a RUN key. It may show incorrect results, because
some values may be different, or not available at a simulation run.

parse_file: reading '/etc/udev/rules.d/05-udev-early.rules' as rules file
parse_file: reading '/etc/udev/rules.d/06-udev-rh-early.rules' as rules file
parse_file: reading '/etc/udev/rules.d/40-multipath.rules' as rules file
parse_file: reading '/etc/udev/rules.d/50-udev.rules' as rules file
parse_file: reading '/etc/udev/rules.d/60-net.rules' as rules file
parse_file: reading '/etc/udev/rules.d/60-pcmcia.rules' as rules file
parse_file: reading '/etc/udev/rules.d/60-persistent-input.rules' as rules file
parse_file: reading '/etc/udev/rules.d/60-persistent-storage.rules' as rules file
parse_file: reading '/etc/udev/rules.d/60-wacom.rules' as rules file
parse_file: reading '/etc/udev/rules.d/85-pcscd_ccid.rules' as rules file
parse_file: reading '/etc/udev/rules.d/85-pcscd_egate.rules' as rules file
parse_file: reading '/etc/udev/rules.d/90-alsa.rules' as rules file
parse_file: reading '/etc/udev/rules.d/90-hal.rules' as rules file
parse_file: reading '/etc/udev/rules.d/95-pam-console.rules' as rules file
parse_file: reading '/etc/udev/rules.d/95-udev-late.rules' as rules file
parse_file: reading '/etc/udev/rules.d/99-fuse.rules' as rules file
parse_file: reading '/etc/udev/rules.d/bluetooth.rules' as rules file
parse_file: reading '/etc/udev/rules.d/custom.rules' as rules file
import_uevent_var: import into environment: 'MAJOR=189'
import_uevent_var: import into environment: 'MINOR=522'
import_uevent_var: import into environment: 'PHYSDEVPATH=/devices/pci0000:00/0000:00:1d.7/usb5/5-8/5-8.1/5-8.1.2'
import_uevent_var: import into environment: 'PHYSDEVBUS=usb'
import_uevent_var: import into environment: 'PHYSDEVDRIVER=usb'
main: looking at device '/class/usb_device/usbdev5.11' from subsystem 'usb_device'
run_program: '/bin/sh -c 'K=usbdev5.11; K=${K#usbdev}; printf bus/usb/%03i/%03i ${K%%.*} ${K#*.}''
run_program: '/bin/sh' (stdout) 'bus/usb/005/011'
run_program: '/bin/sh' returned with status 0
udev_rules_get_name: rule applied, 'usbdev5.11' becomes 'bus/usb/005/011'
udev_db_get_device: found a symlink as db file
udev_device_event: device '/class/usb_device/usbdev5.11' already in database, cleanup
udev_node_add: creating device node '/dev/bus/usb/005/011', major=189, minor=522, mode=0660, uid=500, gid=0
main: run: 'socket:/org/kernel/udev/monitor'
main: run: 'socket:/org/freedesktop/hal/udev_event'
main: run: '/sbin/pam_console_apply /dev/bus/usb/005/011 '

I see that it read the custom.rules file and that it set uid=500. I hope this helps. Check this out for some very helpful and more inclusive info on writing udev rules.

Leave a Reply