Table des matières
Résumé
Linux kernel 2.6 présente une nouvelle solution d'espace utilisateur pour les répertoires de périphériques dynamiques /dev avec des désignations de périphérique persistantes : udev. Cette solution ne fournit que les fichiers ou les périphériques réellement présents. Elle crée ou supprime les fichiers du noeud de périphérique généralement situés dans le répertoire /dev et peut renommer les interfaces réseau. La implémentation précédente d'un /dev dynamique avec devfs a été remplacée par udev.
Traditionnellement, les noeuds de périphériques étaient stockés dans le répertoire /dev sur les systèmes Linux. Il y avait un noeud pour chaque type de périphérique possible, qu'il existe ou non dans le système. En conséquence, ce répertoire contenait des milliers de fichiers inutilisés. Avant qu'un nouveau sous-système ou un nouveau périphérique du kernel puisse être utilisé, les noeuds correspondants devaient être créés avec une application spéciale. Le système de fichiers devfs a apporté une amélioration significative car seuls les périphériques qui existaient réellement et étaient connus du kernel se voyaient attribuer un noeud de périphérique dans /dev.
udev introduit un nouveau moyen de créer des noeuds de périphériques. Le kernel exporte son état interne dans sysfs et, chaque fois qu'un périphérique est reconnu par le kernel, il met à jour les informations dans sysfs et envoie un événement à l'espace utilisateur. Grâce aux informations rendues disponibles par sysfs, udev fait correspondre une syntaxe de règle simple avec les attributs du périphérique puis crée ou supprime les noeuds de périphériques correspondants.
L'utilisateur n'a pas besoin de créer de règle udev pour les nouveaux périphériques. Si un périphérique est connecté, le noeud de périphérique correspondant est créé automatiquement. Toutefois, les règles introduisent la possibilité de définir une stratégie de désignation de périphérique. Ceci permet en outre de remplacer un nom de périphérique crypté par un nom facile à mémoriser et d'avoir des noms de périphérique persistants lorsque deux périphériques de même type ont été connectés en même temps.
Supposons que l'on ait deux imprimantes, une imprimante laser couleur de haute qualité et une imprimante à jet d'encre noir et blanc, toutes deux connectées par USB. Elles apparaissent en tant que /dev/usb/lpX, où X est un numéro dépendant de l'ordre dans lequel elles ont été connectées. En utilisant udev, vous pouvez créer des règles udev personnalisées pour nommer une imprimante /dev/lasercouleur et l'autre /dev/jetd'encre. Du fait que ces noeuds de périphériques sont créés par udev en fonction des caractéristiques du périphérique, ils pointent toujours vers le bon périphérique, quel que soit l'ordre ou l'état de la connexion.
Avant qu'udev ne crée des noeuds de périphériques sous /dev, il lit tous les fichiers de /etc/udev/rules.d dont le suffixe est .rules dans l'ordre alphabétique. La première règle qui correspond à un périphérique est utilisée, même si d'autres peuvent également s'appliquer. Des commentaires sont introduits par le signe #. Les règles prennent la forme suivante :
key, [key,...] NAME [, SYMLINK]
Au moins une clé doit être spécifiée. En effet, les règles sont assignées aux périphériques sur la base de ces clés. Il est également essentiel de spécifier un nom. Le noeud de périphérique créé dans /dev porte ce nom. Le paramètre symlink facultatif permet aux noeuds d'être créés à d'autres endroits. Une règle pour une imprimante peut avoir la forme suivante :
BUS=="usb", SYSFS{serial}=="12345", NAME="lp_hp", SYMLINK+="printers/hp"
Dans cet exemple, il y a deux clés, BUS et SYSFS{serial}. udev compare le numéro de série à celui du périphérique connecté au bus USB. Pour assigner le nom lp_hp au périphérique du répertoire /dev, toutes les clés doivent être identiques. De plus, un lien symbolique /dev/printers/hp, qui fait référence au noeud de périphérique, est créé. En même temps, le répertoire printers est créé automatiquement. Les tâches d'impression peuvent être envoyées à /dev/printers/hp ou à /dev/lp_hp.