Gestion des périphériques système à l'aide du gestionnaire de périphériques udev

Présentation de la façon dont le gestionnaire de périphériques udev détecte le matériel, gère les noeuds de périphérique et s'intègre à systemd sur Oracle Linux.

Le gestionnaire de périphériques udev s'exécute en tant que service systemd pour aider à fournir aux logiciels un accès prévisible et géré aux périphériques système exposés par le noyau. En général, udev gère les droits d'accès des noeuds de périphérique, crée des liens symboliques dans le répertoire /dev/ pour rendre les noms de périphérique plus prévisibles et plus faciles à identifier, ou renomme les interfaces réseau.

Le gestionnaire de périphériques udev crée ou supprime dynamiquement les fichiers de noeud de périphérique au moment de l'initialisation. Lors de la création d'un noeud de périphérique, udev lit le répertoire /sys du périphérique pour des attributs tels que l'étiquette, le numéro de série et le numéro de périphérique de bus.

udev peut utiliser des noms de périphériques persistants pour garantir un nommage cohérent des périphériques lors des réinitialisations, quel que soit leur ordre de détection. Les noms de périphériques persistants sont particulièrement importants lors de l'utilisation de périphériques de stockage externes.

udev gère également les événements de pilote de périphérique qui sont déclenchés par le noyau et utilise les règles définies dans sa configuration pour déclencher des actions particulières. Par exemple, si un périphérique de stockage USB est connecté au système, le noyau notifie udev et udev notifie le gestionnaire approprié afin que le périphérique puisse être monté. En outre, si un câble réseau est connecté à une carte d'interface réseau, le noyau notifie udev du changement d'état et udev notifie NetworkManager afin que l'action appropriée puisse avoir lieu pour se connecter au réseau.

Le fichier de configuration pour udev est /etc/udev/udev.conf, dans lequel vous pouvez définir la priorité de journalisation udev_log, qui peut être définie sur err, info et debug. La valeur par défaut est err. La configuration supplémentaire des règles utilisées par udev est gérée dans des fichiers de règles individuels dans /etc/udev/rules.d/.

Pour plus d'informations, consultez la page de manuel udev(7).

udev est un composant de systemd. Pour plus d'informations, consultez les guides systemd spécifiques à la version.

Pour plus d'informations sur les concepts systemd utilisés par udev dans les versions Oracle Linux, reportez-vous à la section Managing the System With systemd.

Pour plus d'informations sur les systèmes de fichiers virtuels du noyau et les modules de pilote de périphérique, utilisez les ressources spécifiques à la version suivantes.

Pour plus d'informations sur les systèmes de fichiers virtuels du noyau et les modules de pilote de périphérique dans les versions Oracle Linux, reportez-vous à la section Managing Kernels and System Boot on Oracle Linux.

A propos des fichiers de périphérique

Explique comment Oracle Linux représente le matériel en tant que fichiers de périphérique, y compris les blocs, les caractères et les pseudo-périphériques.

Le répertoire /dev contient des fichiers de périphériques ou des noeuds de périphériques qui permettent d'accéder à des périphériques tels que des disques durs, à des ressources sur des périphériques tels que des partitions de disque et des pseudo-périphériques tels qu'un générateur de nombres aléatoires.

Le répertoire /dev comporte plusieurs hiérarchies de sous-répertoires, chacune contenant des fichiers de périphérique liés à un certain type de périphérique. Toutefois, le contenu de ces sous-répertoires est implémenté en tant que liens symboliques vers les fichiers correspondants dans /dev. Ainsi, les fichiers sont accessibles via le fichier lié dans /dev ou le fichier correspondant dans le sous-répertoire.

L'utilisation de la commande ls -l /dev répertorie les fichiers, dont certains sont marqués comme étant de type b (pour block) ou de type c (pour character). Ces périphériques sont associés à une paire de numéros qui identifient le périphérique au système.

