Dynamic Device Management With Udev
Dynamic Device Management With Udev
11
The kernel can add or remove almost any device in a running system. Changes in the
device state (whether a device is plugged in or removed) need to be propagated to
userspace. Devices need to be configured as soon as they are plugged in and recognized.
Users of a certain device need to be informed about any changes in this device's recognized state. udev provides the needed infrastructure to dynamically maintain the device
node files and symbolic links in the /dev directory. udev rules provide a way to plug
external tools into the kernel device event processing. This enables you to customize
udev device handling by, for example, adding certain scripts to execute as part of kernel
device handling, or request and import additional data to evaluate during device handling.
135
Every device driver carries a list of known aliases for devices it can handle. The list is
contained in the kernel module file itself. The program depmod reads the ID lists and
creates the file modules.alias in the kernel's /lib/modules directory for all
currently available modules. With this infrastructure, module loading is as easy as
136
Administration Guide
calling modprobe for every event that carries a MODALIAS key. If modprobe
$MODALIAS is called, it matches the device alias composed for the device with the
aliases provided by the modules. If a matching entry is found, that module is loaded.
All this is automatically triggered by udev.
/devices/pci0000:00/0000:00:1d.2/usb3/3-1
/devices/pci0000:00/0000:00:1d.2/usb3/3-1
137
UEVENT[1185238505.279527] add
/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0 (usb)
UDEV [1185238505.285573] add
/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0 (usb)
UEVENT[1185238505.298878] add
/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/input/input10 (input)
UDEV [1185238505.305026] add
/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/input/input10 (input)
UEVENT[1185238505.305442] add
/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/input/input10/mouse2 (input)
UEVENT[1185238505.306440] add
/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/input/input10/event4 (input)
UDEV [1185238505.325384] add
/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/input/input10/event4 (input)
UDEV [1185238505.342257] add
/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/input/input10/mouse2 (input)
The UEVENT lines show the events the kernel has sent over netlink. The UDEV lines
show the finished udev event handlers. The timing is printed in microseconds. The time
between UEVENT and UDEV is the time udev took to process this event or the udev
daemon has delayed its execution to synchronize this event with related and already
running events. For example, events for hard disk partitions always wait for the main
disk device event to finish, because the partition events may rely on the data that the
main disk event has queried from the hardware.
udevadm monitor --env shows the complete event environment:
ACTION=add
DEVPATH=/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/input/input10
SUBSYSTEM=input
SEQNUM=1181
NAME="Logitech USB-PS/2 Optical Mouse"
PHYS="usb-0000:00:1d.2-1/input0"
UNIQ=""
EV=7
KEY=70000 0 0 0 0
REL=103
MODALIAS=input:b0003v046DpC03Ee0110-e0,1,2,k110,111,112,r0,1,8,amlsfw
udev also sends messages to syslog. The default syslog priority that controls which
messages are sent to syslog is specified in the udev configuration file /etc/udev/
udev.conf. The log priority of the running daemon can be changed with udevadm
control log_priority=level/number.
138
Administration Guide
The console rule consists of three keys: one match key (KERNEL) and two assign
keys (MODE, OPTIONS). The KERNEL match rule searches the device list for any items
of the type console. Only exact matches are valid and trigger this rule to be executed.
The MODE key assigns special permissions to the device node, in this case, read and
write permissions to the owner of this device only. The OPTIONS key makes this rule
the last rule to be applied to any device of this type. Any later rule matching this particular device type does not have any effect.
139
The serial devices rule is not available in 50-udev-default.rules anymore, but it is still worth considering. It consists of two match keys (KERNEL and
ATTRS) and one assign key (SYMLINK). The KERNEL key searches for all devices of
the ttyUSB type. Using the * wild card, this key matches several of these devices.
The second match key, ATTRS, checks whether the product attribute file in sysfs
for any ttyUSB device contains a certain string. The assign key (SYMLINK) triggers
the addition of a symbolic link to this device under /dev/pilot. The operator used
in this key (+=) tells udev to additionally perform this action, even if previous or later
rules add other symbolic links. As this rule contains two match keys, it is only applied
if both conditions are met.
The printer rule deals with USB printers and contains two match keys which must
both apply to get the entire rule applied (SUBSYSTEM and KERNEL). Three assign
keys deal with the naming for this device type (NAME), the creation of symbolic device
links (SYMLINK) and the group membership for this device type (GROUP). Using the
* wild card in the KERNEL key makes it match several lp printer devices. Substitutions
are used in both, the NAME and the SYMLINK keys to extend these strings by the internal
device name. For example, the symlink to the first lp USB printer would read /dev/
usblp0.
The kernel firmware loader rule makes udev load additional firmware by an
external helper script during runtime. The SUBSYSTEM match key searches for the
firmware subsystem. The ACTION key checks whether any device belonging to the
firmware subsystem has been added. The RUN+= key triggers the execution of the
firmware.sh script to locate the firmware that is to be loaded.
Some general characteristics are common to all rules:
Each rule consists of one or more key value pairs separated by a comma.
A key's operation is determined by the operator. udev rules support several different
operators.
Each given value must be enclosed by quotation marks.
Each line of the rules file represents one rule. If a rule is longer than just one line,
use \ to join the different lines just as you would do in shell syntax.
udev rules support a shell-style pattern that matches the *, ?, and [] patterns.
140
Administration Guide
141
%p, $devpath
The value of DEVPATH.
%k, $kernel
The value of KERNEL or the internal device name.
%n, $number
The device number.
%N, $tempnode
The temporary name of the device file.
%M, $major
The major number of the device.
%m, $minor
The minor number of the device.
%s{attribute}, $attr{attribute}
The value of a sysfs attribute (specified by attribute).
%E{variable}, $attr{variable}
The value of an environment variable (specified by variable).
%c, $result
The output of PROGRAM.
%%
The % character.
$$
The $ character.
142
Administration Guide
ACTION
The name of the event action, for example, add or remove when adding or removing a device.
DEVPATH
The device path of the event device, for example,
DEVPATH=/bus/pci/drivers/ipw3945 to search for all events related to
the ipw3945 driver.
KERNEL
The internal (kernel) name of the event device.
SUBSYSTEM
The subsystem of the event device, for example, SUBSYSTEM=usb for all events
related to USB devices.
ATTR{filename}
sysfs attributes of the event device. To match a string contained in the vendor
attribute file name, you could use ATTR{vendor}=="On[sS]tream", for
example.
KERNELS
Let udev search the device path upwards for a matching device name.
SUBSYSTEMS
Let udev search the device path upwards for a matching device subsystem name.
DRIVERS
Let udev search the device path upwards for a matching device driver name.
ATTRS{filename}
Let udev search the device path upwards for a device with matching sysfs attribute
values.
ENV{key}
The value of an environment variable, for example, ENV{ID_BUS}="ieee1394
to search for all events related to the FireWire bus ID.
143
PROGRAM
Let udev execute an external program. To be successful, the program must return
with exit code zero. The program's output, printed to stdout, is available to the
RESULT key.
RESULT
Match the output string of the last PROGRAM call. Either include this key in the
same rule as the PROGRAM key or in a later one.
144
Administration Guide
RUN
Tell udev to add a program to the list of programs to be executed for this device.
Keep in mind to restrict this to very short tasks to avoid blocking further events
for this device.
LABEL
Add a label where a GOTO can jump to.
GOTO
Tell udev to skip a number of rules and continue with the one that carries the label
referenced by the GOTO key.
IMPORT{type}
Load variables into the event environment such as the output of an external program.
udev imports variables of several different types. If no type is specified, udev tries
to determine the type itself based on the executable bit of the file permissions.
program tells udev to execute an external program and import its output.
file tells udev to import a text file.
parent tells udev to import the stored keys from the parent device.
WAIT_FOR_SYSFS
Tells udev to wait for the specified sysfs file to be created for a certain device. For
example, WAIT_FOR_SYSFS="ioerr_cnt" informs udev to wait until the
ioerr_cnt file has been created.
OPTIONS
The OPTION key may have several possible values:
last_rule tells udev to ignore all later rules.
ignore_device tells udev to ignore this event completely.
ignore_remove tells udev to ignore all later remove events for the device.
all_partitions tells udev to create device nodes for all available partitions
on a block device.
145
146
Administration Guide
The following files and directories contain the crucial elements of the udev infrastructure:
/etc/udev/udev.conf
Main udev configuration file.
/etc/udev/rules.d/*
udev event matching rules.
/lib/udev/devices/*
Static /dev content.
/lib/udev/*
Helper programs called from udev rules.
147