Udev

Un article de Wiki de la communauté Mandriva.

Jump to: navigation, search
Udev est une implémentation dans l'espace utilisateur de devfs et un remplacement pour hotplug.

Sommaire

[modifier] Résumé

udev est une implémentation de devfs/devfsd dans l'espace utilisateur qui utilise sysfs. Tout comme devfs, udev crée et supprime dynamiquement les nœuds périphériques de /dev/. Il requiert un noyau 2.6 pour fonctionner correctement.

Il remplace aussi le paquetage hotplug, qui contient des scripts lancés lors de certains évènements détectés pas le noyau. Les scripts nécessaires pour migrer de hotplug vers udev ont été développés : les agents hotplug sont remplacés par des règles udev, les usermaps ont été implémentées quand nécessaire et le support pour le branchement à froid a été rajouté à udev afin d'éviter de dupliquer les fonctionalités dans les initscripts.

[modifier] Pourquoi basculer vers udev?

devfs n'était plus maintenu.

Auparavant, hotplug utilisait des scripts shells lents pour chaque évènement, même si l'on ne devait pas donner suite à cet évènement.

Le fait que udev utilise maintenant des règles destination (et étant un programme en C plutôt que des scripts shells) le rend plus rapide que le précédent hotplug. En passant, cela réduit grandement le temps de démarrage de la machine aussi.

[modifier] Un remplaçant pour hotplug

[modifier] Le branchement à froid

udev peut maintenant gérer le branchement à chaud et à froid pour plusieurs bus (pci/usb). Auparavant, nous chargions le contrôleur usb en utilisant le service usb et nous n'utilisions pas le service hotplug. Donc, le branchement à froid est actif pour les contrôleurs USB et les périphériques uniquement dans udev et le service "usb" est lancé par rc.sysinit seulement pour les noyaux 2.4.

Cette fonctionalité est implémentée dans udevstart, dans lequel nous avons ajouté le branchement à froid pour les bus PCI et USB. Le branchement à froid des bus PCI est nécessaire pour les contrôleurs USB. Le branchement à froid USB est nécessaire quand le contrôleur USB a été chargé auparavant par initrd.

Cette fonctionalité est probablement mieux réalisée par udevsynthetize, mais il était bien trop tard pour inclure un nouveau programme dans le cycle de développement de la 2006, alors que notre petit patch udevstart pouvait être testé facilement.

udevstart est démarré par le service udev très tôt dans le démarrage de la machine, avant qu'aucun autre service ne soit lancé.

[modifier] Branchement à chaud: chargement des modules

Le branchement à chaud USB et PCI sont maintenant gérés par udev, qui peut charger les modules et lancer les scripts à la volée. Il trouve les bons modules en utilisant la valeur du "modalias" du périphérique et les charge à partir de /lib/modules/`uname -r`/modules.alias

La valeur de modalias peut être trouvée dans sysfs et ressemble à ceci:

pci:v00008086d000024D1sv00001043sd000080A6bc01sc01i8f

[modifier] Branchement à chaud: driver specific agents

A helper has been added to run old hotplug agents named this way: /etc/hotplug/<subsystem>/<driver> It is run automatically for USB modules having a modalias.

The /etc/hotplug directory will be removed, so if an agent has to be run after a device is detected, it should now be moved to /etc/udev/agents.d/<subsystem>/<driver> The helper will now use this path.

[modifier] Branchement à chaud: usermaps

Une fonctionnalité pratique dans hotplug était le support pour les usermaps qui permettait de charger des modules ou de lancer des scripts en utilisant les caractéristiques USB, même si elles n'étaient pas référencées par un module du noyau. Ils étaient chargés par l'agent USB de hotplug, qui est dorénavant désactivé parceque l'on gère le branchement à chaud dans udev. Néanmoins, cette fonction est manquante dans udev.

Pour résoudre ce problème, nous avons écrit le script "udev_import_usermap" pour migrer les usermaps (il est dans le paquetage udev-tools).

Il lit les usermaps et écrit des règle udev, qui chargeront avec modprobe le module correspondant et lancera l'agent du pilote correspondant. L'agent du pilote est lancé automatiquement uniquement quand un modalias est fourni par le noyau, c'est pourquoi l'agent doit être lancé dans ce cas-ci.

Noter que si l'agent du pilote ne lance qu'une seule commande, il est mieux de l'inclure dans la règle udev. Cela évitera de lancer le script /etc/udev/agents.d/<subsystem>/<driver>.

