Académique Documents
Professionnel Documents
Culture Documents
201 Atelier Udev
201 Atelier 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.
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 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
$ 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"
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
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
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
Page 6
Comprendre udev
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