Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
Dernière révision Les deux révisions suivantes
udev [Le 11/01/2016, 20:14]
128.78.236.200 [Trouver un périphérique tout juste branché]
udev [Le 22/11/2021, 16:40]
194.2.202.87 [Palm USB]
Ligne 22: Ligne 22:
 Sur les systèmes à base de Linux, le répertoire ''/​dev''​ sert à contenir les périphériques sous forme de fichier, les "​nodes",​ qui se rapportent aux périphériques système. Chaque "​node"​ se réfère à un périphérique,​ qui peut -ou pas- exister. Les applications utilisateur peuvent utiliser ces "​nodes"​ pour interagir avec le périphérique. Par exemple, le serveur graphique X va "​écouter"​ ''/​dev/​input/​mice''​ qui se réfère à la souris et faire bouger le pointeur à l'​écran. Sur les systèmes à base de Linux, le répertoire ''/​dev''​ sert à contenir les périphériques sous forme de fichier, les "​nodes",​ qui se rapportent aux périphériques système. Chaque "​node"​ se réfère à un périphérique,​ qui peut -ou pas- exister. Les applications utilisateur peuvent utiliser ces "​nodes"​ pour interagir avec le périphérique. Par exemple, le serveur graphique X va "​écouter"​ ''/​dev/​input/​mice''​ qui se réfère à la souris et faire bouger le pointeur à l'​écran.
  
-Le répertoire original ''/​dev''​ contenait tous les périphériques ​du système, c'est pourquoi ​il était ​si volumineux. **Devfs** a été créé pour simplifier cette utilisation,​ mais ce système a montré ses limites lorsqu'​il y a des problèmes compliqués à résoudre. ​+Le répertoire original ''/​dev''​ contenait ​tous les fichiers correspondant à tous les périphériques ​possibles et imaginables que l'on pouvait trouver dans une configuration matérielle. De ce fait, il était ​très volumineux. **Devfs** a été créé pour simplifier cette utilisation,​ mais ce système a montré ses limites lorsqu'​il y a des problèmes compliqués à résoudre. ​
  
 //​**Udev**//​ est le nouveau système pour gérer le répertoire ''/​dev'',​ conçu pour repousser les limites mises en avant par les précédentes versions de ''/​dev'',​ et fournir un lien robuste. Dans le but de créer et nommer les périphériques dans ''/​dev'',​ les "​nodes"​ qui correspondent aux périphériques système, //udev// fait le lien entre les informations données par //sysfs// et les règles données par l'​utilisateur. Ce wiki a pour but d'​expliquer comment écrire les règles //udev//. //​**Udev**//​ est le nouveau système pour gérer le répertoire ''/​dev'',​ conçu pour repousser les limites mises en avant par les précédentes versions de ''/​dev'',​ et fournir un lien robuste. Dans le but de créer et nommer les périphériques dans ''/​dev'',​ les "​nodes"​ qui correspondent aux périphériques système, //udev// fait le lien entre les informations données par //sysfs// et les règles données par l'​utilisateur. Ce wiki a pour but d'​expliquer comment écrire les règles //udev//.
Ligne 53: Ligne 53:
 //Udev// fournit un nom persistant pour certains types de périphériques. C'est un dispositif très pratique, qui signifie que vous n'avez pas besoin d'​écrire de règle pour ceux-ci. //Udev// fournit un nom persistant pour certains types de périphériques. C'est un dispositif très pratique, qui signifie que vous n'avez pas besoin d'​écrire de règle pour ceux-ci.
  
-Par exemple, //Udev// fournit des noms persistants pour les périphériques de stockage dans le répertoire ''/​dev/​disk''​. Pour les voir, vous pouvez ​utilisez ​la commande suivante : +Par exemple, //Udev// fournit des noms persistants pour les périphériques de stockage dans le répertoire ''/​dev/​disk''​. Pour les voir, vous pouvez ​utiliser ​la commande suivante : 
  
 <​code>​ls -lR /​dev/​disk</​code>​ <​code>​ls -lR /​dev/​disk</​code>​
Ligne 63: Ligne 63:
 ====Fichiers de règles et syntaxes==== ====Fichiers de règles et syntaxes====
  
