Jeder Geräteknoten unter /dev
hat ein eigenes Haupt- / Nebennummernpaar. Ich weiß, dass wir dieses Zahlenpaar wie folgt vom Geräteknoten abrufen können stat
:
stat -c 'major: %t minor: %T' <file>
Oder ls -l
zeigt auch diese Zahlen.
Aber wie können wir Geräteknoten durch gegebene Haupt- und Nebenzahlen erhalten? Der einzige Weg, den ich kenne, ist eine Art ls -l
+ awk
Trick, aber ich hoffe wirklich, dass es eine bessere Lösung gibt.
Antworten:
Ich habe einen einfacheren Ansatz mit dem Pseudofilesystem sys gefunden. Unter / sys / dev haben Sie die Geräte nach Typ und dann nach Major / Minor sortiert. Die Datei uevent enthält den Gerätenamen und eine Reihe weiterer Informationen.
So zum Beispiel
Echos,
Hinweis: Dies wurde in Debian Wheezy getestet
quelle
for file in $(ls /sys/dev/block/ ); do source /sys/dev/block/${file}/uevent; if [ "$DEVNAME" == "sda1" ] ; then echo ${file}; fi done;
Nicht sicher was du meinst.
Erstellt die
foo
als Blockgerät bezeichnete Gerätedatei mit Major 8 und Minor 0. Wenn Sie eine oder mehrere der Dateien/dev
mit demselben Typ, Major und Minor, suchen möchten, können Sie (mitzsh
) Folgendes tun :Für Blockgerät
8:0
:für char Gerät
226:0
:Beachten Sie, dass alles Dateien in erstellen kann
/dev
. Früher war es ein Skript, das dort statische Dateien erstellte. Irgendwann hatten Sie sogar ein spezielles Dateisystem à la/proc
.In modernen Linux-Versionen
udev
basiert es normalerweise auf Eingaben des Kernels.Der Name, den es für die Basisgerätedatei wählt, basiert auf dem
DEVNAME
vom Kernel bereitgestellten.udev
Regeln können dies ändern, tun dies jedoch im Allgemeinen nicht, und einigeudev
Regeln fügen der Einfachheit halber weitere Symlinks hinzu (wie die anderen/dev/disk/by...
).Sie können von Dur: Moll zu Kernel wechseln,
DEVNAME
indem Sie Folgendes betrachten:Sie können diese Informationen auch aus der
udev
Datenbank abrufen, wie mikeserv gezeigt hat.quelle
Anscheinend kann es einfacher gemacht werden
udevadm
, und ich habe gerade herausgefunden, wie.Um das
DEVNAME
vonudevadm
Ihnen zu bekommen , müssen Sie nur Folgendes tun:Wenn Sie beispielsweise den
/dev
Namen wissen möchten, für den/sys/dev/char/5:1
Sie Folgendes tun würden:AUSGABE
Die
-r
Option besteht darin, einen--root
ed-Pfad anzugeben - ohne diesen wäre das obige Ergebnis schreibgeschütztconsole
. Die-q
Option gibt eine Datenbank an--query
und nimmt hier den Operandenname
- weil wir das wollenDEVNAME
.Ein sehr einfaches Mittel, um den Pfad zu einem Zeichen- und / oder Blockgerät zu finden, wenn nur die Haupt-: Nebenzahlen wie folgt aussehen:
Also rennen:
druckt ...
Hier ist der erste, den ich geschrieben habe.
Dadurch wird nur die
udevadm info --export-db
Ausgabe nach übereinstimmenden Nummern durchsucht . Die Ausgabe sieht aus wie:Der Workflow ist wie folgt:
Versuchen Sie, die
[^=]*DEVNAME=
Zeichenfolge vom Kopf jeder Zeile zu entfernenWenn eine Zeile kein erstes Zeichen enthält oder das erste Zeichen
/
diese Zeile über dash
alte Leerzeichen kopiertWenn eine Zeile übereinstimmt,
MAJOR=
fügen Sie dieN
ext-Eingabezeile an den Musterbereich anWenn der Musterraum zwei Zeilen enthält, die übereinstimmen,
=$1\n.*=$2$
kopieren Sie denh
alten Raum über den Musterraum und drucken Sie ihn automatisch. Andernfalls löschen Sie den MusterbereichAlso wenn ich das tue:
AUSGABE
Wie @xae hervorhebt, können Geräte vom Typ Block / Char Maj: Min-Kombinationen gemeinsam nutzen, sodass möglicherweise mehr als ein Pfad pro Aufruf gedruckt wird.
quelle
Leider wurde die
/sys/dev
Hierarchie erst in 2.6.27 zum Kernel hinzugefügt ( vgl. Das relevante Commit für die Kernel-Codebasis), daher benötigen wir einen „gegabelten“ Ansatz.Lassen
$M
und$m
jeweils die Haupt- und Neben Anzahl unserer Gerätedatei sein.Post 2.6.27 Kernel
Wie von anderen vorgeschlagen, setzt der einfachste Ansatz die Leistung des
sysfs
„virtuellen“ Dateisystems frei, indem direkt nach Dateien gesucht wird, die$M:$m
unter dem Ordner benannt sind/sys/dev
(mehr als eine Datei ist zu erwarten, wenn wir nicht wissen, ob unser Gerät ein Zeichen ist). oder eine blockbasierte) und dann Beschaffung deruevent
Datei (in einer Unterschale, um eine Verschmutzung des Namespace zu verhindern):Kernel vor 2.6.27
Nehmen wir der Einfachheit halber an, dass unsere Datei ein Blockgerät ist (ein ähnlicher Ansatz gilt für Zeichengeräte). Wir werden in der
$M:$m
gesamten/sys/block
Hierarchie nach der Zeichenfolge suchen , indem wir (unter diesem Ordner) den Inhalt jeder Datei untersuchen, deren Name zufällig lautetdev
. Wenn/sys/block/<...>/<DEV>/dev
es sich um eine solche DateiDEV
handelt, muss dies der Name unseres Geräts sein:quelle
Unter Linux ist es möglich, bestimmte Dateien im
/proc
virtuellen Dateisystem zu nutzen.Die einfache Form des Musters liefert bereits Informationen über das gewünschte Gerät in der Ausgabe, es ist jedoch auch eine zusätzliche Filterung möglich, um nur eine bestimmte Zeichenfolge zu extrahieren.
quelle
Es gibt eine Bibliotheksfunktion:
makedev()
Bei gegebenen Haupt- und Nebengeräte-IDs kombiniert makedev () diese, um eine Geräte-ID zu erstellen, die als Funktionsergebnis zurückgegeben wird.
Weitere Informationen finden Sie unter: http://man7.org/linux/man-pages/man3/major.3.html
quelle