Ce script peut être lancé avec des options afin d'éviter le chargement avec modprobe ou le lancement de l'agent quand on sait que ce n'est pas nécessaire pour le usermap lu par le script. Il serait intéressant de pouvoir spécifier une ligne de commande pour modifier le chemin de l'agent.

Quelques paquetages dans les dépôts main/contrib ont été modifiés pour utiliser les règles udev. Seuls quelques-uns utilisent encore les usermaps.

[modifier] Mettre en liste noire des modules pour éviter leur chargement automatique

Il vous est possible de mettre en liste noire certains modules qui ne seront pas chargés automatiquement en utilisant la syntaxe suivante dans /etc/modprobe.conf, grâce au dernier paquetage module-init-tools :

blacklist <nom du module>

Il empêche le chargement du module quand la commande "modprobe <modalias correspondant>" est utilisée, mais autorise toujours un "modprobe <nom du module>".

[modifier] Chargement des firmwares

Nous conservons /lib/hotplug/firmware pour des raisons de compatibilités, de sorte que les firmwares doivent toujours être présents dans ce répertoire (/usr/lib/hotplug est un lien symbolique vers /lib/hotplug).

[modifier] Le paquetage hotplug est (presque) enlevé

Ce paquetage n'est plus réellement utile dorénavant. Les scripts d'agent et les scripts rc ne sont plus utilisés. /etc/hotplug disparaîtra, il ne peut que semer la confusion maintenant.

Les seules données encore utiles sont les usermaps, qui ont été converties en règles udev: /etc/udev/rules.d/70-distmap.rules. Elles ont été déplacées dans le paquetage udev, afin que l'on évite d'installer hotplug sur un nouveau système. Néanmoins, quelques entrées dans ces usermaps ne sont peut-être plus utiles et il y a probablement des doublons avec le fichier du noyau modules.alias, bien qu'ils soient gardés au cas où.

[modifier] Branchement à chaud des périphériques réseaux

Le vieux net.agent a été converti en /sbin/udev_net_helper. Il est toujours lancé quand un périphérique réseau est ajouté ou supprimé. Il permet de lancer ifup/ifdown et crée les fichiers de configuration par défaut s'ils n'existent pas.

ifup/ifdown sont lancés avec le paramètre "boot", afin que ifplugd et wpa_supplicant soient lancés si ils sont configurés.

ACTION=="add", SUBSYSTEM=="net", ENV{INTERFACE}=="*", \
              RUN+="/sbin/udev_net_helper"
ACTION=="remove", SUBSYSTEM=="net", ENV{INTERFACE}=="*", \
              RUN+="/sbin/udev_net_helper"

[modifier] Les règles de branchement à chaud ou à froid

Voici les règles udev pour effectuer le branchement à chaud et à froid PCI et USB mais qui évitent de charger les périphériques PCI (excepté les contrôleurs USB) pendant le branchement à froid.

# libusb device access (mount usbfs or usbdev nodes)
DEVPATH=="/module/usbcore", ACTION=="add", \
              RUN+="/bin/sh -c 'sleep 1; /bin/mount -t usbfs -o \
devmode=0664,devgid=43 none /proc/bus/usb'" # allow pci cold plug for usb controllers \
only # alias pci:v*d*sv*sd*bc0Csc03i10* ohci-hcd
# alias pci:v*d*sv*sd*bc0Csc03i20* ehci-hcd
# alias pci:v*d*sv*sd*bc0Csc03i00* uhci-hcd
ACTION=="add", SUBSYSTEM=="pci", ENV{UDEV_START}=="1", \
        SYSFS{class}!="0x0c0300", \
   SYSFS{class}!="0x0c0310", \
   SYSFS{class}!="0x0c0320", \
   OPTIONS="ignore_device"
# modprobe on hot plug (and cold plug, which is processed by udevstart)
ACTION=="add", SUBSYSTEM=="pci", MODALIAS=="*", \
        RUN+="/sbin/modprobe $modalias"
ACTION=="add", SUBSYSTEM=="usb", MODALIAS=="*", \
        RUN+="/sbin/modprobe $modalias"
ACTION=="add", SUBSYSTEM=="usb", MODALIAS=="*", \
        RUN+="/sbin/udev_agent_helper"

[modifier] Vision globale des changements dans udev selon son auteur (Kay Sievers)

http://vrfy.org/log/recent-state-of-udev.html

Récupérée de « http://wiki.mandriva.com/fr/Udev »
Autres langues