[systemd-devel] Using udev to notify application of device insertion/removal
Paul D. DeRocco
pderocco at ix.netcom.com
Mon Jul 2 20:34:54 UTC 2018
System: Yocto-based RT Linux 4.10.17, systemd 232, 32-bit x86, no GUI.
I've created the following "midiUSB.rules" file:
ACTION=="add", KERNEL=="midiC*", SUBSYSTEM=="sound",
SYMLINK+="snd/midi%b", RUN="/bin/touch /media/sda1/share/devchg"
ACTION=="remove", KERNEL=="midiC*", SUBSYSTEM=="sound", RUN="/bin/touch
/media/sda1/share/devchg"
(pardon the spurious email line breaks)
When I plug in a MIDI device, this gives me a device path like
"/dev/snd/midi1-8.3:1.0" based on what USB port I plugged it into, in
addition to the usual "/dev/snd/midiC1D0". When I unplug it, both names go
away. Perfect.
What's the "touch" command for? My "application" firmware needs to be
notified of any such change. It's already using an inotify to monitor that
directory for other reasons, so having it bump the timestamp on a dummy
file allows me to detect the change with one added line of code in my app.
The problem is, it's touching the timestamp when I insert the device, but
not when I remove it.
I used "udevadmin monitor", and got this (among other events) for the
insertion:
KERNEL[6175.279426] add
/devices/pci0000:00/0000:00:1d.7/usb1/1-8/1-8.3/1-8.3:1.0/sound/card1/midi
C1D0 (sound)
ACTION=add
DEVNAME=/dev/snd/midiC1D0
DEVPATH=/devices/pci0000:00/0000:00:1d.7/usb1/1-8/1-8.3/1-8.3:1.0/sound/ca
rd1/midiC1D0
MAJOR=116
MINOR=40
SEQNUM=1781
SUBSYSTEM=sound
and this for the removal:
KERNEL[6181.373765] remove
/devices/pci0000:00/0000:00:1d.7/usb1/1-8/1-8.3/1-8.3:1.0/sound/card1/midi
C1D0 (sound)
ACTION=remove
DEVNAME=/dev/snd/midiC1D0
DEVPATH=/devices/pci0000:00/0000:00:1d.7/usb1/1-8/1-8.3/1-8.3:1.0/sound/ca
rd1/midiC1D0
MAJOR=116
MINOR=40
SEQNUM=1784
SUBSYSTEM=sound
Looks okay, right? I used "udevadmin test" with the DEVPATH shown above,
and (after stripping all the boilerplate) I got this for the insertion:
GROUP 29 /lib/udev/rules.d/50-udev-default.rules:39
LINK 'snd/midi' /etc/udev/rules.d/midiUSB.rules:1
RUN '/bin/touch /media/sda1/share/devchg'
/etc/udev/rules.d/midiUSB.rules:1
handling device node '/dev/snd/midiC1D0', devnum=c116:40, mode=0660,
uid=0, gid=29
preserve permissions /dev/snd/midiC1D0, 020660, uid=0, gid=29
preserve already existing symlink '/dev/char/116:40' to '../snd/midiC1D0'
found 'c116:40' claiming '/run/udev/links/\x2fsnd\x2fmidi'
creating link '/dev/snd/midi' to '/dev/snd/midiC1D0'
preserve already existing symlink '/dev/snd/midi' to 'midiC1D0'
created db file '/run/udev/data/c116:40' for
'/devices/pci0000:00/0000:00:1d.7/usb1/1-8/1-8.3/1-8.3:1.0/sound/card1/mid
iC1D0'
ACTION=add
DEVLINKS=/dev/snd/midi
DEVNAME=/dev/snd/midiC1D0
DEVPATH=/devices/pci0000:00/0000:00:1d.7/usb1/1-8/1-8.3/1-8.3:1.0/sound/ca
rd1/midiC1D0
MAJOR=116
MINOR=40
SUBSYSTEM=sound
USEC_INITIALIZED=4019498530
run: '/bin/touch /media/sda1/share/devchg'
Unload module index
Unloaded link configuration context.
and this for the removal:
RUN '/bin/touch /media/sda1/share/devchg'
/etc/udev/rules.d/midiUSB.rules:2
no reference left, remove '/dev/snd/midi'
ACTION=remove
DEVLINKS=/dev/snd/midi
DEVNAME=/dev/snd/midiC1D0
DEVPATH=/devices/pci0000:00/0000:00:1d.7/usb1/1-8/1-8.3/1-8.3:1.0/sound/ca
rd1/midiC1D0
MAJOR=116
MINOR=40
SUBSYSTEM=sound
USEC_INITIALIZED=4019498530
run: '/bin/touch /media/sda1/share/devchg'
Unload module index
Unloaded link configuration context.
So it looks like it believes it's going to run my touch command when it's
removed, but when I actually do it, I don't see the timestamp change.
Any ideas on what's wrong, or how to debug this further?
--
Ciao, Paul D. DeRocco
Paul mailto:pderocco at ix.netcom.com
More information about the systemd-devel
mailing list