Le major, minor
nombre est-il unique?
Avons-nous des citations et des références à cela?
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éponses:
Depuis l' interface de programmation Linux , §14.1
Voir également cet ancien chapitre (2001) Linux Device Drivers (2e) .
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:
Sous Linux, à tout moment sur un système, les principaux: les numéros mineurs pour chaque type d'appareil sont uniques. Les nombres peuvent cependant changer avec le temps, et n'ont pas besoin d'ê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 caractère et bloc ont des espaces de numérotation distincts, par exemple le bloc majeur 1 est affecté aux disques RAM, le caractère majeur 1 est affecté à un ensemble de périphériques noyau, y compris null et zéro.
Historiquement, les majors de périphériques étaient (principalement) alloués statiquement via un registre (également toujours présent, bien que non entretenu, dans la source du noyau
Documentation/devices.txt
). De nos jours, de nombreux appareils sont alloués dynamiquement, cela est géré par udev et les mappages sont visibles dans/proc/devices
. Les appareils fixes existent toujours dansincude/uapi/linux/major.h
(récemment déplacé deinclude/major.h
)Maintenant, 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 (fichiers) de périphériques qui font 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 n'est pas monté avec l'nodev
option).Une utilisation courante consiste à créer des périphériques zéro, nul et aléatoire en double dans un chroot:
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 pour qu'il puisse sélectionner le bon pilote, et le pilote se soucie (généralement) du numéro mineur pour pouvoir sélectionner le bonne instance.
La plupart des noms sont simplement conventionnels (bien que certains soient définis par POSIX ). Notez également qu'un seul périphérique peut s'inscrire pour plusieurs numéros principaux, vérifiez le
sd
pilote/proc/devices
; un nom de module de pilote (.ko
) ne doit pas nécessairement être le même que le nom de périphérique, et pas nécessairement le même que le nœud de périphérique/dev
, et un seul module de pilote peut gérer plusieurs périphériques logiques / physiques ou noms de périphérique.Pour récapituler: vous pouvez avoir deux ou plusieurs nœuds de périphérique (dans
/dev/
ou ailleurs) qui ont le même majeur: des numéros mineurs, mais s'ils sont du même type, ils se réfèrent au même périphérique. Vous pouvez avoir un pilote qui peut gérer plusieurs instances majeures, mais au sein du noyau et au sein du pilote, pour chaque type (caractère ou bloc), le numéro 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 de même type et majeur: mineur et attendez-vous à ce qu'ils accèdent à deux périphériques logiques ou physiques différents. Lorsqu'un périphérique est accédé, le noyau sélectionne un pilote en fonction du type et du numéro principal (et non en fonction du nom du nœud du périphérique), et par convention, le numéro mineur sélectionne de manière déterministe une instance ou une sous-fonction spécifique.
Mise à jour Une histoire intéressante et une certaine perspective * BSD peuvent être trouvées dans la présentation BSDCon 2002 de Poul-Henning Kamp : https://www.usenix.org/legacy/events/bsdcon/full_papers/kamp/kamp_html/
Si vous remontez dans le temps jusqu'en 1978 (avec la permission d'Alcatel-Lucent, le journal technique de Bell System juillet-août 1978), le « système de partage du temps Unix » le définit clairement (p1937):
la source
MAJ:Min
numéroLorsqu'un fichier de périphérique est créé par
mknode
, les numérosmajor
etminor
sont fournis. C'est ainsi que Linux identifie le périphérique matériel sous-jacent associé à un fichier de périphérique. Dans la plupart des cas, leurmajor
numéro identifie le pilote tandis que leminor
distingue les différents appareils contrôlés par le pilote.En tant que tels, les numéros doivent être uniques pour chaque appareil ou il ne serait pas possible de créer des fichiers d'appareil corrects pour chacun d'eux.
la source
Non, sous Linux, ils ne sont pas toujours uniques.
Linux utilise un
devpts
système de fichiers virtuel pour fournir des pseudoterminaux (ptys), et ce système de fichiers virtuel peut être monté plusieurs fois et à différents endroits, ce qui est pratique lors de la configuration de chroots ou de conteneurs d'espace de noms. Bien qu'unmajor:minor
tuple soit unique sur unedevpts
instance de système de fichiers, il n'est pas unique sur un système en cours d'exécution:Dans l'exemple ci-dessus, la
script(1)
commande crée un pseudo-terminal et exécute un shell à l'intérieur. Il est sacrément évident que le pseudo-terminal créé par le premierscript
processus n'est pas le même que celui créé par le second, mais ils ont le même nom et des numéros mineurs et majeurs.Afin d'identifier de manière unique un pseudoterminal, vous devez utiliser leur
device:inode
tuple ou combiner le numéro de périphérique (du système de fichiers devpts) avec leurmajor:minor
. Le problème est que le champ "tty" du/proc/PID/stat
(le 7, voir laproc(5)
page de manuel; c'est là que les outils aimentlsof
oups
obtiennent leurs informations) ne contient que lest_rdev
du tty (le packémajor:minor
); si c'est un esclave pty, il n'y a aucune indication sur ledevpts
système de fichiers qui le fournit. Les mêmes problèmes affectent le numéro de périphérique pouvant être obtenu avec l'TIOCGDEV
ioctl.AFAICS, il n'existe aucun moyen fiable d'identifier le terminal de contrôle d'un processus sous Linux. Corrections et suggestions sinon bienvenues!
la source