Vous êtes sur la page 1sur 9

Comprendre udev

Le système udev
udev est un système dynamique qui fait que le répertoire /dev ne contient que les noms des
périphériques physiquement présents. Pour connaître les périphériques de son système, il suffit
d'exécuter la commande ls /dev/. il n'est plus nécessaire de consulter le répertoire /proc et ses
nombreux fichiers pour découvrir l'architecture matérielle. Le système udev peut, à priori, être
ignoré des utilisateurs puisqu'il est destiné à leur rendre la vie plus facile et à fonctionner de
manière tout à fait transparente. La curiosité est déjà une bonne raison d'en connaître les principaux
rouages.

Les composants du système udev

Le démon udevd
C'est le démon udevd qui, averti par le noyau de l'ajout ou du retrait d'un périphérique, agit en
conséquence pour maintenir à jour le répertoire /dev. Il est normalement démarré et arrêté par le
script /etc/init.d/udev. Quand le noyau notifie l'ajout ou le retrait d'un périphérique, le démon
udevd utilise des règles pour décider des actions à réaliser pour la création effective du fichier
/dev/xxx qui lui est demandé.
$ ps -e | grep udev
2739 ? 00:00:01 udevd

Le pseudo système de fichiers sysfs


Le système udev trouve les informations dont il a besoin dans l'arborescence /sys, encore appelée,
sysfs utilisée par le noyau pour exporter des informations sur les périphériques de la même manière
que /proc exporte des informations sur les processus.
$ pwd
/sys
$ ls
block bus class devices firmware fs kernel module
power slab

Les fichiers de configuration


Les fichiers de configuration de udev se trouvent dans le répertoire /etc/udev. Le principal fichier de
configuration est /etc/udev/udev.conf.
$ ls
libmtp.rules rules.d udev.conf

Le fichier udev.conf
Le fichier udev.conf contient la configuration de base du système udev. Il est relativement simple. Il
contient des définitions de variables : variable=valeur. Une variable peut ne pas être définie s'il
existe une valeur par défaut.

Page 1
Comprendre udev

Variable Description Valeur par défaut


udev_root Le répertoire qui contient les noms des /dev
périphériques.
udev_rules Le répertoire qui contient les fichiers de règles. /etc/udev/rules.d
udev_log Le niveau de log pour syslog : err, info ou
debug.

$ more udev.conf
# udev.conf
# The initial syslog(3) priority: "err", "info", "debug" or
its
# numerical equivalent. For runtime debugging, the daemons
internal
# state can be changed with: "udevcontrol
log_priority=<value>".
udev_log="err"

Les fichiers de règles


Les fichiers de règles définissent des règles qu'il faut appliquer à la création de certains fichiers
périphériques. chaque ligne d'un fichier contient au moins un couple clé valeur. L'ensemble des clés
d'une ligne définit une règle. Il existe deux types de clés : les clés comparatives et les clés de
définition. Les clés comparatives expriment une condition et les clés de définition une action. Si
toutes les clés de comparaison d'une règle sont satisfaites alors les actions des clés de définition sont
exécutées pour le périphériques.
Les clés comparatives utilisent les opérateurs :
== pour tester l'égalité.
!= pour tester la différence.
Les clés de définition utilisent les opérateurs :
= pour affecter une valeur à une clé. La clé est réinitialisée à la nouvelle valeur. La(es)
ancienne(s) valeur(s) de la clé est(sont) remplacée(s).
+= pour ajouter une valeur à une clé. Une clé peut donc contenir une liste de valeurs.
:= pour affecter une valeur à une clé mais aussi en interdire la modification par des règles qui
seraient exécutées après.

Quelques clés
ACTION Définit l'évènement.
DEVPATH Définit le chemin d'accès au périphérique dans sysfs..
ENV{Variable} La variable d'environnement Variable.
KERNEL Définit le nom du périphérique attribué par le noyau.
NAME Définit le nom du fichier périphérique à créer dans /dev.

Page 2
Comprendre udev

SUBSYSTEM Définit le type de périphérique (ie. block, character,usb...)


DRIVER Définit le nom du pilote (« driver ») du périphérique.
PROGRAM Nom d'un programme externe à exécuter.
RUN Nom d'un progamme supplémentaire à exécuter.
SYMLINK Nom(s) des liens symboliques à créer pour ce périphérique.
OWNER, GROUP, MODE Le propriétaire, le groupe et les droits du périphérique.
Le fichier qui suit définit une règle pour un disque dur : Si l'action est ajoutée (« add »), que le
périphérique est de type bloc « block ») et que le nom est hdx ou sdx avec x de a à z, il faut exécuter
le programme /lib/udev/hdparm.
$ more 85-hdparm.rules
ACTION=="add", SUBSYSTEM=="block", KERNEL=="[sh]d[a-z]", \
RUN+="/lib/udev/hdparm"

