udev est le gestionnaire de périphériques de Linux.
Il a pour rôle de détecter et installer les nouveaux périphériques.
L’utilisateur peut interagir avec ce dernier avec des règles udev (rules).
Par exemple :
- changer ou figer le nom assigné par défaut à un périphérique
- attribuer des permissions et autorisations sur l’utilisation d’un périphérique
- exécuter un script lors de la connexion ou déconnexion d’un périphérique
Ce tutoriel vous explique le fonctionnement des règles udev et comment créer des règles udev.
Table des matières
Le fonctionnement des règles udev
Les règles udev permettent de définir et modifier le comportement du service lors de la détection d’un nouveau périphérique.
Les règles Udev sont définies dans des fichiers avec l’extension .rules.
Ces fichiers peuvent être placés à deux emplacements principaux:
- /usr/lib/udev/rules.d c’est le répertoire utilisé pour les règles installées par le système
- /etc/udev/rules.d/ est réservé aux règles personnalisées
Les fichiers dans lesquels les règles sont définies sont classiquement nommés avec un numéro comme préfixe.
Par exemple 50-udev-default.rules.
Ils sont traités dans l’ordre lexical indépendamment du répertoire dans lequel ils se trouvent.
A lire :
Créer et comprendre les règles udev
Voici un exemple de règle udev sur un serveur OVH se trouvant dans /etc/udev/rules.d/70-persistent-net.rules
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="3c:ec:ef:40:d6:d1", NAME="eno1"
C’est une règle réseau qui vise à ajouter une interface en01 pour l’interface réseau avec l’adresse MAC 3c:ec:ef:40:d6:d1.
Elles se composent de :
- Valeurs : sont entre “, donc ici net, add, ?*, eno1
- Clé : USBSYSTEM, ACTION, DRIVERS, ATTR{address}
- Opérateurs : ==, =, !=
Chaque ligne du fichier de règles contient au moins une paire clé-valeur.
Si toutes les clés de correspondance correspondent à leurs valeurs, la règle est appliquée et les clés d’affectation reçoivent les valeurs spécifiées attribuées.
Les opérateurs
Les règles fonctionnent avec des opérateurs ==, !=, etc.
Pour que la règle soit appliquée, les clés définies doivent correspondre ou ne pas correspondre à la valeur définie respectivement.
Opérateurs | Description |
== | Comparer pour l’égalité |
!= | Comparer pour l’inégalité |
= | Attribuer une valeur à une clé. Les clés qui représentent une liste sont réinitialisées et seule cette valeur unique est affectée. |
-= | Supprimer la valeur d’une clé contenant une liste d’entrées. |
:= | Attribuer enfin une valeur à une clé; interdire toute modification ultérieure. |
Les valeurs
Les valeurs sont écrites sous forme de chaînes entre guillemets, telles que (“chaîne”).
Si vous devez spécifier une valeur contenant un “, il faut l’échapper avec \.
Les clés
Voici les règles que l’on peut utiliser sur les périphériques.
Clé | Description |
ACTION | Faites correspondre le nom de l’action d’événement. |
DEVPATH | Faites correspondre le nom de l’action d’événement. DEVPATH |
KERNEL | Faites correspondre le chemin de développement du périphérique d’événement. NOYAU |
NAME | Faites correspondre le nom du périphérique événementiel. NOM |
SYMLINK | Faites correspondre le nom d’une interface réseau ou périphérique. Il peut être utilisé une fois que la clé NAME a été définie dans l’une des règles précédentes. |
SUBSYSTEM | Correspond au nom d’un lien symbolique ciblant le nœud. Il peut être utilisé une fois qu’une clé SYMLINK a été définie dans l’une des règles précédentes. Il peut y avoir plusieurs liens symboliques; un seul doit correspondre. |
DRIVER | Faites correspondre le sous-système du périphérique événementiel. |
ATTR{filename} | Faites correspondre le nom du pilote du périphérique événementiel. Définissez cette clé uniquement pour les périphériques liés à un pilote au moment de la génération de l’événement. |
SYSCTL{kernel parameter} | Faites correspondre les valeurs d’attribut sysfs du périphérique d’événement. Les espaces de fin dans les valeurs d’attribut sont ignorés sauf si la valeur de correspondance spécifiée elle-même contient des espaces de fin. |
KERNELS | Correspond à une valeur de paramètre de noyau |
SUBSYSTEMS | Recherchez le chemin de développement vers le haut pour un nom d’appareil correspondant. |
DRIVERS | Recherchez le chemin de développement vers le haut pour un nom de sous-système de périphérique correspondant. |
ATTRS{filename} | Recherchez le chemin de développement vers le haut pour un nom de pilote de périphérique correspondant. |
TAGS | Recherchez le chemin de développement vers le haut pour un périphérique avec des valeurs d’attribut sysfs correspondantes. Si plusieurs correspondances ATTRS sont spécifiées, elles doivent toutes correspondre sur le même périphérique. Les espaces de fin dans les valeurs d’attribut sont ignorés sauf si la valeur de correspondance spécifiée elle-même contient des espaces de fin. |
ENV{key} | Recherchez le chemin de développement vers le haut pour un périphérique avec la balise correspondante. |
CONST{key} | Correspondance avec une valeur de propriété de périphérique. |
TEST{octal mode mask} | Correspondance avec une balise d’appareil. |
PROGRAM | Testez l’existence d’un fichier. Un masque de mode octal peut être spécifié si nécessaire. |
RESULT | Exécutez un programme pour déterminer s’il existe une correspondance; la clé est vraie si le programme revient avec succès. Les propriétés de l’appareil sont mises à la disposition du programme exécuté dans l’environnement |
udevadm : gérer ses règles udev
udevadm est l’utilitaire qui permet de gérer les règles udev.
Par exemple pour tester et débugueur une règle udev, on peut utiliser l’option test.
udevadm test --action="add" /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.1/0003:046D:C52F.0010/input/input39
Pour forcer la relecture des règles udev après une modification ou ajout :
udevadm control --reload-rules
Exemples de règles udev
Enfin cette règle udev fixe la persistance des disques /dev/sda* en /dev/disk/by_id/I_BUS-ID_SERIAL
KERNEL=="sd*[0-9]|dasd*[0-9]", ENV{ID_SERIAL}=="?*", \
SYMLINK+="disk/by-id/$env{ID_BUS}-$env{ID_SERIAL}-part%n"
Cette règle udev fait correspondre /dev/sdb en /dev/mon_super_disque
KERNEL == "sdb", NAME = "mon_super_disque"
La règle suivant créé un /dev/cdrom à partir de /dev/hdc
KERNEL=="hdc", SYMLINK+="cdrom cdrom0"
Fixer la persistance d’un disque dur externe USB ou une clé USB selon son numéro ou la marque.
SUBSYSTEMS=="usb", ATTRS{serial}=="00000000000116", NAME="cle_1Go", Mode=="0777"
SUBSYSTEMS=="usb", ATTRS{manufacturer}=="Sony", ATTRS{product}=="Sony Handycam", NAME="camescope", Mode=="0777"
SUBSYSTEMS=="usb", ATTRS{product}=="USB TO IDE", NAME="hd-externe", Mode=="0777"