-Pour décider comment nommer un périphérique et quelles actions faire, //udev// utilise une série de fichiers de règles. Ces fichiers se trouvent dans le répertoire ''/​etc/​udev/​rules.d'',​ et doivent tous avoir l'​extension ''​.rules''​. ​+Pour décider comment nommer un périphérique et quelles actions ​faire, //udev// utilise une série de fichiers de règles. Ces fichiers se trouvent dans le répertoire ''/​etc/​udev/​rules.d'',​ et doivent tous avoir l'​extension ''​.rules''​. ​
 Les règles //udev// créées par défaut sont dans le fichier ''/​lib/​udev/​rules.d/​50-udev-default.rules''​. Il pourrait être intéressant d'y jeter un œil – il contient quelques exemples -, et certaines règles contiennent un exemple de sortie de //devfs// que vous trouverez dans ''/​dev''​ par défaut. Cependant, il est conseillé de ne pas écrire de règle directement dedans. Les règles //udev// créées par défaut sont dans le fichier ''/​lib/​udev/​rules.d/​50-udev-default.rules''​. Il pourrait être intéressant d'y jeter un œil – il contient quelques exemples -, et certaines règles contiennent un exemple de sortie de //devfs// que vous trouverez dans ''/​dev''​ par défaut. Cependant, il est conseillé de ne pas écrire de règle directement dedans.
  
 Les fichiers de ''/​lib/​udev/​rules.d/''​ sont triés par ordre **alphabétique**,​ et dans certaines circonstances,​ l'​ordre dans lequel ils sont analysés est important. En général, vous voulez que vos propres règles soient prises en compte avant les règles créées par défaut, donc créez votre fichier comme ceci: ''/​etc/​udev/​rules.d/​10-local.rules''​ (le nombre 10 influe sur l'​ordre de prise en compte) et écrivez vos propres règles dans ce fichier. ​ Les fichiers de ''/​lib/​udev/​rules.d/''​ sont triés par ordre **alphabétique**,​ et dans certaines circonstances,​ l'​ordre dans lequel ils sont analysés est important. En général, vous voulez que vos propres règles soient prises en compte avant les règles créées par défaut, donc créez votre fichier comme ceci: ''/​etc/​udev/​rules.d/​10-local.rules''​ (le nombre 10 influe sur l'​ordre de prise en compte) et écrivez vos propres règles dans ce fichier. ​
  
