/ Dev und seine Unterverzeichnisse und Dateien verstehen

51
$ ls -l /dev/stdin /dev/fd/0
lrwx------ 1 tim tim 64 2011-08-07 09:53 /dev/fd/0 -> /dev/pts/2
lrwxrwxrwx 1 root root 15 2011-08-06 08:14 /dev/stdin -> /proc/self/fd/0
$ ls -l /dev/pts/2 /proc/self/fd/0
crw--w---- 1 tim tty  136, 2 2011-08-07 09:54 /dev/pts/2
lrwx------ 1 tim tim     64 2011-08-07 09:54 /proc/self/fd/0 -> /dev/pts/2
  1. Ich habe mich gefragt, ob alle Dateien /devund deren Unterverzeichnisse Dateideskriptoren von Geräten sind.
  2. Warum gibt es so viele Links voneinander? Zum Beispiel /dev/fd/0, /dev/stdin, /proc/self/fd/0sind alle Links zu /dev/pts/2.
  3. Wenn lin lrwx------Mean Link, was bedeutet cin crw--w---- ?
Tim
quelle
3
Und um # 3 zu beantworten, steht das c für Character Device oder Character Special . b steht für Blockspecial .
Felixphew

Antworten:

77

Fast alle Dateien unter /devsind Gerätedateien . Während das Lesen und Schreiben in einer regulären Datei Daten auf einer Festplatte oder einem anderen Dateisystem speichert, kommuniziert der Zugriff auf eine Gerätedatei mit einem Treiber im Kernel, der im Allgemeinen wiederum mit einer Hardware (einem Hardwaregerät, daher der Name) kommuniziert.

Es gibt zwei Arten von Gerätedateien: Blockgeräte (angezeigt bals erstes Zeichen in der Ausgabe von ls -l) und Zeichengeräte (angezeigt durch c). Die Unterscheidung zwischen Block- und Zeichengeräten ist nicht ganz universell. Blockgeräte sind Dinge wie Festplatten, die sich wie große Dateien mit fester Größe verhalten: Wenn Sie ein Byte mit einem bestimmten Versatz schreiben und später mit diesem Versatz vom Gerät lesen, erhalten Sie dieses Byte zurück. Zeichengeräte sind fast alles andere, bei denen das Schreiben eines Bytes eine unmittelbare Auswirkung hat (z. B. wenn es auf einer seriellen Leitung ausgegeben wird) und das Lesen eines Bytes eine unmittelbare Auswirkung hat (z. B. wenn es von der seriellen Schnittstelle gelesen wird).

Die Bedeutung einer Gerätedatei wird durch ihre Nummer bestimmt, nicht durch ihren Namen (der Name ist für Anwendungen wichtig, nicht aber für den Kernel). Die Nummer besteht eigentlich aus zwei Nummern: Die Hauptnummer gibt an, welcher Treiber für dieses Gerät verantwortlich ist, und die untergeordnete Nummer ermöglicht es einem Fahrer, mehrere Geräte zu steuern¹. Diese Zahlen erscheinen in der ls -lListe, wo Sie normalerweise die Dateigröße finden würden. ZB brw-rw---- 1 root disk 8, 0 Jul 12 15:54 /dev/sda→ dieses Gerät ist Dur 8, Moll 0.

Einige Gerätedateien unter /deventsprechen nicht den Hardwaregeräten. Eines, das auf jedem Unix-System existiert, ist /dev/null: Das Schreiben darauf hat keine Auswirkung, und das Lesen darauf gibt keine Daten zurück. In Shell-Skripten ist es oft praktisch, wenn Sie die Ausgabe eines Befehls ( >/dev/null) ignorieren oder einen Befehl ohne Eingabe ( </dev/null) ausführen möchten . Andere gebräuchliche Beispiele sind /dev/zero(die null Bytes und unendlich zurückgeben ) /dev/urandom(die zufällige Bytes und unendlich zurückgeben ).

Einige Gerätedateien haben eine Bedeutung, die vom Prozess abhängt, der darauf zugreift. Zum Beispiel /dev/stdinbezeichnet die Standardeingabe des aktuellen Prozesses; Das Öffnen von hat ungefähr die gleiche Wirkung wie das Öffnen der Originaldatei, die als Standardeingabe für den Prozess geöffnet wurde. /dev/ttyBezeichnet in ähnlicher Weise das Terminal, an das der Prozess angeschlossen ist. Unter Linux werden heutzutage /dev/stdinund Freunde nicht als Zeichengeräte implementiert, sondern als symbolische Links zu einem allgemeineren Mechanismus, mit dem auf jeden Dateideskriptor verwiesen werden kann (im Gegensatz zu nur 0, 1 und 2 bei der herkömmlichen Methode). Zum Beispiel /dev/stdinist ein symbolischer Link zu /proc/self/fd/0. Siehe In welcher Beziehung steht / dev / fd zu / proc / self / fd /? .

