Écrire des règles Udev sous GNU/Linux.
Sous GNU/Linux il existe plusieurs systèmes permettant de gérer ses périphériques. Le dernier en date, qui tend à s’imposer pour différentes raisons, s’appelle Udev. Nous allons voir dans cet article un petit aperçu de ce que propose Udev à travers la configuration d’un lecteur mp3 MPIO FL300 sous la distribution GNU/Linux Mandrake 10.1 Official (qui utilise Udev donc).
Sommaire
Le(s) Auteur(s)
lftsy
contact - lftsy@minet.net
Tiennou
Etienne Lavanant, élève ingénieur deuxième année : j’ai découvert le libre en entrant à l’INT. Depuis, je suis un "penguin addict" et je suis fier de promouvoir une informatique conforme à mes valeurs.
contact - tiennou@minet.netRésumé pour les super pressés.
- On veut que le lecteur mp3 MPIO FL300 soit associé à un fichier du type /dev/sda1 plutôt que /dev/sda par défaut.
- On récupère les informations du lecteur mp3 par la commande :
udevinfo -a -p `udevinfo -q path -n /dev/sda` - On écrit dans le fichier approprié la règle Udev suivante :
BUS=="scsi", DRIVERS=="sd", SYSFS{model}=="FL300", SYSFS{vendor}=="MPIO", NAME="%k1", SYMLINK="%k"
Préambule.
Sous Unix (et donc GNU/Linux), tout est fichier. Les périphériques physiques ne font pas exception à la règle. Ainsi votre disque dur est représenté par un fichier du type /dev/hda. Pour lire les informations du disque dur, il suffit de lire ce fichier. Pour écrire sur le disque dur, il suffit d’écrire dans ce fichier (c’est évidemment un fichier un peu particulier).
Une convention est de mettre tous les fichiers représentant des périphériques dans le répertoire /dev. Jusqu’à présent, sous GNU/Linux ces fichiers étaient en général gérés par un système appelé devfs intégré au noyau. Ce système tend à être remplacé pour différentes raisons par un programme externe (dit en « user space ») appelé Udev. Ce programme a pour mission d’associer à chaque périphérique un fichier dans le répertoire /dev. Il doit donc ajouter/supprimer/modifier des fichiers dans /dev afin que le contenu de ce répertoire reste cohérent avec la configuration matérielle du système.
Sous GNU/Linux, les périphériques de stockage USB sont reconnus comme des disques SCSI. Par défaut, on leur attribue donc des noms du type /dev/sda pour le premier périphérique, /dev/sdb pour le deuxième, etc.
Le problème.
J’ai acheté récemment un lecteur mp3 MPIO FL300 en me disant « super ça supporte l’USB mass storage donc il devrait se comporter comme une clé USB et marcher sous GNU/Linux ». Je le branche et là où avec ma clé USB je vois une petite icône apparaître montrant que le périphérique a bien été monté, là rien.
Après quelques recherches, il s’est avéré que cet appareil n’a pas de table de partition. Il est donc reconnu comme un périphérique du type /dev/sda. Or d’habitude les clés USB ont une table de partition donc sont reconnues comme /dev/sda pour le disque en lui même et /dev/sda1 pour la première partition. Dans le cas de mon lecteur mp3, le périphérique /dev/sda étant à la fois le disque et la partition, on peut le monter simplement par une commande du type :
mount /dev/sda /mnt/removable
En fait le périphérique n’était pas monté automatiquement car les scripts Mandrake ne montent que les périphériques du type /dev/sda1 et pas /dev/sda (ce qui ne marcherait pas dans le cas de clés USB ayant une table de partitions). Nous allons donc utiliser les règles Udev pour simuler le comportement d’une clé USB possédant une table de partition lors du branchement d’un lecteur mp3 de ce type.
Qu’est-ce qu’une règle Udev ?
Sous GNU/Linux, lorsque vous branchez une clé USB, le fichier /dev/sda est créé pour identifier ce périphérique. Si vous branchez une deuxième clé USB, un périphérique /dev/sdb est créé pour identifier cette nouvelle clé. Or si vous débranchez ces deux clés et les branchez dans l’ordre inverse, le périphérique identifiant la première clé sera toujours /dev/sda et le deuxième /dev/sdb. Ces fichiers ne sont donc pas liés au type de clé USB mais à l’ordre dans lequel elles sont branchées. Ce n’est pas toujours très pratique. Vous pourriez par exemple vouloir toujours monter la clé USB 1 dans le répertoire /mnt/cle_1 et la clé USB 2 toujours dans le répertoire /mnt/cle_2.
Les règles Udev permettent d’associer à chaque appareil ou groupe d’appareil un périphérique personnalisé. Ceci permettrait par exemple d’associer mon lecteur mp3 à un périphérique /dev/lecteur_mp3 plutôt que /dev/sd? [1]. Dans notre cas, nous associerons tous les lecteurs mp3 de ce type à un périphérique du type /dev/sd?1 (au lieu de /dev/sd?) pour pouvoir bénéficier des scripts de montage automatique de Mandrake.
On peut bien sûr créer des règles Udev pour tout type de périphérique et pas seulement des clés USB. On pourrait faire de même pour une imprimante, une carte pcmcia, une webcam, une souris, etc...
Étape 1 : Récupérer les informations de son appareil.
Pour que l’ordinateur puisse associer un fichier périphérique à un appareil, il faut que l’ordinateur puisse reconnaître cet appareil. Nous allons donc interroger le système pour récupérer les informations du lecteur mp3. Pour cela nous allons consulter le système de fichier SYSFS. SYSFS est un système de fichier dynamique généré par le noyau (à partir du noyau 2.6) donnant des informations sur le matériel. Dans SYSFS chaque fichier représente un composant matériel et le chemin menant à ce fichier donne aussi des informations sur ce matériel.
Il nous faut donc d’abord trouver quel fichier de SYSFS correspond à notre lecteur mp3. Si vous connaissez le nom du fichier associé à votre périphérique (dans le cas présent /dev/sda par exemple), vous pouvez retrouver le chemin permettant d’accéder au fichier SYSFS correspondant par la commande :
udevinfo -q path -n /dev/sda
Le résultat est ici /block/sda.
Pour récupérer les informations concernant le lecteur mp3, il ne reste alors plus qu’à taper :
udevinfo -a -p /block/sda
Vous devez alors avoir une sortie du genre :
looking at class device ’/sys/block/sda’ :
SYSFSdev=="8:0"
SYSFSrange=="16"
SYSFSremovable=="1"
SYSFSsize=="510976"
SYSFSstat==" 2 0 16 56 0 0 0
0 0 56 56"
follow the class device’s "device"
looking at the device chain at ’/sys/devices/pci0000:00/0000:00:1d.1/usb2/2-1/
2-1:1.0/host0/0:0:0:0’ :
BUS=="scsi"
ID=="0:0:0:0"
SYSFSdetach_state=="0"
SYSFSdevice_blocked=="0"
SYSFSmax_sectors=="240"
SYSFSmodel=="FL300 "
SYSFSqueue_depth=="1"
SYSFSrev==" "
SYSFSscsi_level=="3"
SYSFSstate=="running"
SYSFStimeout=="30"
SYSFStype=="0"
SYSFSvendor=="MPIO "
Avec quelques autres paragraphes en plus. En fait, on a une suite de paragraphes avec des informations du type CLE="valeur". On va se servir de ces valeurs pour écrire notre règle Udev. Dans cet exemple, nous allons prendre les valeurs :
BUS=="scsi", DRIVERS=="sd", SYSFS{model}=="FL300", SYSFS{vendor}=="MPIO"
Ces valeurs issues du deuxième paragraphe ci-dessus identifient bien notre appareil [2]. De plus, ces clés ont l’avantage de convenir pour tout appareil du même type (pas de numéro de série par exemple) donc en branchant le lecteur d’un ami, ma règle s’appliquera toujours.
Nous avons récupéré les clés nécessaires à identifier notre appareil. À partir de là, la moitié de notre règle est déjà écrite.
Étape 2 : définir le fichier associé à notre périphérique.
Une fois notre périphérique détecté, un fichier du répertoire /dev lui sera associé. Ce répertoire est défini par la clé NAME. Ainsi, on pourrait associer notre lecteur mp3 au fichier /dev/lecteur_mp3 en ajoutant la clé NAME="lecteur_mp3" à notre règle Udev.
Comme nous voulons que notre appareil utilise les règles de montage automatique de Mandrake, nous voulons qu’il apparaisse sous le nom /dev/sda1... si c’est le premier périphérique SCSI [3]branché mais /dev/sdb1 si c’est le deuxième, etc...
Pour un nommage dynamique, des variables existent. Les deux plus utiles sont sûrement :
- %k le nom utilisé par le noyau pour identifier ce périphérique. Ici ce sera sda par exemple ;
- %n le numéro donné par le noyau à ce périphérique. Par exemple dans sda3, 3 sera le numéro donné par le noyau au périphérique.
Pour notre règle, nous prendrons NAME="%k1" pour obtenir des périphériques du type sda1, sdb1, etc... Nous avons aussi la possibilité de créer des liens symboliques vers un périphérique pour que plusieurs fichiers lui soient associés. On crée ces liens symboliques par la clé SYMLINK. Ici on créera le lien /dev/sda->/dev/sda1 pour assurer la compatibilité d’applications qui demanderaient le nom du disque plutôt que le nom d’une partition.[Le lien inverse /dev/sda1]
Étape 3 : écrire la règle Udev.
Les règles Udev sont en général stockées dans le dossier /etc/udev/rules.d qui contient des fichier du type 50-nom_de_fichier.rules. Les fichiers sont lus dans l’ordre croissant de leurs numéros. Chaque ligne d’un fichier est une règle Udev [4]. Quand une règle qui correspond est trouvée, elle est appliquée et la recherche s’arrête. Il faut juste s’assurer que votre règle personnelle sera lue avant une éventuelle règle par défaut.
Vous pouvez donc créer le fichier 00-perso.rules dans lequel vous mettrez vos règles personnelles [5]. Dans ce fichier, écrivez simplement la ligne :
BUS=="scsi", DRIVERS=="sd", SYSFS{model}=="FL300", SYSFS{vendor}=="MPIO", NAME="%k1", SYMLINK="%k"
Enregistrez votre fichier et votre règle est crée. Maintenant, à chaque branchement d’un lecteur MPIO FL300, le fichier /dev/sda1 est créé ainsi qu’un lien /dev/sda->/dev/sda1. Le lecteur est alors monté automatiquement dans un répertoire du type /mnt/removable.
Conclusion.
Écrire une règle Udev n’est en général pas compliqué et il peut être parfois très intéressant de le faire. Pour la rédaction de cet article, je me suis fortement inspiré du tutoriel Writing Udev rules de Daniel Drake. Vous trouverez de nombreux compléments sur l’écriture de règles Udev dans cet article ainsi que dans la documentation officielle.
[1] Le « ? » correspond ici à une lettre quelconque
[2] Attention, toutes les informations doivent provenir du même paragraphe pour être cohérentes et au moins une clé doit être du type BUS ou KERNEL ou ID ou PLACE pour que le périphérique puisse être identifié correctement.
[3] Les périphériques de stockage amovibles sont généralement traités comme des périphériques SCSI sous GNU/Linux.
[4] Sauf les lignes commençant par # qui sont des commentaires.
[5] Il est conseillé de créer un fichier à part pour vos règles personnelles plutôt que de compléter un fichier existant car autrement vous pourriez perdre vos règles en cas de mise à jour du système.
Réagir à cet article
Forum de l'article
-
Écrire des règles Udev sous GNU/Linux.
8 mai 2006, par amounaRépondre à ce messagevous avez parlé des règles uDEV mais moi j’ai un problème fondamental, je travail sur une version 2.6.12 de linux pour un système embarqué et il me semble que udev n’est pas activé puisque lors du branchement d’une imprimente le fichier /dev/usb/lpo n’est pas automatiquement creé , j’utilise donc mknode pour le faire . merci de me fournir une solution
-
Écrire des règles Udev sous GNU/Linux.
30 juillet 2010, par p90xRépondre à ce messageI totally love this article. I think you could write some other things to make your blog more complete wansantg3lj.For example: cheap ed hardy.
-
-
Écrire des règles Udev sous GNU/Linux.
30 janvier 2006, par JMTRépondre à ce messageBonjour, Après avoir lu votre article, ça me fait penser que j’ai un problême avec mon portable qui comporte un lecteur de carte 4 en 1 intégré et qui semble installé et reconnu par le system. Malheureusement quand j’insère une carte rien ne se passe
dmesg me renvoie : Linux Kernel Card Services option : [pci][cardbus][pm] ACPI : PCI Interrupt 0000:00:09.0[A]->Link[LNKB]->GSI 10 (level, low)-> IRQ 10 Yenta : CardBus bridge found at 0000:00:09.0[1631:d006] Yenta : ISA IRQ mask 0x0000,PCI irq 10 Socket status : 30000006 cs : IO port probe 0xc00-0xcff : clean. cs : IO port probe 0x100-0x4ff : excluding 0x480-0x48f cs : IO port probe 0xa00-0xaff : clean.
et hardrake me dit : Identification Vendeur : ENE Technology Inc Description : CB710 Cardbus Controller (4 in 1 reader) Classe de matériel : MEMORY_FLASH Connexion Bus : PCI Bus PCI n° : 0 Périphérique PCI n° : 9 Fonction PCI n° : 1 Identifiant du Vendeur : 5412 Identifiant du périphérique : 1296 Identifiant secondaire du vendeur : 5681 Identifiant secondaire du périphérique : 53254 Divers Module : yenta_socket
tout semble reconnu et installé mais pas de point de montage Si vous avez une idée sur le sujet elle sera la bienvenue Cordialement
-
> Écrire des règles Udev sous GNU/Linux (udev, ov511 LE2005)
7 septembre 2005, par lorenzoRépondre à ce messageMerci Tiennou ( : )) ) pour cet article qui m a deniesé sur udev et les progres du K2.6 ...
Helas, malgres cet excellent didacticiel, mon pb reste entier :
mon noyau detecte et genere le device /dev/video ou /dev/video0 mais ceux ci restent inaccessible pour toute appli ( vlc, camorama, videodog, gqcam, etc ... :( ) ( a titre indicatif :
[tuti@tuti capture]$ videodog
/dev/video0
open videodev : No such device
[tuti@tuti capture]$ ll /dev/video*
lrwxrwxrwx 1 root root 15 sep 6 17:07 /dev/video -> /dev/v4l/video0
lrwxrwxrwx 1 root root 15 sep 6 17:07 /dev/video0 -> /dev/v4l/video0
[tuti@tuti capture]$ [tuti@tuti capture]$ ll /dev/v4l/video0
crw-rw---- 1 tuti video 81, 0 sep 5 09:41 /dev/v4l/video0
et camorama : Could not connect to video device ( /dev/video0)
Please check the connection.
Les groups ont ete verifier, msec mis a 2 ....
Une idée ??????? :)
-
> Écrire des règles Udev sous GNU/Linux (udev, ov511 LE2005)
8 septembre 2005, par TiennouRépondre à ce messageJe ne sais pas à quoi est du ton problème mais en tout cas, ça ne m’a pas l’air lié à Udev puisque tes fichiers de périphériques ont l’air bien créés. Désolé de ne pas pouvoir t’aider plus.
-
-
> Écrire des règles Udev sous GNU/Linux.
3 février 2005, par bistouriRépondre à ce messageGruik, voilà un bon tutoriel facilement adaptable à tout type de périphérique de masse USB. Merci les Minet :)
tiens, je vous ai vu à la Solutions Linux
-
Désolé mais...
22 février 2006, par collecjmRépondre à ce message...pour un débutant, tout ça c’est du charabia. J’ai essayé de faire comme indiqué, j’ai créé "/dev/sda1" puis j’ai ajouté une ligne "/dev/sda1..." dans "/etc/fstab" mais ça ne change rien.
Quand je fais "udevinfo -q path -n /dev/sda", j’obtiens : "device not found in database (sda)"
En outre, quand je branche ma tablette graphique ou mon appareil photo sur n’importe quelle entrée USB, il ne se passe strictement rien, aucun périphérique n’apparaît. Pourtant, ça marche sous windows, donc les fils sont branchés là-dedans.
Qu’est-ce que je peux faire ? ///Stéphane (un peu découragé)
-
Désolé mais...
6 mai 2006, par Stephane (un autre...)Répondre à ce messageC’est le système d’exploitation qui va créer le fichier /dev/sda pour représenter le matériel ; Il ne faut pas le créer soi-même.
Pour réparer l’erreur, tapes dans une console "ls -l /dev/sda1".
- Si le résultat commence par un c ou un b, c’est bon. Par exemple, chez moi, le lecteur de CD est vu comme ceci :
$ ls -l /dev/hda
brw-rw---- 1 root cdrom 3, 0 2006-05-05 21:06 /dev/hda
- Si le résultat commence par un -, il faut effacer ce fichier. Par exemple, chez moi, voilà un fichier créé à la main :
$ ls -l /home/stephane/test1
-rw-r—r-- 1 stephane stephane 1413 2006-04-12 17:26 /home/stephane/test1
- Si le fichier n’existe pas, ne rien faire. Exemple de matos qui n’est pas prêt d’exister :
$ ls -l /dev/hdazsdz
ls : /dev/hdazsdz : Aucun fichier ou répertoire de ce type
Maintenant que l’erreur est réparée : Il faut adapter l’article à ton cas particulier : de la même manière que ton lecteur de Cd n’est peut-etre pas en /dev/hda comme moi, ton matériel USB n’est peut-être pas détecté en /dev/sda. Essaies sdb par exemple.
-
gwvbearewrb
28 juillet 2010, par aaronRépondre à ce messageHey, this blog is really happening ! It took me quite a while to read through all the comments. I appreciate the idea of tweeting the post so that more people could find it ! tramadol information
- Si le résultat commence par un c ou un b, c’est bon. Par exemple, chez moi, le lecteur de CD est vu comme ceci :
-
-