Udev est le gestionnaire de périphériques du noyau Linux. Udev crée ou supprime dynamiquement des fichiers de nœud de périphérique au démarrage dans le répertoire /dev pour tous les types de périphériques. Udev fait maintenant partie de systemd comme vous pouvez le voir en consultant les noms de fichiers "udev" inclus avec le package RPM systemd.
# rpm -ql systemd | grep udev /etc/udev /etc/udev/hwdb.bin /etc/udev/rules.d /etc/udev/udev.conf /usr/bin/udevadm ...
Le démon Udev, systemd-udevd , reçoit les uevents de périphérique directement du noyau chaque fois qu'un périphérique est ajouté ou supprimé du système. Pour chaque événement, systemd-udevd exécute les instructions correspondantes spécifiées dans les règles Udev.
Les noms de fichiers de périphérique peuvent changer lorsque des disques sont supprimés du système en raison d'une panne. Par exemple, les périphériques sont nommés /dev/sda, /dev/sdb et /dev/sdc au démarrage. Mais au prochain redémarrage, /dev/sdb échoue et ce qui était auparavant /dev/sdc est nommé /dev/sdb. Toutes les références de configuration à /dev/sdb contiennent désormais du contenu référencé à l'origine par /dev/sdc.
La solution pour éviter ce type de situation consiste à garantir des noms cohérents pour les périphériques via des redémarrages. Vous pouvez configurer Udev pour créer des noms persistants et utiliser ces noms dans la table de montage du système de fichiers, /etc/fstab, ou comme argument de la commande mount.
Fichiers et répertoires de règles Udev
Les règles Udev déterminent comment identifier les périphériques et comment attribuer un nom persistant lors des redémarrages ou des changements de disque. Lorsqu'Udev reçoit un événement de périphérique, il compare les règles configurées aux attributs de périphérique dans sysfs pour identifier le périphérique. Les règles peuvent également spécifier des programmes supplémentaires à exécuter dans le cadre de la gestion des événements de l'appareil.
Les fichiers de règles Udev se trouvent dans les répertoires suivants :
- /lib/udev/rules.d/ – Le répertoire des règles par défaut
- /etc/udev/rules.d/ – Le répertoire des règles personnalisées. Ces règles prévalent.
Les fichiers de règles doivent avoir des noms uniques. Les fichiers du répertoire des règles personnalisées remplacent les fichiers du même nom dans le répertoire des règles par défaut. Les fichiers de règles sont triés et traités dans l'ordre lexical. Voici une liste partielle des fichiers de règles des répertoires de règles par défaut et personnalisés :
# ls -l /lib/udev/rules.d/ total 348 -r--r--r--. 1 root root 7266 Aug 5 2017 10-dm.rules -r--r--r--. 1 root root 2454 Aug 5 2017 11-dm-lvm.rules -rw-r--r--. 1 root root 2865 Jan 25 16:05 11-dm-mpath.rules -r--r--r--. 1 root root 1499 Aug 5 2017 13-dm-disk.rules -rw-r--r--. 1 root root 553 Aug 6 2017 39-usbmuxd.rules -rw-r--r--. 1 root root 1622 Mar 7 13:27 40-redhat.rules ...
# ls -l /etc/udev/rules.d/ total 8 -rw-r--r--. 1 root root 709 Aug 4 2017 70-persistent-ipoib.rules -rw-r--r--. 1 root root 96 Apr 21 05:09 70-persistent-net.rules lrwxrwxrwx. 1 root root 9 Sep 29 2014 80-net-name-slot.rules -> /dev/null
Exemple de règles Udev
L'exemple ci-dessous contient des entrées sélectionnées dans /lib/udev/rules.d/50-udev-default.rules dossier. Ce fichier de règles contient plus de 60 entrées.
# cat /lib/udev/rules.d/50-udev-default.rules # do not edit this file, it will be overwritten on update SUBSYSTEM=="virtio-ports", KERNEL=="vport*", ATTR{name}=="?*", SYMLINK+="virtio-ports/$attr{name}" # select "system RTC" or just use the first one SUBSYSTEM=="rtc", ATTR{hctosys}=="1", SYMLINK+="rtc" SUBSYSTEM=="rtc", KERNEL=="rtc0", SYMLINK+="rtc", OPTIONS+="link_priority=-100" SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", IMPORT{builtin}="usb_id", IMPORT{builtin}="hwdb --subsystem=usb" SUBSYSTEM=="input", ENV{ID_INPUT}=="", IMPORT{builtin}="input_id" ENV{MODALIAS}!="", IMPORT{builtin}="hwdb --subsystem=$env{SUBSYSTEM}" ACTION!="add", GOTO="default_permissions_end" SUBSYSTEM=="tty", KERNEL=="ptmx", GROUP="tty", MODE="0666" SUBSYSTEM=="tty", KERNEL=="tty", GROUP="tty", MODE="0666" SUBSYSTEM=="tty", KERNEL=="tty[0-9]*", GROUP="tty", MODE="0620" SUBSYSTEM=="tty", KERNEL=="sclp_line[0-9]*", GROUP="tty", MODE="0620" SUBSYSTEM=="tty", KERNEL=="ttysclp[0-9]*", GROUP="tty", MODE="0620" ....
Les entrées sélectionnées aident à décrire la syntaxe des fichiers de règles.
1. Les commentaires commencent par un signe #.
2. Chaque ligne non commentée d'un fichier de règles consiste en une liste d'une ou plusieurs paires clé-valeur séparées par une virgule. Il existe deux types de clés :
- Clés de correspondance
- Clés d'attribution
3. Si toutes les clés de correspondance correspondent à leur valeur respective, la règle est appliquée et les clés d'affectation reçoivent la valeur spécifiée. Chaque touche a un fonctionnement distinct, selon l'opérateur. Les opérateurs valides sont :
- == : Comparer pour l'égalité
- != : Comparer pour l'inégalité
- = :Attribuer une valeur à une clé
- += :Ajouter la valeur aux valeurs actuelles de la clé
- := :Attribuez la valeur finale à la clé. Interdire toute modification ultérieure par des règles ultérieures.
4. La correspondance de modèle de style shell (*, ?, []) est également prise en charge dans les règles Udev.
Clés de correspondance
Les noms de clé suivants sont utilisés pour établir une correspondance avec les propriétés de l'appareil. Certaines des clés correspondent également aux propriétés des appareils parents dans sysfs, et pas seulement à l'appareil qui a généré l'événement. Si plusieurs clés sont spécifiées dans une seule règle, toutes ces clés doivent correspondre.
- ACTION :correspond au nom de l'action d'événement.
- DEVPATH :correspond au devpath du périphérique d'événement.
- NOYAU :correspond au nom de l'appareil d'événement.
- NOM :correspond au nom d'une interface réseau. Il peut être utilisé si la clé NAME a été définie dans l'une des règles précédentes.
- LIEN SYMBOLIQUE :correspond au nom du lien symbolique ciblant le nœud. Il peut être utilisé si une clé SYMLINK a été définie dans l'une des règles précédentes. Il peut y avoir plusieurs liens symboliques, mais un seul doit correspondre.
- SOUS-SYSTÈME :Faites correspondre le sous-système du périphérique d'événement.
- TEST{masque de mode octal} :teste l'existence d'un fichier. Vous pouvez spécifier un masque de mode octal.
Les autres clés de correspondance incluent DRIVER, ATTR{filename}, KERNELS, SUBSYSTEMS, DRIVERS, ATTRS{filename}, TAGS, ENV{key}, TAG, PROGRAM et RESULT.
Clés d'attribution
Les clés suivantes peuvent avoir des valeurs qui leur sont attribuées :
- NOM – Le nom à utiliser pour une interface réseau. Le nom d'un nœud de périphérique ne peut pas être modifié par Udev, seuls des liens symboliques supplémentaires peuvent être créés.
- LIEN SYMBOLIQUE – Le nom du lien symbolique ciblant le nœud
- PROPRIÉTAIRE, GROUPE, MODE – Les autorisations pour le nœud de l'appareil
- OPTIONS – Options de règles et d'appareils. L'option ignore_remove utilisée dans l'exemple signifie "Ne supprimez pas le nœud de l'appareil lorsque l'appareil s'en va."
Les autres clés d'attribution incluent ATTR{clé}, ENV{clé}, TAG, RUN{type}, LABEL, GOTO, IMPORT{type}, WAIT_FOR et OPTIONS.
Substitutions de chaînes
Les touches NAME, SYMLINK, PROGRAM, OWNER, GROUP, MODE et RUN prennent en charge de nombreuses substitutions de chaînes de type printf. Les substitutions utilisées dans l'exemple sont :
- %M – Le numéro majeur du noyau pour le périphérique
- %m – Le numéro mineur du noyau pour le périphérique
Les substitutions de chaînes supplémentaires sont prises en charge. Reportez-vous à la page de manuel udev pour toutes les substitutions prises en charge et les détails sur les clés de correspondance supplémentaires, les clés d'affectation supplémentaires et les options de règle et d'appareil supplémentaires.
Utilitaire udevadm
L'utilitaire udevadm est un outil de gestion de l'espace utilisateur pour Udev. Entre autres fonctions, vous pouvez utiliser udevadm pour interroger sysfs et obtenir des attributs de périphérique pour vous aider à créer des règles Udev qui correspondent à un périphérique. Pour afficher l'utilisation d'udevadm :
# udevadm --help udevadm [--help] [--version] [--debug] COMMAND [COMMAND OPTIONS] Send control commands or test the device manager. Commands: info Query sysfs or the udev database trigger Request events from the kernel settle Wait for pending udev events control Control the udev daemon monitor Listen to kernel and udev events test Test an event run test-builtin Test a built-in command
Vous pouvez également obtenir l'utilisation de chacune des commandes udevadm. Par exemple, pour obtenir de l'aide sur l'utilisation de la commande info :
# udevadm info --help udevadm info [OPTIONS] [DEVPATH|FILE] Query sysfs or the udev database. -h --help Print this message --version Print version of the program -q --query=TYPE Query device information: name Name of device node symlink Pointing to node path sysfs device path property The device properties all All values -p --path=SYSPATH sysfs device path used for query or attribute walk -n --name=NAME Node or symlink name used for query or attribute walk -r --root Prepend dev directory to path names -a --attribute-walk Print all key matches walking along the chain of parent devices -d --device-id-of-file=FILE Print major:minor of device containing this file -x --export Export key/value pairs -P --export-prefix Export the key name with a prefix -e --export-db Export the content of the udev database -c --cleanup-db Clean up the udev database
Exemple d'utilitaire udevadm
Quelques exemples suivent. Pour interroger la base de données Udev pour le chemin de périphérique de /dev/xvdd :
# udevadm info --query=path --name=/dev/xvdd /devices/vbd-5696/block/xvdd
Pour interroger la base de données Udev pour toutes les informations de périphérique pour /dev/xvda :
# udevadm info --query=all --name=/dev/xvda P: /devices/vbd-768/block/xvda N: xvda E: DEVNAME=/dev/xvda E: DEVPATH=/devices/vbd-768/block/xvda E: DEVTYPE=disk E: DM_MULTIPATH_TIMESTAMP=1524287355 E: ID_PART_TABLE_TYPE=dos E: MAJOR=202 E: MINOR=0 E: MPATH_SBIN_PATH=/sbin E: SUBSYSTEM=block E: TAGS=:systemd: E: USEC_INITIALIZED=476119
Entrez ce qui suit pour imprimer toutes les propriétés sysfs de /dev/xvda. Ces propriétés peuvent être utilisées dans les règles Udev pour correspondre à l'appareil. Il imprime tous les appareils le long de la chaîne, jusqu'à la racine de sysfs.
# udevadm info --attribute-walk --name=/dev/xvda Udevadm info starts with the device specified by the devpath and then walks up the chain of parent devices. It prints for every device found, all possible attributes in the udev rules key format. A rule to match, can be composed by the attributes of the device and the attributes from one single parent device. looking at device '/devices/vbd-768/block/xvda': KERNEL=="xvda" SUBSYSTEM=="block" DRIVER=="" ATTR{ro}=="0" ATTR{size}=="41943040" ATTR{stat}==" 16775 4 686095 36372 2953 313 203104 42044 0 19603 78392" ATTR{range}=="16" ATTR{discard_alignment}=="0" ATTR{ext_range}=="16" ATTR{alignment_offset}=="0" ATTR{badblocks}=="" ATTR{inflight}==" 0 0" ATTR{removable}=="0" ATTR{capability}=="10" looking at parent device '/devices/vbd-768': KERNELS=="vbd-768" SUBSYSTEMS=="xen" DRIVERS=="vbd" ATTRS{devtype}=="vbd" ATTRS{nodename}=="device/vbd/768"
Création d'un lien symbolique vers un nœud de périphérique
L'ordre dans lequel les règles sont évaluées est important. Lorsque vous créez vos propres règles, vous souhaitez qu'elles soient évaluées avant les valeurs par défaut. Étant donné que les règles sont traitées dans l'ordre lexical, créez un fichier de règles avec un nom de fichier tel que /etc/udev/rules.d/10-local.rules pour qu'il soit traité en premier.
La règle suivante crée le lien symbolique /dev/my_disk vers le nœud de périphérique /dev/xvdd. Vous pouvez créer une règle Udev pour modifier le nom d'une interface réseau, mais le nom d'un nœud de périphérique ne peut pas être modifié par Udev. Seuls des liens symboliques supplémentaires peuvent être créés pour les nœuds de périphérique.
KERNEL=="xvdd", SUBSYSTEM=="block", SYMLINK="my_disk"
Exécutez le déclencheur udevadm pour traiter les fichiers de règles :
# udevadm trigger
Le lien symbolique existe maintenant.
# ls –l /dev/my* lrwxrwxrwx. ... /dev/my_disk -> xvdd
Supprimez le fichier 10-local.rules et exécutez le déclencheur udevadm pour supprimer le lien symbolique.