L'utilisation des jokers dans les valeurs.


Il est possible d'utiliser les jokers bien connus du shell : *, ? et [] pour donner un modèle de chaîne
de caractères.
Dans la clause KERNEL=="[sh]d[a-z]" le membre de droite signifie sda à sdz ou hda à hdz.
Dans la clause NAME=="?*" le membre de droite signifie au moins un caractère.

Quelques variables prédéfinies utiles dans les règles.


Il peut se faire que vous souhaitiez utiliser dans une valeur de clé une information détenue par udev.
C'est possible grâce à un ensemble de variables dont nous ne faisons ici que reporter les plus
significatives. Ces varaibles sont exprimées sous la forme %k ou $variable.
%k, $kernel Le nom noyau du périphérqiue.
%n, $number Le numéro du périphérique, ainsi %n vaut 3 pour sda3.
$driver Le nom du pilote (« driver ») du périphérique.
%M Le majeur du périphérique.
%m Le mineur du périphérique.
%E{variable}, La valeur de la variable denvironnement « variable ».
$e{variable}

La commande udevadm
La commande udevadm permet de contrôler et d'interroger le système udev.
Il existait auparavant des commandes udevinfo, udevtest... qui sont toutes regroupées
maintenant comme sous commandes de udevadm.
Syntaxe :

Page 3
Comprendre udev

udevadm commande [options] [arguments]


La commande indique quelle action udevadm doit exécuter.
Certaines commandes ont des options et des arguments.
Les commandes sont :
udevadm info [options]
udevadm trigger [options]
udevadm settle [options]
udevadm control [options] instruction
udevadm monitor [options]
udevadm test [options] devpath
udevadm version
udevadm help
Les options des commandes sont de la forme –option=valeur
L'exemple qui suit affiche toutes (« query=all ») les information du disque sda (--name=sda »).
$ udevadm info –query=all --name=sda
P: /block/sda
N: sda
S: disk/by-path/pci-0000:00:10.0-scsi-0:0:0:0
E: DEVTYPE=disk
E: ID_VENDOR=VMware,
E: ID_MODEL=VMware_Virtual_S
E: ID_REVISION=1.0
E: ID_SERIAL=
E: ID_SERIAL_SHORT=Uu\ufffd
E: ID_TYPE=disk
E: ID_BUS=scsi
E: ID_PATH=pci-0000:00:10.0-scsi-0:0:0:0
Visualisons les noms de disques et de partitions SCSI.
# ls sd*
sda sda1 sda2 sda3 sda4 sda5 sda6 sda7
Exécutons la commande qui surveille les évènements reçus et traités par udev quand le disque
externe USB de 80 Go a été branché.
# udevadm monitor
udevmonitor will print the received events for:
UDEV the event which udev sends out after rule processing
UEVENT the kernel uevent UEVENT[1221066499.899859] add
/devices/pci0000:00/0000:00:13.0/usb2/2-1 (usb)
UEVENT[1221066499.899972] add
/devices/pci0000:00/0000:00:13.0/usb2/2-1/usb_endpoint/usbdev2
.2_ep00 (usb_endpoint) UEVENT[1221066499.903623] add

Page 4
Comprendre udev