Unter finden Sie eine Reihe symbolischer Links /dev. Dies kann aus historischen Gründen auftreten: Eine Gerätedatei wurde von einem Namen in einen anderen verschoben, einige Anwendungen verwenden jedoch weiterhin den alten Namen. Zum Beispiel /dev/scd0ist eine symbolische Verknüpfung zu /dev/sr0unter Linux; beide bezeichnen das erste CD-Gerät. Ein weiterer Grund für symbolische Verknüpfungen ist die Organisation: Unter Linux finden Sie Ihre Festplatten und Partitionen an mehreren Stellen: /dev/sdaund /dev/sda1und Freunde (jede Festplatte mit einem beliebigen Buchstaben und Partitionen entsprechend dem Partitionslayout), /dev/disk/by-id/*(Festplatten mit einem eindeutige Seriennummer) /dev/disk/by-label/*(Partitionen mit einem Dateisystem, gekennzeichnet durch ein vom Menschen gewähltes Etikett); und mehr. Symbolische Links werden auch verwendet, wenn ein generischer Gerätename einer von mehreren sein kann. zum Beispiel/dev/dvdDies kann eine symbolische Verknüpfung zu /dev/sr0oder eine Verknüpfung zu sein, /dev/sr1wenn Sie zwei CD-Leser haben und der zweite der Standard-DVD-Leser sein soll.

Schließlich gibt es noch ein paar andere Dateien, die Sie /devaus traditionellen Gründen möglicherweise unter finden . Sie werden nicht auf jedem System dasselbe finden. Bei den meisten Unices /dev/logist dies ein Socket , über den Programme Protokollnachrichten ausgeben. /dev/MAKEDEVist ein Skript, das Einträge in erstellt /dev. Auf modernen Linux-Systemen werden Einträge in /dev/automatisch durch udev erstellt und sind obsolet MAKEDEV.

¹ Unter Linux ist dies nicht mehr der Fall, aber dieses Detail ist nur für Gerätetreiber relevant.

Gilles 'SO - hör auf böse zu sein'
quelle
Vielen Dank! Meinen Sie mit "Die Bedeutung einer Gerätedatei wird durch ihre Nummer bestimmt" ihren Dateideskriptor?
Tim
@Tim: Nein, die Nummern erscheinen in einer ls -lListe, in der Sie normalerweise die Dateigröße vor dem Datum finden, z. B. brw-rw---- 1 root disk 8, 0 Jul 12 15:54 /dev/sda→ dieses Gerät ist Major 8, Minor 0. In der Praxis kommen Gerätenummern nicht oft vor, ich habe sie nur erwähnt, um es zu sagen Was macht ein Gerät zu einem Gerät (am wichtigsten ist es nicht der Dateiname). Eine Dateideskriptornummer hat nur in einem bestimmten Prozess eine Bedeutung.
Gilles 'SO - hör auf böse zu sein'
Nein, das Öffnen von /dev/stdin(=> /proc/self/fd/0) unter Linux hat nicht den gleichen Effekt wie das Duplizieren von Standardeingaben. Um den Unterschied zu sehen, su - non_root_userdann exec 5</dev/stdinwird scheitern mit „Zugriff verweigert“, aber exec 5<&0erfolgreich sein wird. Und es ist nicht nur , dass die neue fd mit verschiedenen Flaggen geöffnet werden, alles über das Dateiobjekt ( „Datei öffnet descrip tion “ in POSIX - Jargon) wird anders sein (Dateizeiger - Offset, non / Blockiermodus, usw.).
Mosvy
14
  1. Ja, entweder direkt oder als Symlink /dev/.
  2. Für verschiedene Zwecke: Manchmal ist es aus Gründen der Kompatibilität zwischen Benennungsschemata für die Arbeitsumgebung erforderlich - wie im Beispiel von /dev/stdin. Dies gilt nicht darauf statisch auf , /dev/pts/2oder jede andere - wechseln Sie einfach zu einem anderen Endgerät und Sie werden sehen. /dev/stdinist die Standardeingabe Ihrer aktuellen Terminalsitzung. Das ist auch ein Beispiel, warum es ein Symlink sein muss.
  3. Siehe man mknodund info coreutils 'mknod invocation'. Im Allgemeinen csteht für ein Zeichen Gerätetyp.
rozcietrzewiacz
quelle
3
"Standardeingabe Ihrer aktuellen Terminalsitzung" ist ein bisschen mehrdeutig. /dev/stdinbezieht sich auf die Standardeingabe des Prozesses, der ihn öffnet. Alles in /proc/$pidist prozessabhängig und /proc/selfeine Art magischer Link, der auf die eigenen Daten des Prozesses verweist.
Stéphane Gimenez
11

Bei Ihrer ersten Frage handelt es sich nicht um Dateideskriptoren, sondern um Gerätedateien. (auch bekannt als "Dev Nodes")

Diese Dateien sind an den Treiber gebunden, der das Gerät unter Verwendung von Haupt- und Nebennummern verarbeitet. (Beispielsweise lsbezieht sich "136, 2" in Ihrer Ausgabe auf den Gerätetreiber, der an die Hauptnummer 136 gebunden ist, und gibt Gerät 2 an, das von diesem Treiber verarbeitet wird.)

Der erste Ausgabebuchstabe von ls -list der Gerätetyp bei Gerätedateien. Wenn es 'c' ist, ist es ein Zeichengerät, oder wenn es 'b' ist, ist es ein Blockgerät.

Für Ihre zweite Frage beziehen Sie sich auf die obige Antwort von rozcietrzewiacz.

Herrscher
quelle
1
Der Link "Einführung in die Gerätetreiber" scheint nicht zu funktionieren.
Faultiere