udev/fr
udev (user /dev) est le gestionnaire de périphériques pour le noyau de Linux. Il gère les nœuds de périphériques dans /dev et prend en charge toutes les actions dans l'espace utilisateur lors de l'ajout ou de la suppression de périphériques. Les lecteurs de cet article devraient également lire eudev, une dérivation de udev.
udev from the sys-apps/systemd-utils package is used as the default device manager for Gentoo systems using the OpenRC init system, independently of systemd.
Qu'est-ce que udev?
Le répertoire /dev
La plupart des utilisateurs de Linux savent que /dev/sda1 est un moyen rapide de référencer la première partition du premier disque dur détecté par le noyau. C'est facile, non ?
Mais considérez des périphériques connectables à chaud comme USB, IEEE 1394, ou les périphériques PCI commutables à chaud, etc. Quel est le premier périphérique ? Et pour combien de temps ? Comment les autres périphériques seront-ils nommés quand le premier disparaîtra ? Comment cela affectera-t-il les opérations en cours ? Cela serait-t-il amusant si une tâche d'impression est tout à coup déplacée d'une toute nouvelle imprimante laser vers une quasi-moribonde imprimante à matrice parce que quelqu’un aura tiré sur le cordon d'alimentation de l'imprimante laser (qui était justement la première imprimante) ?
Entrez dans le gestionnaire de périphériques. Un gestionnaire de périphérique moderne doit :
- Fonctionner dans l'espace utilisateur.
- Créer et supprimer des fichiers de périphérique de manière dynamique.
- Assurer un nommage cohérent.
- Fournir une API dans l'espace utilisateur.
À chaque fois qu'une modification de la structure des périphériques se produit, le noyau génère un événement uevent qui est intercepté par le gestionnaire de périphériques. Ce dernier suit alors les règles déclarées dans les répertoires /etc/udev/rules.d, /run/udev/rules.d et /lib/udev/rules.d. En se basant sur les informations contenues dans l'événement uevent, il trouve l'ensemble de règles dont il a besoin pour déclencher et accomplir les actions requises. Ces actions peuvent créer ou supprimer des fichiers de périphérique, mais aussi déclencher le chargement de micro-logiciels particuliers dans la mémoire du noyau.
Installation
Avant faire une mise à jour, consulter le guide de mise à jour de udev (Anglais) pour plus d'information afin d'éviter de se retrouver avec un système qui ne démarre plus.
Noyau
udev nécessite les options suivantes dans le noyau :
General setup --->
[*] Configure standard kernel features (expert users) --->
[ ] Enable deprecated sysfs features to support old userspace tools
[*] Enable signalfd() system call
Enable the block layer --->
[*] Block layer SG support v4
Networking support --->
Networking options --->
<*> Unix domain sockets
Device Drivers --->
Generic Driver Options --->
() path to uevent helper
[*] Maintain a devtmpfs filesystem to mount at /dev
< > ATA/ATAPI/MFM/RLL support (DEPRECATED) --->
File systems --->
[*] Inotify support for userspace
Pseudo filesystems --->
[*] /proc file system support
[*] sysfs file system support
Options de la variable USE
Portage connaît l'option globale de la variable USE udev
pour activer la prise en charge de udev dans les autres paquets. Activer cette option de la variable USE (par défaut dans tous les profiles Linux) provoquera l'installation du paquet sys-fs/udev automatiquement.
USE="udev"
Emerge
Après avoir défini les options de la variable USE, mettre à jour le système pour que les changements prennent effet :
root #
emerge --ask --changed-use --deep @world
Configuration
Service
Pour démarrer udev au démarrage de la machine, l'ajouter au niveau d'exécution sysinit. Pour cela, exécuter la commande suivant en tant que root :
root #
rc-update add udev sysinit
Configuration avancée
Règles
udev fournit un jeu de règles qui correspondent aux valeurs exportées des uevents (événements provoqués par le noyau) et aux propriétés du périphérique découvert. Possiblement, une règle ayant une correspondance nommera et créera un nœud de périphérique et exécutera des programmes configurés pour installer et configurer le périphérique.
Les définitions des règles sont stockées à deux emplacements :
- /lib/udev/rules.d/ - Les règles dans ce répertoire sont installées par certains paquets, elles ne doivent en général pas être modifiées par les utilisateurs;
- /etc/udev/rules.d/ - Ce répertoire est pour les règles définies par les utilisateurs. Chaque nouvelle règle doit être ajoutée dans ce répertoire;;
Dans ces répertoires, de multiples fichiers de règles (avec le suffix .rules) sont lus dans l'ordre alphabétique. Dans ces fichiers, udev trouvera des expressions qui peuvent correspondre à un événement uevent avec l'état correspondant (est-ce que l’événement correspond à un ajout ou une suppression de périphérique) et la commande à exécuter.
La mise en correspondance de l'événement se base sur des informations telles que :
- Le SOUS-SYSTÈME de l'uevent (pour quel type de périphérique l'événement est-il provoqué);
- L'ACTION qui a lieu (ajout, changement, ou retrait);
- Un ou plusieurs attributs (via ATTR ou ATTRS), tels que la classe du périphérique, le vendeur ou tout autre information du périphérique;
- Le nom fournit par le noyau (via KERNEL) tel que sd* (pour les disques SCSI/ATA) ou input* (pour les périphériques d'entrée comme les souris et les claviers);
- Un ou plusieurs paramètres d'environnement (via ENV), utilisés pour envoyer des informations partagées par de multiples règles
En se basant sur ces informations, la règle peut alors décider si :
- Quelques informations doivent être partagées avec des événements ultérieurs (à travers des variables d'environnement)
- Des liens doivent être créés dans /dev
- Des commandes doivent être exécutées
udev accomplit cela pour toutes les règles qui correspondent (il ne cesse donc pas après la première correspondance) pour permettre une approche flexible de la gestion des périphériques.
Noms de périphérique persistants
Le noyau détecte les périphériques de manière asynchrone, udev reflète le système de fichiers sysfs et donc les périphériques sont nommés et numérotés selon leur ordre de détection. Ainsi par défaut, udev ne fournit pas de noms persistants. Néanmoins, il existe un mécanisme pour quelques classes de périphériques pour assurer cette fonctionnalité :
- Udev crée, pour les périphériques de stockage, des liens symboliques additionnels en se basant sur l'ID du périphérique, son étiquette, UUID et son chemin. Voir le répertoire /dev/disk/by-*. Ainsi, au lieu d'utiliser, par exemple, le fichier de périphérique /dev/sda, utiliser le fichier /dev/disk/by-label/SOME_LABEL.
- C'est la même chose pour les périphériques d'entrée dans le répertoire /dev/input.
- En utilisant des règles personnalisées, l'utilisateur peut créer son propre fichier de périphérique.
Predictable network interface naming
The new network interface naming convention is not the same. So the symlinks used by netifrc will need to be re-linked. Use /etc/init.d/net.lo as a link target for whatever interface names need to be added. Be sure to replace <interface_name>
in the commands below with the Ethernet interface names present on the system. It is possible to discover which interfaces exist by running the ip link command:
user $
ip link
Create a symbolic link for the existing interfaces in the /etc/init.d/ directory:
root #
ln -s /etc/init.d/net.lo /etc/init.d/net.<interface_name>
Edit /etc/conf.d/net with any necessary configuration for all interfaces.
Add the script(s) to the default runlevel to have the interface(s) start automatically:
root #
rc-update add net.<interface_name> default
Optional: Disable or override predictable network interface naming
Network device names such as eth0
or wlan0
as provided by the kernel are normally changed on system boot (see dmesg) by the /lib/udev/rules.d/80-net-setup-link.rules udev rule and the NamePolicy in /lib/systemd/network/99-default.link.
This behavior may be disabled in several ways:
- Symlink /etc/systemd/network/99-default.link to /dev/null: ln -s /dev/null /etc/systemd/network/99-default.link.
- Create a lower-numbered .link file in /etc/systemd/network which assigns a different name to the interface.
- Pass
net.ifnames=0
on the kernel command line.
Utilisation
Quelques commandes utiles :
- Surveiller les activités de udev :
root #
udevadm monitor
root #
udevadm monitor
- Affiche tous les messages concernant un fichier de périphérique donné :
root #
udevadm info --query=all --name=/dev/DEVICE_FILE
root #
udevadm info --query=all --name=/dev/DEVICE_FILE
- Show udev info about a given sys path device file (might be obtained via udevadm monitor):
root #
udevadm info --attribute-walk --path=/devices/DEVICE_FILE
- Assigner un nom persistant à un périphérique Ethernet :
SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="01:23:45:67:89:ab", NAME="eth6789ab"
SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="01:23:45:67:89:ab", NAME="ethernet0"
- After changing a rules file in /etc/udev/rules.d/, either reboot or make udev reload them with:
root #
udevadm control --reload-rules
- For already added devices (plugged USB, etc.), the reloaded rules take effect either after changing the device (replugging USB, etc.) or by making udev request kernel events again via udevadm trigger. Various event actions can be triggered. By default, the change event action is triggered:
root #
udevadm trigger
Se reporter à la page de manuel de udevadm pour plus d'information.
Dépannage
Journaliser les messages de surveillance
Pour journaliser tous les messages quand la commande udevadm monitor est exécutée, modifier le fichier de configuration suivant :
udev_monitor="YES"
Cela créera le nouveau journal situé à /run/udev/udevmonitor.log.
Mode de débogage
Activer le mode de debogage pour obtenir plus de messages journalisés :
udev_debug="YES"
Définir la priorité de journalisation :
udev_log="debug"
Cela créera le nouveau journal /run/udev/udevdebug.log mais aucun message n'y sera écrit. Les version les plus récentes de udev écrirons leurs messages dans dmesg.
Fichiers de périphériques manquants /dev/null et /dev/console
Quelques version de udev ont besoin des fichiers /dev/null et /dev/console pour fonctionner correctement, mais ne peuvent pas les créer elles-même. Pour créer ces fichiers manuellement pour udev, exécuter la commande suivant en tant que root :
root #
mkdir test
root #
mount --bind / test
root #
cd test/dev
root #
mknod -m 660 console c 5 1
root #
mknod -m 660 null c 1 3
root #
cd ../..
root #
umount test
root #
rmdir test
NIC (Carte interface réseau) assignée eth0, mais a été déplacée en eth1
Ceux qui ont des cartes à deux interfaces réseau sur leur carte mère peuvent se retrouver dans une situation où ifconfig peut ne montrer ni eth0 ni eth1. dmesg peut montrer la carte interface réseau détectée comme eth0, et ensuite déplacée en eth1. Exécuter la commande ifconfig -a montrerar aussi la carte réseau en tant que eth1. Ceci est dû au fait que les noms assignés par le noyau ont été utilisés en premier lieu. Les utilisateurs doivent écrire leurs propres règles comme /etc/udev/rules.d/70-my-network.rules pour utiliser des noms libres comme lan0 ou wireless0, ou utiliser les noms d'interfaces prédictibles (qui ont été activés par défaut depuis la version 197 de udev).
Pensez aussi à retirer les anciens fichiers des versions antérieures de udev :
root #
rm /etc/udev/rules.d/70-persistent-net.rules /etc/systemd/network/99-default.link
Assurez-vous également de ne pas mettre net.ifnames=0
sur la ligne de commande du noyau. Ce paramètre désactiverait complètement la fonctionnalité de noms d'interfaces prévisibles de udev.
Voir aussi
- eudev — a fork of udev, systemd's device file manager for the Linux kernel.
Ressources externes
Bug 575718 - Request for council decision regarding virtual/udev default provider - Default virtual/udev provider changed to sys-fs/eudev