/devices/pci0000:00/0000:00:13.0/usb2/2-1/2-1:1.0 (usb)
UEVENT[1221066499.906040] add
/devices/pci0000:00/0000:00:13.0/usb2/2-1/2-1:1.0/usb_endpoint
/usbdev2.2_ep81 (usb_endpoint) UEVENT[1221066499.906112] add
/devices/pci0000:00/0000:00:13.0/usb2/2-1/2-1:1.0/usb_endpoint
/usbdev2.2_ep02 (usb_endpoint) UDEV [1221066500.021566] add
/devices/pci0000:00/0000:00:13.0/usb2/2-1 (usb)
UDEV [1221066500.070886] add
/devices/pci0000:00/0000:00:13.0/usb2/2-1/usb_endpoint/usbdev2
.2_ep00 (usb_endpoint) UEVENT[1221066500.177807] add
/module/usb_storage (module) UEVENT[1221066500.179464] add
/class/scsi_host/host4 (scsi_host) UEVENT[1221066500.179737]
add /bus/usb/drivers/usb-storage (drivers)
UDEV [1221066500.190253] add /bus/usb/drivers/usb-
storage (drivers)
UDEV [1221066500.201470] add
/devices/pci0000:00/0000:00:13.0/usb2/2-1/2-1:1.0 (usb) UDEV
[1221066500.242884] add /module/usb_storage (module)
UDEV [1221066500.248350] add
/devices/pci0000:00/0000:00:13.0/usb2/2-1/2-1:1.0/usb_endpoint
/usbdev2.2_ep81 (usb_endpoint) UDEV [1221066500.260324] add
/devices/pci0000:00/0000:00:13.0/usb2/2-1/2-1:1.0/usb_endpoint
/usbdev2.2_ep02 (usb_endpoint) UDEV [1221066500.304414] add
/class/scsi_host/host4 (scsi_host) UEVENT[1221066505.185982]
add
/devices/pci0000:00/0000:00:13.0/usb2/2-1/2-1:1.0/host4/target
4:0:0/4:0:0:0 (scsi) UEVENT[1221066505.186084] add
/class/scsi_disk/4:0:0:0 (scsi_disk)
UDEV [1221066505.234636] add
/devices/pci0000:00/0000:00:13.0/usb2/2-1/2-1:1.0/host4/target
4:0:0/4:0:0:0 (scsi)
UDEV [1221066505.252914] add /class/scsi_disk/4:0:0:0
(scsi_disk) UEVENT[1221066505.557818] add
/devices/pci0000:00/0000:00:13.0/usb2/2-1/2-1:1.0/host4/target
4:0:0/4:0:0:0/block/sdb (block) UEVENT[1221066505.557874] add
/devices/pci0000:00/0000:00:13.0/usb2/2-1/2-1:1.0/host4/target
4:0:0/4:0:0:0/block/sdb/sdb1
(block)
UEVENT[1221066505.557890] add /class/scsi_device/4:0:0:0
(scsi_device) UEVENT[1221066505.557903] add
/class/scsi_generic/sg2 (scsi_generic)
UEVENT[1221066505.557936] add /class/bsg/4:0:0:0 (bsg)
UDEV [1221066506.054068] add
/devices/pci0000:00/0000:00:13.0/usb2/2-1/2-1:1.0/host4/target
4:0:0/4:0:0:0/block/sdb (block) UDEV [1221066506.606484] add
/devices/pci0000:00/0000:00:13.0/usb2/2-1/2-1:1.0/host4/target
4:0:0/4:0:0:0/block/sdb/sdb1
(block)

Page 5
Comprendre udev

UDEV [1221066506.653861] add /class/scsi_device/4:0:0:0


(scsi_device)
UDEV [1221066506.664119] add /class/bsg/4:0:0:0 (bsg)
UDEV [1221066506.677638] add /class/scsi_generic/sg2
(scsi_generic)
Visualisons les noms de disques et de partitions SCSI après branchement du disque.
# ls sd*
sda sda1 sda2 sda3 sda4 sda5 sda6 sda7 sdb sdb1

Créer ses propres règles


Les noms des fichiers de règle sont de la forme nn-description.rules. ils sont parcourus et exécuter
par udev dans l'ordre des préfixes numériques nn.
Dans Linux Ubuntu, le fichier README du répertoire rules.d indique le rôle de chacun et nous
fournit une indication précieuse, c'est le fichier 50-xxxxx.rules qui devraient contenir les règles
définies spécifiquement pour un système.
# cat README
The files in this directory are read by udev(7) and used when
events
are performed by the kernel. The udev daemon watches this
directory
with inotify so that changes to these files are automatically
picked
up, for this reason they must be files and not symlinks to
another
location as in the case in Debian.
Files should be named xx-descriptive-name.rules, the xx should
be
chosen first according to the following sequence points:
00 rules that it is critical to be run first, usually
only WAIT_FOR_SYSFS
20 rules that change the name from the device from the
default
(cannot be overriden)
40 rules that set the permissions of device nodes
(can be overriden by later rules)
60 rules that add symlinks to device nodes
(adds to those set in earlier rules)
80 rules that run programs (but do not load modules)
90 rules that load modules
99 rules that it is critical to be run last
This scheme has been chosen so that user-supplied rules are
normally named 50-*.rules for the right thing to happen.
Ce schéma a été choisi pour que les règles « utilisateur »
soient nommés 50-*.rules afin qu'elles soient exécutées au bon
endroit.

Page 6
Comprendre udev

Packages should chose the approriate sequence point and add 5


to it (e.g. 25-iftab.rules, 45-libsane.rules, etc.) unless
there is a need for a particular order.

Un exemple de création de règle