ls -l /dev
total 0
crw-r--r--. 1 root root     10, 235 Aug 20 08:36 autofs
drwxr-xr-x. 2 root root         240 Sep 20 07:37 block
drwxr-xr-x. 2 root root         100 Aug 20 08:36 bsg
drwxr-xr-x. 3 root root          60 Nov  4  2019 bus
lrwxrwxrwx. 1 root root           3 Aug 20 08:36 cdrom -> sr0
drwxr-xr-x. 2 root root        2720 Sep 20 07:37 char
crw-------. 1 root root      5,   1 Aug 20 08:36 console
lrwxrwxrwx. 1 root root          11 Aug 20 08:36 core -> /proc/kcore
drwxr-xr-x. 3 root root          60 Nov  4  2019 cpu
crw-------. 1 root root     10,  62 Aug 20 08:36 cpu_dma_latency
drwxr-xr-x. 7 root root         140 Aug 20 08:36 disk
brw-rw----. 1 root disk    253,   0 Aug 20 08:36 dm-0
brw-rw----. 1 root disk    253,   1 Aug 20 08:36 dm-1
brw-rw----. 1 root disk    253,   2 Aug 20 08:36 dm-2
lrwxrwxrwx. 1 root root          13 Aug 20 08:36 fd -> /proc/self/fd
crw-rw-rw-. 1 root root      1,   7 Aug 20 08:36 full
crw-rw-rw-. 1 root root     10, 229 Aug 20 08:36 fuse
crw-------. 1 root root     10, 228 Aug 20 08:36 hpet
drwxr-xr-x. 2 root root           0 Aug 20 08:36 hugepages
crw-------. 1 root root     10, 183 Aug 20 08:36 hwrng
lrwxrwxrwx. 1 root root          12 Aug 20 08:36 initctl -> /run/initctl
drwxr-xr-x. 3 root root         220 Aug 20 08:36 input
crw-r--r--. 1 root root      1,  11 Aug 20 08:36 kmsg
lrwxrwxrwx. 1 root root          28 Aug 20 08:36 log -> /run/systemd/journal/dev-log
brw-rw----. 1 root disk      7,   0 Sep 23 01:28 loop0
crw-rw----. 1 root disk     10, 237 Sep 20 07:37 loop-control
drwxr-xr-x. 2 root root         120 Aug 20 08:36 mapper
crw-------. 1 root root     10, 227 Aug 20 08:36 mcelog
crw-r-----. 1 root kmem      1,   1 Aug 20 08:36 mem
crw-------. 1 root root     10,  59 Aug 20 08:36 memory_bandwidth
drwxrwxrwt. 2 root root          40 Nov  4  2019 mqueue
drwxr-xr-x. 2 root root          60 Aug 20 08:36 net
crw-------. 1 root root     10,  61 Aug 20 08:36 network_latency
crw-------. 1 root root     10,  60 Aug 20 08:36 network_throughput
crw-rw-rw-. 1 root root      1,   3 Aug 20 08:36 null
crw-------. 1 root root     10, 144 Aug 20 08:36 nvram
drwxr-xr-x. 2 root root         100 Aug 20 08:36 ol_ca-virtdoc-oltest1
crw-r-----. 1 root kmem      1,   4 Aug 20 08:36 port
crw-------. 1 root root    108,   0 Aug 20 08:36 ppp
crw-rw-rw-. 1 root tty       5,   2 Oct  7 08:10 ptmx
drwxr-xr-x. 2 root root           0 Aug 20 08:36 pts
crw-rw-rw-. 1 root root      1,   8 Aug 20 08:36 random
drwxr-xr-x. 2 root root          60 Nov  4  2019 raw
lrwxrwxrwx. 1 root root           4 Aug 20 08:36 rtc -> rtc0
crw-------. 1 root root    251,   0 Aug 20 08:36 rtc0
brw-rw----. 1 root disk      8,   0 Aug 20 08:36 sda
brw-rw----. 1 root disk      8,   1 Aug 20 08:36 sda1
brw-rw----. 1 root disk      8,   2 Aug 20 08:36 sda2
brw-rw----. 1 root disk      8,  16 Aug 20 08:36 sdb
brw-rw----. 1 root disk      8,  17 Aug 20 08:36 sdb1
crw-rw----. 1 root cdrom    21,   0 Aug 20 08:36 sg0 

Unités de blocs

