GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Sind die Major- und Minor-Nummer eindeutig?

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

angezeigt

[…]

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.


Linux
  1. Begrenzung der Anzahl verbundener Clients auf einem VirtualHost in Apache

  2. Was sind die Worttrennzeichen von Readline?

  3. Ändern Sie die Standardportnummer des SSH-Servers

  4. So identifizieren Sie die Haupt- und Nebennummer für Blockgeräte in Unix

  5. Was sind die Unterschiede zwischen den wichtigsten Linux-Distributionen? Werde ich es bemerken?

So finden Sie die Portnummer eines Dienstes in Linux

5 Möglichkeiten, die Anzahl der Zeilen in einer Datei zu zählen

Was sind die Vorteile von CloudLinux?

Gerätenummer in der Ausgabe des Stat-Befehls

Wie sind Funktionen der dev_*()-Familie beim Debuggen des Linux-Kernels nützlich?

Zuordnung einer Gerätenummer zu einem logischen Gerätenamen