-Dans un fichier de règles, les lignes commençant par "''#''"​ sont traitées comme des commentaires. Toutes les autres lignes sont donc considérées comme des règles. Les règles s'​écrivent sur une seule ligne (on ne les coupe pas par un passage à la ligne avec //ENTREÉ//).+Dans un fichier de règles, les lignes commençant par "''#''"​ sont traitées comme des commentaires. Toutes les autres lignes sont donc considérées comme des règles. Les règles s'​écrivent sur une seule ligne (on ne les coupe pas par un passage à la ligne avec //ENTRÉE//).
  
 Un périphérique peut être contrôlé par plusieurs règles. Ceci peut être avantageux lorsque par exemple, nous écrivons deux règles pour un périphérique,​ qui donnent un nom différent pour le même périphérique. Les deux règles seront appliquées même si ces règles sont dans des fichiers séparés. Il est important de comprendre que //udev// ne s'​interrompt pas quand il trouve une règle, il continue sa recherche et tente d'​appliquer chaque règle trouvée. Un périphérique peut être contrôlé par plusieurs règles. Ceci peut être avantageux lorsque par exemple, nous écrivons deux règles pour un périphérique,​ qui donnent un nom différent pour le même périphérique. Les deux règles seront appliquées même si ces règles sont dans des fichiers séparés. Il est important de comprendre que //udev// ne s'​interrompt pas quand il trouve une règle, il continue sa recherche et tente d'​appliquer chaque règle trouvée.
Ligne 125: Ligne 125:
 Pour écrire des règles agissant sur plusieurs périphériques similaires, les opérateurs de substitution de //udev// (à la manière de ''​printf''​) sont très utiles. Vous pouvez inclure simplement ces opérateurs dans n'​importe quel assignement dans vos règles, et //udev// les évaluera quand ils seront exécutés. ​ Pour écrire des règles agissant sur plusieurs périphériques similaires, les opérateurs de substitution de //udev// (à la manière de ''​printf''​) sont très utiles. Vous pouvez inclure simplement ces opérateurs dans n'​importe quel assignement dans vos règles, et //udev// les évaluera quand ils seront exécutés. ​
  
-Les opérateurs les plus communs sont ''​%k''​ et ''​%n''​. ''​%k''​ est remplacé par le nom que le noyau avait assigné au périphérique,​ e.g. ''​sda3''​ pour le périphérique qui apparaîtra par défaut sur ''/​dev/​sda3''​. ''​%n''​ est remplacé par le numéro que le noyau à assigné au périphérique (pour le périphérique de stockage, c'est le numéro de partition), e.g. ''​3''​ pour ''/​dev/​sda3''​.+Les opérateurs les plus communs sont ''​%k''​ et ''​%n''​. ''​%k''​ est remplacé par le nom que le noyau avait assigné au périphérique,​ e.g. ''​sda3''​ pour le périphérique qui apparaîtra par défaut sur ''/​dev/​sda3''​. ''​%n''​ est remplacé par le numéro que le noyau assigné au périphérique (pour le périphérique de stockage, c'est le numéro de partition), e.g. ''​3''​ pour ''/​dev/​sda3''​.
  
 //Udev// fournit d'​autres opérateurs de substitution pour créer des fonctions plus avancées que vous pourrez consulter dans l'aide de //udev// (dans une console, tapez ''​man udev''​). Il y a une syntaxe alternative pour ces opérateurs - ''​$kernel''​ et ''​$number''​ pour les exemples précédents. Et si vous voulez utiliser un ''​%''​ littéral dans une règle, il vous suffira de mettre ''​%%'';​ si vous voulez utiliser un ''​$''​ littéral dans une règle, mettez ''​$$''​. //Udev// fournit d'​autres opérateurs de substitution pour créer des fonctions plus avancées que vous pourrez consulter dans l'aide de //udev// (dans une console, tapez ''​man udev''​). Il y a une syntaxe alternative pour ces opérateurs - ''​$kernel''​ et ''​$number''​ pour les exemples précédents. Et si vous voulez utiliser un ''​%''​ littéral dans une règle, il vous suffira de mettre ''​%%'';​ si vous voulez utiliser un ''​$''​ littéral dans une règle, mettez ''​$$''​.
Ligne 153: Ligne 153:
 KERNEL=="​hiddev*",​ NAME="​usb/​%k"​ KERNEL=="​hiddev*",​ NAME="​usb/​%k"​
 </​code>​ </​code>​
-La première règle est pour les lecteurs de disquette, ​et assure que tous les périphériques "​nodes"​ seront placés par leur numéro dans le répertoire ''/​dev/​floppy''​.+La première règle est pour les lecteurs de disquette, ​elle assure que tous les périphériques "​nodes"​ seront placés par leur numéro dans le répertoire ''/​dev/​floppy''​ et ajoute un lien avec le nom par défaut dans ''/​dev/​''​. 
 La seconde règle place tous les périphériques dont le nom commence par ''​hiddev''​ dans le répertoire ''/​dev/​usb''​ sans modifier le nom que le noyau leur a donné. La seconde règle place tous les périphériques dont le nom commence par ''​hiddev''​ dans le répertoire ''/​dev/​usb''​ sans modifier le nom que le noyau leur a donné.
  
Ligne 248: Ligne 249:
 ====Trouver un périphérique tout juste branché==== ====Trouver un périphérique tout juste branché====
 Pour un périphérique USB, tapez la commande suivante : Pour un périphérique USB, tapez la commande suivante :
-  find /​dev/​bus/​usb/ ​'!' ​-type d -mmin -5+  find /​dev/​bus/​usb/​ ! -type d -mmin -5
 ou bien la commande : ou bien la commande :
-  find /​sys/​devices/​ -type d -mmin -5 | grep usb[0-9]$+  find /​sys/​devices/​ -type d -mmin -5 | grep net/usb.$
 puis faire un **''​udevadm info''​** sur le résultat : puis faire un **''​udevadm info''​** sur le résultat :
 <​code>​$ udevadm info /​sys/​devices/​pci0000:​00/​0000:​00:​12.0/​usb1/​1-1/​1-1.3/​1-1.3:​1.0/​net/​usb0 ​ <​code>​$ udevadm info /​sys/​devices/​pci0000:​00/​0000:​00:​12.0/​usb1/​1-1/​1-1.3/​1-1.3:​1.0/​net/​usb0 ​
Ligne 281: Ligne 282:
 <​code>​ <​code>​
 $ udevadm monitor --prop --udev | egrep "​DEVNAME=|DEVPATH=|ID_MODEL=|ID_SERIAL|ID_VENDOR=|SUBSYSTEM="​ $ udevadm monitor --prop --udev | egrep "​DEVNAME=|DEVPATH=|ID_MODEL=|ID_SERIAL|ID_VENDOR=|SUBSYSTEM="​
-DEVNAME=/​dev/​bus/​usb/​001/​012+DEVNAME=/​dev/​bus/​usb/​001/​004
 DEVPATH=/​devices/​pci0000:​00/​0000:​00:​12.0/​usb1/​1-1/​1-1.3 DEVPATH=/​devices/​pci0000:​00/​0000:​00:​12.0/​usb1/​1-1/​1-1.3
 ID_MODEL=Sailfish ID_MODEL=Sailfish
Ligne 478: Ligne 479:
 ====Palm USB==== ====Palm USB====
  
-Ces périphériques se déclarent comme des ports série USB, donc par défaut vous n'​aurez que le périphérique ''​ttyUSB1''​. Les utilitaires pour //palm// cherchent en général ''/​dev/​pilot'',​ nombre d'​utilisateurs apprécieront ​q'une règle gère cela. [[http://​www.clasohm.com/​blog/​one-entry?​entry%5fid=12096|Le post du blog de Carsten Clasohm]] propose une solution, voici la règle qu'il suggère :+Ces périphériques se déclarent comme des ports série USB, donc par défaut vous n'​aurez que le périphérique ''​ttyUSB1''​. Les utilitaires pour //palm// cherchent en général ''/​dev/​pilot'',​ nombre d'​utilisateurs apprécieront ​qu'une règle gère cela. [[http://​www.clasohm.com/​blog/​one-entry?​entry%5fid=12096|Le post du blog de Carsten Clasohm]] propose une solution, voici la règle qu'il suggère :
  
 <​code>​BUS=="​usb",​ ATTR{product}=="​Palm Handheld*",​ KERNEL=="​ttyUSB[1359]",​ SYMLINK+="​pilot"</​code>​ <​code>​BUS=="​usb",​ ATTR{product}=="​Palm Handheld*",​ KERNEL=="​ttyUSB[1359]",​ SYMLINK+="​pilot"</​code>​
Ligne 548: Ligne 549:
  
 A l'​encontre de ceci, **//udev// ne remontera pas automatiquement les périphériques,​ mais tentera d'​appliquer les règles**. Par exemple, si vous écrivez une règle pour ajouter un lien symbolique pour votre appareil photo alors que celui-ci est déjà branché au PC, ne vous attendez pas à ce que le lien symbolique soit créé. ​ A l'​encontre de ceci, **//udev// ne remontera pas automatiquement les périphériques,​ mais tentera d'​appliquer les règles**. Par exemple, si vous écrivez une règle pour ajouter un lien symbolique pour votre appareil photo alors que celui-ci est déjà branché au PC, ne vous attendez pas à ce que le lien symbolique soit créé. ​
-Pour créer le lien symbolique, vous pouvez simplement débrancher et rebrancher votre appareil photo. Si le périphérique ne peut pas être débranché,​ vous pouvez lancer dans une console la commande ''​udevtrigger''​.+Pour créer le lien symbolique, vous pouvez simplement débrancher et rebrancher votre appareil photo. Si le périphérique ne peut pas être débranché,​ vous pouvez lancer dans une console la commande ''​udevadm trigger''​.
  
-Si votre noyau n'a pas le support //​inotify//,​ les nouvelles règles ne seront pas détectées automatiquement. Dans ce cas, vous devrez demander la relecture de celles-ci en lançant dans une console la commande ''​udevcontrol reload_rules''​ après avoir créé ou modifié une règle pour que cela prenne effet.+Si votre noyau n'a pas le support //​inotify//,​ les nouvelles règles ne seront pas détectées automatiquement. Dans ce cas, vous devrez demander la relecture de celles-ci en lançant dans une console la commande ''​sudo udevadm control --reload''​ après avoir créé ou modifié une règle pour que cela prenne effet.
 ====udevtest==== ====udevtest====
  
  • udev.txt
  • Dernière modification: Le 11/09/2022, 11:41
  • par moths-art