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

/dev und seine Unterverzeichnisse und Dateien verstehen

Fast alle Dateien unter /dev sind Gerätedateien. Während das Lesen und Schreiben in eine normale 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 einem Stück Hardware (einem Hardwaregerät, daher der Name) kommuniziert /P>

Es gibt zwei Arten von Gerätedateien:Blockgeräte (gekennzeichnet durch b als 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 an einem bestimmten Offset schreiben und später an diesem Offset vom Gerät lesen, erhalten Sie dieses Byte zurück. Zeichengeräte sind so ziemlich alles andere, wo das Schreiben eines Bytes eine unmittelbare Auswirkung hat (z. B. wird es auf einer seriellen Leitung ausgegeben) und das Lesen eines Bytes ebenfalls eine unmittelbare Auswirkung hat (z. B. wird es von der seriellen Schnittstelle gelesen).

Die Bedeutung einer Gerätedatei wird durch ihre Nummer bestimmt, nicht durch ihren Namen (der Name spielt für Anwendungen eine Rolle, aber nicht für den Kernel). Die Nummer besteht eigentlich aus zwei Nummern:Die Major-Nummer gibt an, welcher Treiber für dieses Gerät zuständig ist, und die Minor-Nummer ermöglicht es einem Treiber, mehrere Geräte zu steuern¹. Diese Nummern erscheinen in ls -l Auflistung, wo Sie normalerweise die Dateigröße finden würden. Z.B. brw-rw---- 1 root disk 8, 0 Jul 12 15:54 /dev/sda → Dieses Gerät ist Major 8, Minor 0.

Einige Gerätedateien unter /dev entsprechen nicht Hardwaregeräten. Eines, das auf jedem Unix-System existiert, ist /dev/null; das Schreiben darauf hat keine Wirkung, und das Lesen von ihm gibt niemals Daten zurück. In Shell-Skripten ist es oft praktisch, wenn Sie die Ausgabe eines Befehls ignorieren möchten (>/dev/null ) oder einen Befehl ohne Eingabe ausführen (</dev/null ). Andere gängige Beispiele sind /dev/zero (was Null-Bytes ad infinitum zurückgibt ) /dev/urandom (was zufällige Bytes ad infinitum zurückgibt ).

Einige Gerätedateien haben eine Bedeutung, die von dem Prozess abhängt, der darauf zugreift. Beispiel:/dev/stdin bezeichnet die Standardeingabe des aktuellen Prozesses; Das Öffnen von hat ungefähr den gleichen Effekt wie das Öffnen der Originaldatei, die als Standardeingabe des Prozesses geöffnet wurde. Etwas ähnlich, /dev/tty bezeichnet das Terminal, an dem der Prozess angeschlossen ist. Unter Linux heutzutage /dev/stdin und Freunde werden nicht als Zeichengeräte implementiert, sondern als symbolische Links zu einem allgemeineren Mechanismus, der es ermöglicht, auf jeden Dateideskriptor zu verweisen (im Gegensatz zu nur 0, 1 und 2 bei der traditionellen Methode); zum Beispiel /dev/stdin ist ein symbolischer Link zu /proc/self/fd/0 . Siehe Wie verhält sich /dev/fd zu /proc/self/fd/?.

Unter /dev finden Sie einige symbolische Links . Dies kann aus historischen Gründen auftreten:Eine Gerätedatei wurde von einem Namen auf einen anderen verschoben, aber einige Anwendungen verwenden immer noch den alten Namen. Beispiel:/dev/scd0 ist ein symbolischer Link zu /dev/sr0 unter Linux; beide bezeichnen das erste CD-Gerät. Ein weiterer Grund für symbolische Links ist die Organisation:Unter Linux finden Sie Ihre Festplatten und Partitionen an mehreren Stellen:/dev/sda und /dev/sda1 und Freunde (jede Festplatte mit einem beliebigen Buchstaben bezeichnet und Partitionen entsprechend dem Partitionslayout), /dev/disk/by-id/* (Festplatten mit eindeutiger Seriennummer), /dev/disk/by-label/* (Partitionen mit einem Dateisystem, gekennzeichnet durch ein vom Menschen gewähltes Label); und mehr. Symbolische Links werden auch verwendet, wenn ein generischer Gerätename einer von mehreren sein könnte; zum Beispiel /dev/dvd könnte ein symbolischer Link zu /dev/sr0 sein , oder es könnte ein Link zu /dev/sr1 sein wenn Sie zwei CD-Lesegeräte haben und das zweite das Standard-DVD-Lesegerät sein soll.

Schließlich gibt es noch ein paar andere Dateien, die Sie unter /dev finden könnten , aus traditionellen Gründen. Sie werden nicht auf jedem System dasselbe finden. Auf den meisten Unices /dev/log ist ein Socket, den Programme verwenden, um Protokollmeldungen auszugeben. /dev/MAKEDEV ist ein Skript, das Einträge in /dev erstellt . Auf modernen Linux-Systemen Einträge in /dev/ werden automatisch von udev erstellt und machen MAKEDEV überflüssig .

¹ Dies trifft unter Linux eigentlich nicht mehr zu, aber dieses Detail ist nur für Gerätetreiber-Autoren von Bedeutung.


  1. Ja - entweder direkt oder als Symlinks - das ist /dev/ ist für.
  2. Für verschiedene Zwecke:manchmal für die Kompatibilität zwischen Namensschemata, manchmal ist es für die Arbeitsumgebung notwendig - wie im Beispiel von /dev/stdin . Dies nicht Punkt statisch bis /dev/pts/2 oder ein anderes - wechseln Sie einfach zu einem anderen Terminal und Sie werden sehen. /dev/stdin ist die Standardeingabe Ihres aktuellen Terminalsitzung. Das ist auch ein Beispiel dafür, warum es ein Symlink sein muss.
  3. Siehe man mknod und info coreutils 'mknod invocation' . Im Allgemeinen c steht für einen Zeichengerätetyp.

Für Ihre erste Frage, es handelt sich nicht um Dateideskriptoren, sondern um Gerätedateien. (auch bekannt als "Entwicklungsknoten")

Diese Dateien sind mit dem Treiber verbunden, der das Gerät mit Major- und Minor-Nummern verwaltet. (Zum Beispiel "136, 2" in Ihrem ls Ausgabe bezieht sich auf den Gerätetreiber, der an die Major-Nummer 136 gebunden ist, und gibt Gerät Nr. 2 an, das von diesem Treiber verwaltet wird.)

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

Beziehen Sie sich für Ihre zweite Frage auf die obige Antwort von rozcietrzewiacz.


Linux
  1. Linux:Unterschied zwischen /dev/console , /dev/tty und /dev/tty0?

  2. Bash =~ Regex und Https://regex101.com/?

  3. So erstellen Sie LVM-Gerätedateien im /dev-Verzeichnis mit vgmknodes neu

  4. Linux:Unterschied zwischen /dev/console , /dev/tty und /dev/tty0

  5. Kernel:/dev/kmem und /dev/mem deaktivieren

Die Dateien /proc/mounts, /etc/mtab und /proc/partitions verstehen

Was sind /dev/zero- und /dev/null-Dateien in Linux

Wie kann /dev/random oder /dev/urandom mit base64 codiert werden?

Wann sollte ich /dev/shm/ verwenden und wann sollte ich /tmp/?

Wie Linux /dev/tty und /dev/tty0 verwendet

Erstellen Sie ein virtuelles Blockgerät, das in /dev/null schreibt