Les périphériques en mode bloc permettent un accès aléatoire aux données, à la recherche de média pour les données, et mettent généralement les données en mémoire tampon lors de l'écriture ou de la lecture des données. Les disques durs, les lecteurs de CD-ROM, la mémoire flash et d'autres périphériques de mémoire adressables sont des exemples de périphériques en mode bloc.

Périphériques de caractères

Les périphériques de type caractère permettent la transmission en continu de données vers ou depuis un périphérique. Les données ne sont généralement pas mises en mémoire tampon et l'accès aléatoire aux données d'un appareil n'est pas accordé. Le noyau écrit ou lit des données à partir d'un périphérique à caractères 1 octet à la fois. Des exemples de périphériques à caractère incluent des claviers, des souris, des terminaux, des pseudo-terminaux et des lecteurs de bande. tty0 et tty1 sont des fichiers de périphériques à caractère qui correspondent à des périphériques terminaux afin que les utilisateurs puissent se connecter à partir de terminaux série ou d'émulateurs de terminaux.

Dispositifs à caractères pseudo-terminaux

Les périphériques secondaires pseudo-terminaux émulent des périphériques terminaux réels afin qu'ils puissent interagir avec les logiciels. Par exemple, un utilisateur peut se connecter à un périphérique terminal tel que /dev/tty1, qui utilise ensuite le périphérique principal pseudo-terminal, /dev/pts/ptmx, pour interagir avec un périphérique pseudo-terminal sous-jacent. Les fichiers de périphérique en mode caractère pour les périphériques secondaires et primaires pseudo-terminaux se trouvent dans le répertoire /dev/pts, comme indiqué dans l'exemple suivant :

ls -l /dev/pts
total 0
crw--w----. 1 guest tty  136, 0 Mar 17 10:11 0
crw--w----. 1 guest tty  136, 1 Mar 17 10:53 1
crw--w----. 1 guest tty  136, 2 Mar 17 10:11 2
c---------. 1 root  root   5, 2 Mar 17 08:16 ptmx

Certaines entrées de périphérique, telles que stdin pour l'entrée standard, sont liées symboliquement via le sous-répertoire self du système de fichiers proc. Le fichier de périphérique pseudo-terminal vers lequel ils pointent dépend du contexte du processus.

ls -l /proc/self/fd/[012]
lrwx------. 1 root root 64 Oct  7 08:23 /proc/self/fd/0 -> /dev/pts/0
lrwx------. 1 root root 64 Oct  7 08:23 /proc/self/fd/1 -> /dev/pts/0
lrwx------. 1 root root 64 Oct  7 08:23 /proc/self/fd/2 -> /dev/pts/0

Périphériques de caractères NULL, aléatoires, urandom et zéro

Les périphériques à caractère, tels que null, random, urandom et zero, sont des exemples de pseudo-périphériques qui fournissent un accès aux fonctionnalités virtuelles implémentées dans un logiciel plutôt qu'au matériel physique.

/dev/null est un récepteur de données. Les données que vous écrivez dans /dev/null disparaissent mais l'opération d'écriture réussit. La lecture à partir de /dev/null renvoie EOF (fin de fichier).

/dev/zero est une source de données d'un nombre illimité d'octets de 0 valeur.

/dev/random et /dev/urandom sont des sources de données de flux d'octets pseudo-aléatoires. Pour maintenir une sortie haute-entropie, /dev/random bloque si son pool d'entropie ne contient pas suffisamment de bits de bruit. /dev/urandom ne bloque pas et, par conséquent, l'entropie de sa sortie peut ne pas être aussi élevée que celle de /dev/random. Cependant, ni /dev/random ni /dev/urandom ne sont considérés comme suffisamment aléatoires pour des raisons de cryptographie sécurisée telles que le chiffrement de niveau militaire.

Vous pouvez connaître la taille du pool d'entropies et la valeur d'entropie pour /dev/random à partir de fichiers virtuels sous /proc/sys/kernel/random :

cat /proc/sys/kernel/random/poolsize
4096
cat /proc/sys/kernel/random/entropy_avail
3467

Pour plus d'informations, reportez-vous aux pages de manuel null(4), pts(4) et random(4).