GNU/Linux >> Tutoriels Linux >  >> Linux

Le nombre majeur et mineur est-il unique ?

Sont les major, minor numéro unique ?

Avons-nous des citations et des références ?

NAME   MAJ:MIN RM   SIZE RO MOUNTPOINT
sda      8:0    0 465.8G  0 
├─sda1   8:1    0 298.2M  0 
├─sda2   8:2    0     3G  0 
├─sda3   8:3    0 458.7G  0 /
├─sda4   8:4    0     1K  0 
└─sda5   8:5    0   3.8G  0 
sr0     11:0    1  1024M  0 

Réponse acceptée :

Depuis L'interface de programmation Linux , §14.1

Chaque fichier de périphérique a un numéro d'identification majeur et un numéro d'identification mineur. L'ID majeur identifie la classe générale de périphérique et est utilisé par le noyau pour rechercher le pilote
approprié pour ce type de périphérique. L'ID mineur identifie de manière unique un appareil particulier
au sein d'une classe générale. Les ID majeur et mineur d'un fichier de périphérique sont affichés par la commande
ls -l.

[…]

Chaque pilote de périphérique enregistre son association avec un ID de périphérique majeur spécifique, et cette association fournit la connexion entre le fichier spécial de périphérique et le périphérique. Le nom du fichier de périphérique n'a aucune pertinence lorsque le noyau recherche le pilote de périphérique.

c'est-à-dire que l'intention est de fournir un mappage unique de majeur:mineur à périphérique:instance pour chaque type de périphérique. Strictement, vous pouvez avoir deux appareils distincts avec le même majeur :mineur, tant que l'un est char et l'autre est bloc :

# ls -l /dev/ram1 /dev/mem
crw-r----- 1 root kmem 1, 1 Jan  1  1970 /dev/mem
brw-rw---- 1 root disk 1, 1 Jan  1  1970 /dev/ram1

Sous Linux, à tout moment sur un système les nombres majeur:mineur pour chaque type d'appareil sont uniques. Les nombres peuvent cependant changer au fil du temps et ne doivent pas nécessairement être les mêmes sur différents systèmes Linux (même la même distribution, le même noyau et le même matériel). Notez que les périphériques de caractères et de blocs ont des espaces de numérotation distincts, par ex. le bloc majeur 1 est affecté aux disques RAM, le caractère majeur 1 est affecté à un ensemble de périphériques du noyau, y compris null et zéro.

Historiquement, les appareils majeurs étaient (principalement) statiques alloué via un registre (également toujours présent, bien que non maintenu, dans la source du noyau Documentation/devices.txt ). De nos jours, de nombreux appareils sont alloués dynamiquement, c'est géré par udev, et les mappages sont visibles dans /proc/devices . Les périphériques fixes existent toujours dans incude/uapi/linux/major.h (récemment déplacé de include/major.h )

Désormais, bien que la combinaison majeur:mineur identifie de manière unique des instances de périphérique spécifiques, rien ne vous empêche de créer plusieurs nœuds de périphérique (fichiers) faisant référence au même périphérique. Ils n'ont même pas besoin d'être créés dans /dev (mais ils doivent être sur un système de fichiers qui prend en charge la création de nœuds de périphérique et qui ne sont pas montés avec le nodev option).

Une utilisation courante consiste à créer des périphériques zéro, nuls et aléatoires en double dans un chroot :

# find /dev /var/chroot -regextype posix-extended -regex ".*/(zero|null|random)" -type c | 
xargs ls -l
crwxrwxrwx 1 root root 1, 3 2012-11-21 03:22 /dev/null
crw-rw-r-- 1 root root 1, 8 2012-05-07 10:35 /dev/random
crw-rw-rw- 1 root root 1, 5 2012-11-21 03:22 /dev/zero
crwxrwxrwx 1 root root 1, 3 2012-11-21 03:22 /var/chroot/sendmail/dev/null
crw-rw-r-- 1 root root 1, 8 2012-05-07 10:35 /var/chroot/sendmail/dev/random
crw-rw-rw- 1 root root 1, 5 2012-11-21 03:22 /var/chroot/sendmail/dev/zero