Cet exemple a été réalisé avec une distribution Fedora 8.
Nous disposons d'une clé USB avec une partition sdx1, x étant a,b ... selon le branchement et les
disques déjà existants. Le système de fichiers associés à la partition a l'étiquette CLE_GILLES et
c'est celle ci qui est utilisée pour le générer le répertoire de montage /media/CLE_GILLES.
Nous souhaitons en outre que soit créé un lien symbolique gillesgoubet sur la partition sdx1 dont le
nom est créé automatiquement par udev au branchement du disque.
Visualisons les noms de disque présents dans /dev.
# ls sd*
sda sda1 sda2 sda5 sda6
Branchons la clé USB et visualisons à nouveau les noms de disque.
# ls sd*
sda sda1 sda2 sda5 sda6 sdb sdb1
Pour construire la règle, commençons par visualiser les attributs du périphérique.
# udevadm info --query=all –name=sdb1 # ou udevadm info
--query=all –path=/block/sdb/sdb1
P: /block/sdb/sdb1
N: sdb1
S: disk/by-id/usb-USB_2.0_Flash_Disk-0:0-part1
S: disk/by-path/pci-0000:00:10.4-usb-0:3:1.0-scsi-0:0:0:0-
part1
S: disk/by-uuid/54CD-50D3
S: disk/by-label/CLE_GILLES
E: DEVTYPE=partition
E: ID_VENDOR=USB_2.0
E: ID_MODEL=Flash_Disk
E: ID_REVISION=2.00
E: ID_SERIAL=USB_2.0_Flash_Disk-0:0
E: ID_TYPE=disk
E: ID_INSTANCE=0:0
E: ID_BUS=usb
E: ID_PATH=pci-0000:00:10.4-usb-0:3:1.0-scsi-0:0:0:0
E: ID_FS_USAGE=filesystem
E: ID_FS_TYPE=vfat
E: ID_FS_VERSION=FAT16
E: ID_FS_UUID=54CD-50D3
E: ID_FS_UUID_ENC=54CD-50D3
E: ID_FS_LABEL=CLE_GILLES
E: ID_FS_LABEL_ENC=CLE_GILLES
E: ID_FS_LABEL_SAFE=CLE_GILLES

Page 7
Comprendre udev

Pour définir la règle qui crée le lien symbolique, le plus simple est de se baser sur une information
invariante, le nom de disque est en effet aléatoire et pourrait être autre que sdb. Pour certains
matériels, cela peut être le modèle. Dans le cas présent, le label CLE_GILLES, nous a paru plus
intangible.
Nous créons le fichier /etc/udev/rules.d/99-reglesutilisateurs.rules
# cat 99-reglesutilisateurs.rules
ENV{ID_FS_LABEL}=="CLE_GILLES",SYMLINK+="gillesgoubet",ENV{GEN
ERATED}="1"
Nous débranchons et rebranchons la clé USB.
testons le branchement avec udevadm test.
# udevadm test /block/sdb/sdb1
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/00-hsf.rules' as rules
file
parse_file: reading '/etc/udev/rules.d/05-udev-early.rules' as
rules file
...
parse_file: reading '/etc/udev/rules.d/99-
reglesutilisateurs.rules' as rules file
udevtest: looking at device '/block/sdb/sdb1' from subsystem
'block'
match_rule: set ENV 'DEVTYPE=partition'
udev_rules_get_name: add symlink 'disk/by-id/usb-
USB_2.0_Flash_Disk-0:0-part1'
udev_rules_get_name: add symlink 'disk/by-
path/pci-0000:00:10.4-usb-0:3:1.0-scsi-0:0:0:0-part1'
run_program: 'vol_id --export /dev/.tmp-8-17'
run_program: '/lib/udev/vol_id' (stdout)
'ID_FS_USAGE=filesystem'
...
run_program: '/lib/udev/vol_id' (stdout)
'ID_FS_LABEL=CLE_GILLES'
...
udev_rules_get_name: add symlink 'gillesgoubet'
...
udevtest: run: 'socket:/org/kernel/udev/monitor'
Vérifions
# pwd
/dev
# find . -name '*goubet*'
./gillesgoubet

Page 8
Comprendre udev

./.udev/names/gillesgoubet
# ls -l gilles*
lrwxrwxrwx 1 root root 4 sep 11 09:54 gillesgoubet -> sdb1
La durée de vie du lien symbolique est évidement limitée à la durée du branchement de la clé.
# ls /dev/*goubet*
ls: ne peut accéder /dev/*goubet*: Aucun fichier ou répertoire
de ce type

Page 9

Vous aimerez peut-être aussi