Recherche de site Web

Comment utiliser Udev pour la détection et la gestion des périphériques sous Linux


Udev (espace utilisateur /dev) est un sous-système Linux pour la détection et la gestion dynamique des périphériques, depuis la version 2.6 du noyau. C'est un remplacement de devfs et hotplug.

Il crée ou supprime dynamiquement des nœuds de périphérique (une interface vers un pilote de périphérique qui apparaît dans un système de fichiers comme s'il s'agissait d'un fichier ordinaire, stocké dans le répertoire /dev) au moment du démarrage ou si vous ajoutez un périphérique vers ou supprimer un périphérique du système. Il propage ensuite les informations sur un appareil ou les modifications de son état dans l'espace utilisateur.

Sa fonction est de 1) fournir aux applications système des événements de périphérique, 2) de gérer les autorisations des nœuds de périphérique et 3) de créer des liens symboliques utiles dans le répertoire /dev pour accéder aux périphériques, ou même de renommer les interfaces réseau. .

L'un des avantages de udev est qu'il peut utiliser des noms de périphériques persistants pour garantir une dénomination cohérente des périphériques lors des redémarrages, quel que soit leur ordre de découverte. Cette fonctionnalité est utile car le noyau attribue simplement des noms de périphériques imprévisibles en fonction de l'ordre de découverte.

Dans cet article, nous apprendrons comment utiliser Udev pour la détection et la gestion des appareils sur les systèmes Linux. Notez que la plupart, sinon la totalité, des distributions Linux modernes grand public sont livrées avec Udev dans le cadre de l'installation par défaut.

Apprenez les bases d'Udev sous Linux

Le démon udev, systemd-udevd (ou systemd-udevd.service) communique avec le noyau et reçoit les uevents du périphérique directement à partir de celui-ci chaque fois que vous ajoutez ou supprimez un appareil du système, ou qu'un appareil change d'état.

Udev est basé sur des règles – ses règles sont flexibles et très puissantes. Chaque événement de périphérique reçu est comparé à l'ensemble de règles lues à partir des fichiers situés dans /lib/udev/rules.d et /run/udev/rules.d.

Vous pouvez écrire des fichiers de règles personnalisées dans le répertoire /etc/udev/rules.d/ (les fichiers doivent se terminer par l'extension .rules) pour traiter un périphérique. Notez que les fichiers de règles de ce répertoire ont la priorité la plus élevée.

Pour créer un fichier de nœud de périphérique, udev doit identifier un périphérique à l'aide de certains attributs tels que l'étiquette, le numéro de série, ses numéros majeur et mineur utilisés, le numéro de périphérique de bus, etc. beaucoup plus. Ces informations sont exportées par le système de fichiers sysfs.

Chaque fois que vous connectez un périphérique au système, le noyau le détecte et l'initialise, et un répertoire avec le nom du périphérique est créé sous le répertoire /sys/ qui stocke les attributs du périphérique.

Le fichier de configuration principal d'udev est /etc/udev/udev.conf, et pour contrôler le comportement d'exécution du démon udev, vous pouvez utiliser l'utilitaire udevadm.

Pour afficher les événements du noyau reçus (uevents) et les événements udev (que udev envoie après le traitement des règles), exécutez udevadm avec la commande moniteur. Connectez ensuite un appareil à votre système et observez, depuis le terminal, comment l'événement de l'appareil est géré.

La capture d'écran suivante montre un extrait d'un événement ADD après la connexion d'un disque flash USB au système de test :

udevadm monitor 

Pour trouver le nom attribué à votre disque USB, utilisez l'utilitaire lsblk qui lit le système de fichiers sysfs et la udev db pour recueillir des informations sur les périphériques traités.

 
lsblk

D'après le résultat de la commande précédente, le disque USB est nommé sdb1 (le chemin absolu doit être /dev/sdb1). Pour interroger les attributs du périphérique à partir de la base de données udev, utilisez la commande info.

udevadm info /dev/sdb1

Comment travailler avec les règles Udev sous Linux

Dans cette section, nous verrons brièvement comment écrire des règles udev. Une règle comprend une liste d’une ou plusieurs paires clé-valeur, séparées par des virgules. Les règles vous permettent de renommer un nœud de périphérique à partir du nom par défaut, de modifier les autorisations et la propriété d'un nœud de périphérique, de déclencher l'exécution d'un programme ou d'un script lorsqu'un nœud de périphérique est créé ou supprimé, entre autres.

Nous allons écrire une règle simple pour lancer un script lorsqu'un périphérique USB est ajouté et lorsqu'il est supprimé du système en cours d'exécution.

Commençons par créer les deux scripts :

sudo vim /bin/device_added.sh

Ajoutez les lignes suivantes dans le script device_added.sh.

#!/bin/bash
echo "USB device added at $(date)" >>/tmp/scripts.log

Ouvrez le deuxième script.

sudo vim /bin/device_removed.sh

Ajoutez ensuite les lignes suivantes au script device_removed.sh.

#!/bin/bash
echo "USB device removed  at $(date)" >>/tmp/scripts.log

Enregistrez les fichiers, fermez et rendez les deux scripts exécutables.

sudo chmod +x /bin/device_added.sh
sudo chmod +x /bin/device_removed.sh

Créons ensuite une règle pour déclencher l'exécution des scripts ci-dessus, appelée /etc/udev/rules.d/80-test.rules.

vim /etc/udev/rules.d/80-test.rules

Ajoutez-y ces deux règles suivantes.

SUBSYSTEM=="usb", ACTION=="add", ENV{DEVTYPE}=="usb_device",  RUN+="/bin/device_added.sh"
SUBSYSTEM=="usb", ACTION=="remove", ENV{DEVTYPE}=="usb_device", RUN+="/bin/device_removed.sh"

où :

  • "==" : est un opérateur pour comparer l'égalité.
  • "+=" : est un opérateur pour ajouter la valeur à une clé qui contient une liste d'entrées.
  • SOUS-SYSTÈME : correspond au sous-système du périphérique d'événement.
  • ACTION : correspond au nom de l'action de l'événement.
  • ENV{DEVTYPE : correspond à une valeur de propriété d'appareil, type d'appareil dans ce cas.
  • RUN : spécifie un programme ou un script à exécuter dans le cadre de la gestion des événements.

Enregistrez le fichier et fermez-le. Ensuite, en tant que root, dites à systemd-udevd de recharger les fichiers de règles (cela recharge également d'autres bases de données telles que l'index du module du noyau), en exécutant.

sudo udevadm control --reload

Connectez maintenant une clé USB à votre machine et vérifiez si le script device_added.sh a été exécuté. Tout d'abord, le fichier scripts.log doit être créé sous /tmp.

ls -l /tmp/scripts.log

Ensuite, le fichier doit contenir une entrée telle que « Périphérique USB supprimé à date_heure », comme indiqué dans la capture d'écran.

cat /tmp/scripts.log

Pour plus d'informations sur la façon d'écrire des règles udev et de gérer udev, consultez respectivement les entrées manuelles udev et udevadm, en exécutant :

man udev
man udevadm
Résumé

Udev est un gestionnaire de périphériques remarquable qui fournit une manière dynamique de configurer les nœuds de périphériques dans le répertoire /dev. Il garantit que les appareils sont configurés dès qu'ils sont branchés et découverts. Il propage les informations sur un appareil traité ou les modifications de son état vers l'espace utilisateur.

Si vous avez des questions ou des réflexions à partager sur ce sujet, utilisez le formulaire de commentaires.