Les noms ne sont que des alias, le noyau ne se soucie pas beaucoup de la plupart des noms ou des emplacements, il se soucie du numéro majeur afin qu'il puisse sélectionner le bon pilote, et le pilote se soucie (généralement) du numéro mineur afin qu'il puisse sélectionner le exemple correct.

Connexe :Apprendre l'anglais - Lorsque "fort" est utilisé après un nombre, fait-il référence à ce nombre exact ou à un nombre approximatif ?

La plupart des noms sont simplement des conventions (bien que certains soient définis par POSIX). Notez également qu'un appareil peut s'enregistrer pour plusieurs numéros majeurs, vérifiez le sd pilote dans /proc/devices; un nom de module de pilote (.ko ) n'a pas besoin d'être le même que le nom de l'appareil, et n'a pas besoin d'être le même que le nœud de l'appareil dans /dev , et un seul module de pilote peut gérer plusieurs périphériques logiques/physiques ou noms de périphériques.

Pour récapituler :vous pouvez avoir deux nœuds de périphérique ou plus (dans /dev/ ou ailleurs) qui ont les mêmes nombres majeur:mineur, mais s'ils sont du même type, ils font référence au même appareil. Vous pouvez avoir un pilote qui peut gérer plusieurs instances majeures, mais dans le noyau et dans le pilote, pour chaque type (char ou bloc), le nombre majeur:mineur est pris pour faire référence à un périphérique spécifique (majeur) et à une instance spécifique ( mineur) de l'appareil.

Vous ne pouvez pas avoir deux nœuds de périphérique avec le même type et major:minor et vous attendre à ce qu'ils accèdent à deux périphériques logiques ou physiques différents. Lorsqu'un périphérique est en cours d'accès, le noyau sélectionne un pilote en fonction du type et du numéro majeur (et pas en fonction du nom du nœud de l'appareil), et par convention, le numéro mineur sélectionne de manière déterministe une instance ou une sous-fonction spécifique.

Mettre à jour Une histoire intéressante et une perspective *BSD peuvent être trouvées dans le BSDCon 2002 de Poul-Henning Kamp présentation :https://www.usenix.org/legacy/events/bsdcon/full_papers/kamp/kamp_html/

Si vous remontez dans le temps jusqu'en 1978 (avec l'aimable autorisation d'Alcatel-Lucent, le Bell System Technical Journal juillet-août 1978) le « système de partage de temps Unix ' l'énonce clairement (p1937):

Les appareils sont caractérisés par un numéro d'appareil majeur, un numéro d'appareil mineur et une classe (bloc ou caractère). Pour chaque classe, il existe un tableau de points d'entrée dans les pilotes de périphériques. Le numéro de périphérique principal est utilisé pour indexer le tableau lors de l'appel du code d'un pilote de périphérique particulier. Le numéro de périphérique mineur est transmis au pilote de périphérique en tant qu'argument. Le numéro mineur n'a d'autre signification que celle qui lui est attribuée par le conducteur. Habituellement, le pilote utilise le numéro mineur pour accéder à l'un des plusieurs périphériques physiques identiques.


Linux
  1. Limiter le nombre de clients connectés sur un VirtualHost dans Apache

  2. Que sont les séparateurs de mots Readline ?

  3. Modifier le numéro de port du serveur SSH par défaut

  4. Fedora vs Ubuntu :quelles sont les principales différences ?

  5. Comment identifier les numéros majeurs et mineurs pour les périphériques de bloc sous Unix

Comment trouver le numéro de port d'un service sous Linux

5 façons de compter le nombre de lignes dans un fichier

Linux – Quelles sont les valeurs de la propriété Device Tree Interrupts ?

Quels sont les avantages de CloudLinux ?

En quoi les fonctions de la famille dev_*() sont-elles utiles lors du débogage du noyau Linux ?

Mappage d'un numéro de périphérique sur un nom de périphérique logique