Sind die major, minor
Nummern eindeutig?
Haben wir Zitate und Hinweise 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
Antworten:
Von der Linux Programming Interface , §14.1
Siehe auch dieses alte Kapitel (2001) Linux Device Drivers (2e) .
Das heißt, es ist beabsichtigt, für jeden Gerätetyp eine eindeutige Zuordnung von major: minor zu device: instance bereitzustellen. Streng genommen Sie können zwei verschiedene Geräte mit dem gleichen Haupt: minor, solange ein Zeichen ist und man ist Block:
Unter Linux sind zu jedem Zeitpunkt auf einem System die Haupt-: Nebenzahlen für jeden Gerätetyp eindeutig. Die Zahlen können sich jedoch im Laufe der Zeit ändern und müssen auf verschiedenen Linux-Systemen (sogar auf derselben Distribution, demselben Kernel und derselben Hardware) nicht gleich sein. Beachten Sie, dass Zeichen- und Blockgeräte unterschiedliche Nummerierungsräume haben, z. B. wird Block-Major 1 RAM-Datenträgern zugewiesen, Char-Major 1 wird einer Reihe von Kernel-Geräten zugewiesen, einschließlich Null und Null.
In der Vergangenheit wurden Geräte-Majors (meistens) statisch über eine Registrierung zugewiesen (die in der Kernel-Quelle ebenfalls noch vorhanden ist, obwohl sie nicht verwaltet wird
Documentation/devices.txt
). Heutzutage werden viele Geräte dynamisch zugewiesen, dies wird von udev verwaltet und die Zuordnungen können in angezeigt werden/proc/devices
. Die festen Geräte sind noch vorhanden inincude/uapi/linux/major.h
(kürzlich verschoben voninclude/major.h
)Obwohl die Kombination major: minor 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 erstellt werden
/dev
(sie müssen sich jedoch in einem Dateisystem befinden, das das Erstellen von Geräteknoten unterstützt und nicht mit dernodev
Option bereitgestellt wird).Eine häufige Verwendung ist das Erstellen doppelter Null-, Null- und Zufallsgeräte in einer Chroot:
Die Namen sind nur Aliase, der Kernel kümmert sich nicht viel um die meisten Namen oder Speicherorte, er kümmert sich um die Hauptnummer, damit er den richtigen Treiber auswählen kann, und der Treiber kümmert sich (normalerweise) um die Nebennummer, damit er die auswählen kann richtige Instanz.
Die meisten Namen sind einfach Konventionen (obwohl einige von POSIX definiert werden ). Beachten Sie auch, dass sich ein Gerät möglicherweise für mehrere Hauptnummern registriert. Checken Sie den
sd
Treiber ein/proc/devices
. Ein Treibermodulname (.ko
) muss nicht mit dem Gerätenamen und nicht mit dem Geräteknoten identisch sein/dev
, und ein einzelnes Treibermodul kann mehrere logische / physische Geräte oder Gerätenamen verwalten.Um es noch einmal zusammenzufassen: Sie haben möglicherweise zwei oder mehr Geräteknoten (in
/dev/
oder anderswo), die die gleichen Haupt-: Nebennummern haben, aber wenn sie vom gleichen Typ sind, beziehen sie sich auf dasselbe 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 (char oder block) die Nummer major: minor verwendet, um auf ein bestimmtes Gerät (major) und eine bestimmte Instanz ( Moll) des Geräts.Sie können nicht zwei Geräteknoten mit demselben Typ und Major haben: Minor und erwarten, dass sie auf zwei verschiedene logische oder physische Geräte zugreifen. Wenn auf ein Gerät zugegriffen wird, wählt der Kernel einen Treiber basierend auf dem Typ und der Hauptnummer (und nicht basierend auf dem Namen des Geräteknotens) aus, und gemäß Konvention wählt die Nebennummer deterministisch eine bestimmte Instanz oder Unterfunktion aus.
Update Eine interessante Geschichte und eine * BSD-Perspektive finden Sie in der BSDCon- Präsentation 2002 von Poul-Henning Kamp : https://www.usenix.org/legacy/events/bsdcon/full_papers/kamp/kamp_html/
Wenn Sie in die Zeit von 1978 zurückspringen (mit freundlicher Genehmigung von Alcatel-Lucent, dem Bell System Technical Journal, Juli-August 1978), wird dies im „ Unix Time Sharing System “ klar dargelegt (S. 1937):
quelle
MAJ:Min
Wenn eine Gerätedatei von erstellt wird
mknode
, werden diemajor
undminor
-Nummern angegeben. Auf diese Weise identifiziert Linux das zugrunde liegende Hardwaregerät, das einer Gerätedatei zugeordnet ist. In den meisten Fällenmajor
identifiziert die Nummer den Treiber, währendminor
die verschiedenen Geräte, die der Treiber steuert, unterschieden werden.Daher müssen die Nummern für jedes Gerät eindeutig sein, da sonst nicht für alle Geräte die richtigen Gerätedateien erstellt werden können.
quelle
Nein, unter Linux sind sie nicht immer eindeutig.
Linux verwendet ein
devpts
virtuelles Dateisystem, um Pseudoterminals (ptys) bereitzustellen, und dieses virtuelle Dateisystem kann mehrmals und an verschiedenen Stellen bereitgestellt werden. Dies ist praktisch, wenn Chroots oder Namespace-Container eingerichtet werden. Während einmajor:minor
Tupel auf einerdevpts
Dateisysteminstanz eindeutig ist , ist es auf einem laufenden System nicht eindeutig:Im obigen Beispiel
script(1)
erstellt der Befehl ein Pseudo-Terminal und führt darin eine Shell aus. Es ist verdammt offensichtlich, dass das vom erstenscript
Prozess erzeugte Pseudo-Terminal nicht das gleiche ist wie das vom zweiten, aber sie haben den gleichen Namen und die gleichen Haupt- und Nebenzahlen.Um ein Pseudoterminal eindeutig zu identifizieren, müssen Sie dessen
device:inode
Tupel verwenden oder die Gerätenummer (des devpts-Dateisystems) mit ihrem kombinierenmajor:minor
. Das Problem ist, dass das "tty" -Feld des/proc/PID/stat
(7., sieheproc(5)
Manpage; dort mögen Toolslsof
oderps
erhalten ihre Informationen) nur dasst_rdev
des tty (das gepacktemajor:minor
) enthält; Wenn dies ein Pty-Slave ist, gibt es keinen Hinweis auf dasdevpts
Dateisystem, das ihn bereitstellt. Die gleichen Probleme betreffen die Gerätenummer, die mit demTIOCGDEV
ioctl erhältlich ist.AFAICS Es gibt keine zuverlässige Möglichkeit, das steuernde Terminal eines Prozesses unter Linux zu identifizieren. Korrekturen und Anregungen ansonsten willkommen!
quelle