GNU/Linux >> Tutoriels Linux >  >> Cent OS

Guide du débutant pour Udev sous Linux

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.


Cent OS
  1. Un guide du terminal Linux pour les débutants

  2. Guide du débutant sur le multipathing Device Mapper (DM)

  3. Guide du débutant pour la configuration du module du noyau sous Linux

  4. Guide du débutant pour la gestion de l'espace d'échange sous Linux

  5. Udev :renommer mon interface réseau

Un guide du débutant sur les autorisations Linux

Un guide pour débutants sur LVM

Guide complet du débutant pour rooter le Samsung Galaxy S2 dans Ubuntu Linux

Un guide du débutant sur les tâches Cron

Guide du débutant sur SELinux

Guide du débutant pour l'administration des utilisateurs et des groupes sous Linux