Using udev to change device permissions

Hi,

I want to change the device permissions for /dev/parport0 to 666 in openSuSE 11.1, from the current 664.

I guess I could do this by running “chmod 666 /dev/parport0” every time the computer boots up, maybe, but I aim to do this using udev rules as I suppose that is the “correct” way to do it.

So, I have written my own rules file (/etc/udev/rules.d/10-local.rules) with the contents:

KERNEL=="parport[0-9]*",	GROUP="lp", MODE="0666"

Theoretically I should then be able to put these new rules into effect by running the command:

udevadm control --reload-rules

or possibly:

udevadm trigger

Doing either however has no effect on /dev/parport0.

Checking udev database with:

udevadm info --export-db | grep parport0

yields:

P: /devices/pnp0/00:07/ppdev/parport0
N: parport0

Using that to simulate the udev event for that device with command:

udevadm test /devices/pnp0/00:07/ppdev/parport0

yeilds:

run_command: calling: test
udevadm_test: version 128
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/10-local.rules' as rules file
parse_file: reading '/dev/.udev/rules.d/10-root-symlink.rules' as rules file
parse_file: reading '/etc/udev/rules.d/40-alsa.rules' as rules file
parse_file: reading '/etc/udev/rules.d/40-bluetooth.rules' as rules file
parse_file: reading '/lib/udev/rules.d/40-suse.rules' as rules file
parse_file: reading '/lib/udev/rules.d/40-zaptel.rules' as rules file
parse_file: reading '/etc/udev/rules.d/41-soundfont.rules' as rules file
parse_file: reading '/lib/udev/rules.d/50-udev-default.rules' as rules file
parse_file: reading '/etc/udev/rules.d/51-lirc.rules' as rules file
parse_file: reading '/etc/udev/rules.d/51-packagekit-firmware.rules' as rules file
parse_file: reading '/etc/udev/rules.d/55-hpmud.rules' as rules file
parse_file: reading '/etc/udev/rules.d/55-libsane.rules' as rules file
parse_file: reading '/etc/udev/rules.d/56-idedma.rules' as rules file
parse_file: reading '/etc/udev/rules.d/56-sane-backends-autoconfig.rules' as rules file
parse_file: reading '/lib/udev/rules.d/60-cdrom_id.rules' as rules file
parse_file: reading '/lib/udev/rules.d/60-persistent-input.rules' as rules file
parse_file: reading '/lib/udev/rules.d/60-persistent-storage-tape.rules' as rules file
parse_file: reading '/lib/udev/rules.d/60-persistent-storage.rules' as rules file
parse_file: reading '/lib/udev/rules.d/60-persistent-v4l.rules' as rules file
parse_file: reading '/lib/udev/rules.d/61-persistent-storage-edd.rules' as rules file
parse_file: reading '/lib/udev/rules.d/64-device-mapper.rules' as rules file
parse_file: reading '/lib/udev/rules.d/64-lvm2.rules' as rules file
parse_file: reading '/lib/udev/rules.d/64-md-raid.rules' as rules file
parse_file: reading '/etc/udev/rules.d/65-wacom.rules' as rules file
parse_file: reading '/etc/udev/rules.d/70-kpartx.rules' as rules file
parse_file: reading '/etc/udev/rules.d/70-persistent-cd.rules' as rules file
parse_file: reading '/etc/udev/rules.d/70-persistent-net.rules' as rules file
parse_file: reading '/etc/udev/rules.d/71-multipath.rules' as rules file
parse_file: reading '/lib/udev/rules.d/75-cd-aliases-generator.rules' as rules file
parse_file: reading '/lib/udev/rules.d/75-persistent-net-generator.rules' as rules file
parse_file: reading '/etc/udev/rules.d/77-network.rules' as rules file
parse_file: reading '/lib/udev/rules.d/79-fstab_import.rules' as rules file
parse_file: reading '/lib/udev/rules.d/80-drivers.rules' as rules file
parse_file: reading '/lib/udev/rules.d/90-hal.rules' as rules file
parse_file: reading '/lib/udev/rules.d/95-udev-late.rules' as rules file
parse_file: reading '/etc/udev/rules.d/99-pcsc_lite.rules' as rules file
import_uevent_var: import into environment: 'MAJOR=99'
import_uevent_var: import into environment: 'MINOR=0'
udevadm_test: looking at device '/devices/pnp0/00:07/ppdev/parport0' from subsystem 'ppdev'
udev_rules_get_name: no node name set, will use kernel name 'parport0'
udev_db_get_device: found a symlink as db file
udev_device_event: device '/devices/pnp0/00:07/ppdev/parport0' already in database, cleanup
udev_node_add: creating device node '/dev/parport0', major=99, minor=0, mode=0664, uid=0, gid=7
udevadm_test: run: 'socket:@/org/freedesktop/hal/udev_event'
udevadm_test: run: 'socket:@/org/kernel/udev/monitor'
udev_unref: context 0x80673e8 released

I see my own rules file is read, but near the end of that output it says:

udev_device_event: device '/devices/pnp0/00:07/ppdev/parport0' already in database, cleanup
udev_node_add: creating device node '/dev/parport0', major=99, minor=0, mode=0664, uid=0, gid=7

Does “already in database” mean that it’s ignoring my rules, and hence setting permissions to 664?

What am I missing / doing wrong here?

Thankful for any help on the subject.

Hmm… perhaps I misinterpreted (sort of) the documentation of udev at Writing udev rules.

There it says “In general, you want your own rules to be parsed before the defaults, so I suggest you create a file at /etc/udev/rules.d/10-local.rules and write all your rules into this file.”, which I interpreted as, the sooner the rules file is read the higher priority for the rule.

Simply renaming my rules file to “99-zzz-local.rules” solves the problem since it will then be last to be parsed and it’s rules will be the ones in effect.

Simply renaming my rules file to “99-zzz-local.rules” solves the problem since it will then be last to be parsed and it’s rules will be the ones in effect.

Yes, thats right. However, you can force an earlier rule by using the ‘last_rule’ option in your rule. Outlined here:

Writing udev rules