Sind die major, minor
Nummer Eindeutig?
Haben wir irgendwelche Zitate und Verweise darauf?
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
Akzeptierte Antwort:
Von Die Linux-Programmierschnittstelle , §14.1
Jede Gerätedatei hat eine Haupt-ID-Nummer und eine Neben-ID-Nummer. Die Haupt-ID identifiziert die allgemeine Geräteklasse und wird vom Kernel verwendet, um den passenden
Treiber für diesen Gerätetyp zu finden. Die Minor-ID identifiziert eindeutig ein bestimmtes Gerät
innerhalb einer allgemeinen Klasse. Die Major- und Minor-IDs einer Gerätedatei werden mit dem
ls -l-Befehl
[…]
Jeder Gerätetreiber registriert seine Zuordnung zu einer bestimmten Hauptgeräte-ID, und diese Zuordnung stellt die Verbindung zwischen der speziellen Gerätedatei und dem Gerät her. Der Name der Gerätedatei hat keine Bedeutung, wenn der Kernel nach dem Gerätetreiber sucht.
d.h. die Absicht besteht darin, für jeden Gerätetyp eine eindeutige Zuordnung von Haupt:Neben zu Gerät:Instanz bereitzustellen. Streng genommen können Sie das können zwei unterschiedliche Geräte mit demselben Major haben:Minor, solange eines char und eines block ist:
# 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
Unter Linux jederzeit auf einem System die Major:Minor-Nummern für jeden Gerätetyp sind einzigartig. Die Zahlen können sich jedoch im Laufe der Zeit ändern und müssen nicht auf verschiedenen Linux-Systemen (selbst bei derselben Distribution, demselben Kernel und derselben Hardware) gleich sein. Beachten Sie, dass Zeichen- und Blockgeräte unterschiedliche Nummerierungsräume haben, z. block major 1 wird RAM-Disks zugewiesen, char major 1 wird einer Reihe von Kernel-Geräten zugewiesen, einschließlich null und null.
Früher waren Geräte-Majors (meistens) statisch über eine Registrierung zugewiesen (ebenfalls noch vorhanden, wenn auch nicht gepflegt, in der Kernel-Quelle Documentation/devices.txt
). Heutzutage werden viele Geräte dynamisch zugewiesen, dies wird von udev verwaltet, und die Zuordnungen sind in /proc/devices
einsehbar . Die festen Geräte existieren noch in incude/uapi/linux/major.h
(kürzlich verschoben von include/major.h
)
Obwohl die Major:Minor-Kombination bestimmte Geräteinstanzen eindeutig identifiziert, hindert Sie nichts daran, mehrere Geräteknoten (Dateien) zu erstellen, die auf dasselbe Gerät verweisen. Sie müssen nicht einmal in /dev
erstellt werden (Aber sie müssen sich auf einem Dateisystem befinden, das das Erstellen von Geräteknoten unterstützt und nicht mit nodev
gemountet ist Option).
Eine übliche Verwendung ist das Erstellen doppelter Null-, Null- und Zufallsgeräte in einer 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
Die Namen sind nur Aliase, der Kernel kümmert sich nicht viel um die meisten Namen oder Orte, er kümmert sich um die Major-Nummer, damit er den richtigen Treiber auswählen kann, und der Treiber kümmert sich (normalerweise) um die Minor-Nummer, damit er den auswählen kann korrekte Instanz.
Verwandte:Englisch lernen – Wenn „strong“ nach einer Zahl verwendet wird, bezieht es sich auf genau diese Zahl oder auf eine ungefähre Zahl?
Die meisten Namen sind einfach Konvention (obwohl einige von POSIX definiert sind). Beachten Sie auch, dass sich ein Gerät für mehrere Hauptnummern registrieren kann, überprüfen Sie den sd
Treiber in /proc/devices
; einen Treibermodulnamen (.ko
) muss nicht mit dem Gerätenamen und nicht mit dem Geräteknoten in /dev
identisch sein , und ein einzelnes Treibermodul kann mehrere logische/physikalische Geräte oder Gerätenamen verwalten.
Zur Erinnerung:Möglicherweise haben Sie zwei oder mehr Geräteknoten (in /dev/
oder anderswo), die die gleichen Major:Minor-Nummern haben, aber wenn sie vom gleichen Typ sind, beziehen sie sich auf das gleiche Gerät. Sie können einen Treiber haben, der mehrere Hauptinstanzen verarbeiten kann, aber innerhalb des Kernels und innerhalb des Treibers wird für jeden Typ (Zeichen oder Block) die Major:Minor-Nummer verwendet, um sich auf ein bestimmtes Gerät (Major) und eine bestimmte Instanz zu beziehen ( Minor) des Geräts.
Sie können nicht zwei Geräteknoten mit demselben Typ und Major:Minor haben und erwarten, dass sie auf zwei verschiedene logische oder physische Geräte zugreifen. Wenn auf ein Gerät zugegriffen wird, wählt der Kernel basierend auf dem Typ und der Major-Nummer einen Treiber aus (und nicht basierend auf dem Geräteknotennamen), und per Konvention wählt die Minor-Nummer deterministisch eine bestimmte Instanz oder Unterfunktion aus.
Aktualisieren Etwas interessante Geschichte und einige *BSD-Perspektiven finden sich in Poul-Henning Kamps 2002 BSDCon Präsentation:https://www.usenix.org/legacy/events/bsdcon/full_papers/kamp/kamp_html/
Wenn Sie zurück ins Jahr 1978 springen (mit freundlicher Genehmigung von Alcatel-Lucent, dem Bell System Technical Journal Juli-Aug 1978) das „Unix Time Sharing System “ stellt es klar dar (S. 1937):
Geräte werden durch eine Hauptgerätenummer, eine Nebengerätenummer und eine Klasse (Block oder Zeichen) gekennzeichnet. Für jede Klasse gibt es eine Reihe von Einstiegspunkten in die Gerätetreiber. Die Hauptgerätenummer wird verwendet, um das Array zu indizieren, wenn der Code für einen bestimmten Gerätetreiber aufgerufen wird. Die untergeordnete Gerätenummer wird als Argument an den Gerätetreiber übergeben. Die Nebennummer hat keine andere Bedeutung als die ihr vom Fahrer zugeschriebene. Normalerweise verwendet der Treiber die Minor-Nummer, um auf eines von mehreren identischen physischen Geräten zuzugreifen.