UDEV : La gestion des péripheriques sous linux
Au branchement ou débranchement d'un périphérique, le kernel envoi un uevent à udev, qui va en fonction des arguments qui lui est fourni va aller chercher dans le dossier rules.d les informations correspondantes.
Petite introduction pour ce premier billet sur udev
Gestion des périphériques grâce à udev
Si udev trouve une règle qui s'applique aux informations de l'uevent, il :
- applique les actions définies dans les règles
- charge les modules éventuellement
- crée les différents nœuds liens symboliques dans le dossier /dev
Un Uevent
l'uevent est l'événement provenant du kernel. Il est envoyé à chaque (dé)branchement d'un périphérique. Il contient :
- les informations sur la nature du périphérique (ex : périphérique réseau, usb, block)
- l'action effectuée : Branchée ou Débranchée
- les attributs de ce périphérique (ex : marque, version, adresse mac, model...)
Configuration udev
La configuration d'udev se fait grâce au répertoire /etc/udev/. Celui-ci contient le fichier udev.conf qui est le fichier de configuration principale. Ainsi que le répertoire rules.d qui lui contient toutes les règles à appliquer suivant les événements udev.
Fichiers rules d'udev
Le nommage des fichiers se fait comme ceci : priorité_categorie.rules ex : 90-usb.rules. Les règles (une par ligne) contenues dans les fichiers sont organisées sur un système de clé/opérateur/valeur séparées par des virgules.
Exemple de fichier qui permet de définir le nom d'un périphérique réseau qui à une adresse mac précise. ACTION=="add", SUBSYSTEM=="net", DRIVERS="?*", ATTR{address}=="00:11:22:33:44:00", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
Les clés principales :
- ACTION : l'action à effectuer add, remove
- KERNEL : définit le nom du périphérique d’après les fonctionnalités du kernel (ex eth*)
- SUBSYSTEM : sous-système contenant le périphérique
- DRIVER : pilote du périphérique
- NAME : nom unique du nœud associé au périphérique
- SYMLINK : nom alternative au périphérique (lien symbolique)
- ATTR{nom} : attribut sysfs ( product , model , size , )
- PROGRAM : permet l'appel d'un programme externe lors de l’interprétation de la règle
- ENV{nom} : variable d'environnement (modification ou lecture)
Opérateurs :
Il existe plusieurs opérateurs
- == égalité
- != inégalité
- = fixe la valeur
- += concaténé à la fin
- := affectation définitive et empêche toute modification futur
Afficher en temps réel les uvents envoyés par le kernel
udevadm monitor --property
Au branchement d'une clé usb retourne
UDEV [7255.056202] add /devices/pci0000:00/0000:00:01.0/0000:03:00.0/usb2/2-3/2-3:1.0/host9/target9:0:0/9:0:0:0/block/sdh (block) .ID_FS_TYPE_NEW=vfat ACTION=add DEVLINKS=/dev/disk/by-id/usb-Kingston_DataTraveler_G3_60A44C41388DFD712986245C-0:0 /dev/disk/by-path/pci-0000:03:00.0-usb-0:3:1.0-scsi-0:0:0:0 /dev/disk/by-label/PHOTOS /dev/disk/by-uuid/0465-7FA7 DEVNAME=/dev/sdh DEVPATH=/devices/pci0000:00/0000:00:01.0/0000:03:00.0/usb2/2-3/2-3:1.0/host9/target9:0:0/9:0:0:0/block/sdh DEVTYPE=disk ID_BUS=usb ID_DRIVE_THUMB=1 ID_FS_LABEL=PHOTOS ID_FS_LABEL_ENC=PHOTOS ID_FS_TYPE=vfat ID_FS_USAGE=filesystem ID_FS_UUID=0465-7FA7 ID_FS_UUID_ENC=0465-7FA7 ID_FS_VERSION=FAT32 ID_INSTANCE=0:0 ID_MODEL=DataTraveler_G3 ID_MODEL_ENC=DataTraveler\x20G3\x20 ID_MODEL_ID=1643 ID_PATH=pci-0000:03:00.0-usb-0:3:1.0-scsi-0:0:0:0 ID_PATH_TAG=pci-0000_03_00_0-usb-0_3_1_0-scsi-0_0_0_0 ID_REVISION=1.00 ID_SERIAL=Kingston_DataTraveler_G3_60A44C41388DFD712986245C-0:0 ID_SERIAL_SHORT=60A44C41388DFD712986245C ID_TYPE=disk ID_USB_DRIVER=usb-storage ID_USB_INTERFACES=:080650: ID_USB_INTERFACE_NUM=00 ID_VENDOR=Kingston ID_VENDOR_ENC=Kingston ID_VENDOR_ID=0951 MAJOR=8 MINOR=112 SEQNUM=3481 SUBSYSTEM=block TAGS=:systemd: USEC_INITIALIZED=7255055818
Voilà pour une première partie concernant l'udev.