Gerätedatei: Unterschied zwischen den Versionen

Aus Foxwiki
 
(3 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 2: Zeile 2:


== Beschreibung ==
== Beschreibung ==
'''Gerätedateien''' (device file) sind spezielle [[Datei]]en, die unter fast allen [[Unix-Derivat]]en und vielen anderen [[Betriebssystem]]en genutzt werden. Sie ermöglichen eine einfache Kommunikation zwischen [[Userspace]], zum Beispiel gewöhnlichen [[Anwenderprogramm]]en, und dem [[Kernel (Betriebssystem)|Kernel]] und damit letztlich der [[Hardware]] eines [[Computer]]s. Diese Kommunikation ist [[Transparenz (Computersystem)|transparent]], da Gerätedateien wie normale Dateien verwendet werden.
'''Gerätedateien''' (device file) sind spezielle [[Datei]]en, die unter fast allen [[Unix-Derivat]]en und vielen anderen [[Betriebssystem]]en genutzt werden.  
* Sie ermöglichen eine einfache Kommunikation zwischen [[Userspace]], zum Beispiel gewöhnlichen [[Anwenderprogramm]]en, und dem [[Kernel (Betriebssystem)|Kernel]] und damit letztlich der [[Hardware]] eines [[Computer]]s.  
* Diese Kommunikation ist [[Transparenz (Computersystem)|transparent]], da Gerätedateien wie normale Dateien verwendet werden.


== Gerätedateien unter Unix ==
== Gerätedateien unter Unix ==
=== Typen von Gerätedateien ===
=== Typen von Gerätedateien ===
Die [[Dateisystem]]e von [[Unix]]- und [[Unixoides Betriebssystem|ähnlichen Betriebssystemen]] unterscheiden zwischen „normalen“ [[Datei]]en (binär/ASCII), [[Verzeichnis]]sen, [[Named Pipe]]s (auch [[FIFO]]s genannt), [[Symbolische Verknüpfung]]en, [[Socket (Software)|Sockets]] und [[Datenblock|Datenblöcken]]. Während „normale“ Dateien und Verzeichnisse zum Standardfunktionsumfang gewöhnlicher Dateisysteme gehören, spielen bereits Named Pipes eine Sonderrolle, zählen aber nicht zu den Gerätedateien. Erst bei den letzten drei Typen handelt es sich um Gerätedateien.  
Die [[Dateisystem]]e von [[Unix]]- und [[Unixoides Betriebssystem|ähnlichen Betriebssystemen]] unterscheiden zwischen „normalen“ [[Datei]]en (binär/ASCII), [[Verzeichnis]]sen, [[Named Pipe]]s (auch [[FIFO]]s genannt), [[Symbolische Verknüpfung]]en, [[Socket (Software)|Sockets]] und [[Datenblock|Datenblöcken]].  
* Während „normale“ Dateien und Verzeichnisse zum Standardfunktionsumfang gewöhnlicher Dateisysteme gehören, spielen bereits Named Pipes eine Sonderrolle, zählen aber nicht zu den Gerätedateien.  
* Erst bei den letzten drei Typen handelt es sich um Gerätedateien.


; Typen von Gerätedateien
; Typen von Gerätedateien
Zeile 15: Zeile 19:
Zur Ausgabe des Typs einer (Geräte-)Datei eignen sich Befehle wie <code>[[ls (Unix)|ls]]</code> oder <code>[[file]]</code>.
Zur Ausgabe des Typs einer (Geräte-)Datei eignen sich Befehle wie <code>[[ls (Unix)|ls]]</code> oder <code>[[file]]</code>.


[[Datei:Konqueror dev.png|mini|<code>/dev</code> im Dateisystembrowser [[Konqueror]]. Zu sehen sind die [[Icon (Computer)|Icons]] der vielen verschiedenen Gerätedateien]]
[[Datei:Konqueror dev.png|mini|<code>/dev</code> im Dateisystembrowser [[Konqueror]].  
Da meist für jedes Gerät eine eigene Gerätedatei existiert, sammelte man bereits in frühen Versionen von Unix diese Dateien im Verzeichnis <code>/dev</code>. Mit dem [[Filesystem Hierarchy Standard]] ist dieses Vorgehen für Linux standardisiert worden ([[Solaris (Betriebssystem)|Solaris]] führt die Gerätedateien unter dem virtuellen Dateisystem in <code>/devices</code> und generiert automatisiert Symlinks die von <code>/dev</code> zu den eigentlichen Dateien in <code>/devices</code> zeigen), ferner ist vorgeschrieben, welche Gerätedateien in diesem Verzeichnis unter welchem Namen existieren müssen (siehe dazu die Listen weiter unten). Moderne Unix-Derivate benutzen oft spezielle (virtuelle) Dateisysteme, um dieses Verzeichnis aktuell zu halten. Unter [[Linux]] war dafür lange Zeit [[devfs]] populär, mittlerweile sorgt [[udev]] für die Verwaltung der Gerätedateien.
* Zu sehen sind die [[Icon (Computer)|Icons]] der vielen verschiedenen Gerätedateien]]
Da meist für jedes Gerät eine eigene Gerätedatei existiert, sammelte man bereits in frühen Versionen von Unix diese Dateien im Verzeichnis <code>/dev</code>.  
* Mit dem [[Filesystem Hierarchy Standard]] ist dieses Vorgehen für Linux standardisiert worden ([[Solaris (Betriebssystem)|Solaris]] führt die Gerätedateien unter dem virtuellen Dateisystem in <code>/devices</code> und generiert automatisiert Symlinks die von <code>/dev</code> zu den eigentlichen Dateien in <code>/devices</code> zeigen), ferner ist vorgeschrieben, welche Gerätedateien in diesem Verzeichnis unter welchem Namen existieren müssen (siehe dazu die Listen weiter unten).  
* Moderne Unix-Derivate benutzen oft spezielle (virtuelle) Dateisysteme, um dieses Verzeichnis aktuell zu halten.  
* Unter [[Linux]] war dafür lange Zeit [[devfs]] populär, mittlerweile sorgt [[udev]] für die Verwaltung der Gerätedateien.


Gerätedateien werden als Schnittstelle zwischen [[Gerätetreiber]]n oder Systemkomponenten und [[Anwendungsprogramm]]en, die im [[Userspace]] ablaufen, genutzt. So druckt man beispielsweise auf einem [[LPT]]-Drucker, der über die [[parallele Schnittstelle]] an den Computer angeschlossen ist, indem man Text direkt in die Gerätedatei <code>/dev/lp0</code> schreibt. Durch das Konzept der Gerätedateien sind Programme prinzipiell von den Gerätetreibern, die im Kernel agieren, getrennt. Außerdem erscheint die Benutzung eines Gerätes völlig transparent – man muss nicht erst ein spezielles Programm nutzen, sondern kann in eine Datei schreiben, die quasi dem Drucker entspricht. Dies ermöglicht eine intuitive Benutzung der Hardware.
Gerätedateien werden als Schnittstelle zwischen [[Gerätetreiber]]n oder Systemkomponenten und [[Anwendungsprogramm]]en, die im [[Userspace]] ablaufen, genutzt.  
* So druckt man beispielsweise auf einem [[LPT]]-Drucker, der über die [[parallele Schnittstelle]] an den Computer angeschlossen ist, indem man Text direkt in die Gerätedatei <code>/dev/lp0</code> schreibt.  
* Durch das Konzept der Gerätedateien sind Programme prinzipiell von den Gerätetreibern, die im Kernel agieren, getrennt.  
* Außerdem erscheint die Benutzung eines Gerätes völlig transparent – man muss nicht erst ein spezielles Programm nutzen, sondern kann in eine Datei schreiben, die quasi dem Drucker entspricht.  
* Dies ermöglicht eine intuitive Benutzung der Hardware.


Das Konzept der Gerätedateien ist eine der Grundlagen für den Unix-Grundsatz ''[[Everything is a file|Alles ist eine Datei]]'' und wurde beispielsweise mit Ansätzen wie dem Derivat [[Plan 9 (Betriebssystem)|Plan 9]] ausgebaut.
Das Konzept der Gerätedateien ist eine der Grundlagen für den Unix-Grundsatz ''[[Everything is a file|Alles ist eine Datei]]'' und wurde beispielsweise mit Ansätzen wie dem Derivat [[Plan 9 (Betriebssystem)|Plan 9]] ausgebaut.


==== Blockorientierte Geräte ====
==== Blockorientierte Geräte ====
Blockorientierte Geräte (auch Blockspeichergerät, Blockgerät oder [[Englische Sprache|engl.]] ''{{lang|en|block device}}'') übertragen Daten in [[Datenblock|Datenblöcken]] und werden daher oft für [[parallele Datenübertragung]]en genutzt. Alle diese Geräte nutzen den betriebssystemeigenen [[Puffer (Informatik)|Puffer]].
Blockorientierte Geräte (auch Blockspeichergerät, Blockgerät oder [[Englische Sprache|engl.]] ''{{lang|en|block device}}'') übertragen Daten in [[Datenblock|Datenblöcken]] und werden daher oft für [[parallele Datenübertragung]]en genutzt.  
* Alle diese Geräte nutzen den betriebssystemeigenen [[Puffer (Informatik)|Puffer]].


{| class="wikitable" style="text-align:center;"
{| class="wikitable" style="text-align:center;"
|+ Beispiele von Dateinamen für blockorientierte Geräte
|+ Beispiele von Dateinamen für blockorientierte Geräte
|-
|-
! Beschreibung des Geräts || [[Linux]] || [[FreeBSD]] || [[NetBSD]]/[[OpenBSD]] || [[macOS]] || [[Solaris (Betriebssystem)|Solaris]]
! Beschreibung des Geräts || [[Linux]]  
|-
|-
|style="text-align:left;"| 1.&nbsp;[[Diskettenlaufwerk]]
|style="text-align:left;"| 1.&nbsp;[[Diskettenlaufwerk]]
| <code>fd0</code>
| <code>fd0</code>
|
|
|
|
|-
|-
|style="text-align:left;"| [[Integrated Drive Electronics|IDE]]-[[Massenspeicher|Festplatte]] oder IDE-[[CD-ROM-Laufwerk]] am 1.&nbsp;Anschluss [[Master/Slave|Master]] (in [[Linux]])
|style="text-align:left;"| [[Integrated Drive Electronics|IDE]]-[[Massenspeicher|Festplatte]] oder IDE-[[CD-ROM-Laufwerk]] am 1.&nbsp;Anschluss [[Master/Slave|Master]] (in [[Linux]])
| <code>hda</code>
| <code>hda</code>
| <code>ad0</code>
| <code>wd0</code>
|
|
|-
|-
|style="text-align:left;"| IDE-Festplatte oder IDE-CD-ROM-Laufwerk am 1.&nbsp;Anschluss [[Master-Slave|Slave]]
|style="text-align:left;"| IDE-Festplatte oder IDE-CD-ROM-Laufwerk am 1.&nbsp;Anschluss [[Master-Slave|Slave]]
| <code>hdb</code>
| <code>hdb</code>
| <code>ad1</code>
|
|
|
|-
|-
|style="text-align:left;"| 1.&nbsp;primäre [[Partition (Datenträger)|Partition]] der ersten IDE-Platte
|style="text-align:left;"| 1.&nbsp;primäre [[Partition (Datenträger)|Partition]] der ersten IDE-Platte
| <code>hda1</code>
| <code>hda1</code>
|
|
|
|
|-
|-
|style="text-align:left;"| 15.&nbsp;logische Partition der ersten IDE-Platte
|style="text-align:left;"| 15.&nbsp;logische Partition der ersten IDE-Platte
| <code>hda15</code>
| <code>hda15</code>
|
|
|
|
|-
|-
|style="text-align:left;"| 1.&nbsp;[[Partition (Datenträger)#Konzepte der Partitionierungen|Slice]] der ersten IDE-Platte
|style="text-align:left;"| 1.&nbsp;[[Partition (Datenträger)#Konzepte der Partitionierungen|Slice]] der ersten IDE-Platte
|
| <code>ad0s1</code>
|
|
|
|
|-
|-
|style="text-align:left;"| 15.&nbsp;Slice der ersten IDE-Platte
|style="text-align:left;"| 15.&nbsp;Slice der ersten IDE-Platte
|
| <code>ad0s15</code>
|
|
|
|
|-
|-
|style="text-align:left;"| 1.&nbsp;Partition im 1.&nbsp;Slice der ersten IDE-Platte
|style="text-align:left;"| 1.&nbsp;Partition im 1.&nbsp;Slice der ersten IDE-Platte
|
| <code>ad0s1a</code>
|
|
|
|
|-
|-
|style="text-align:left;"| 2.&nbsp;Partition im 1.&nbsp;Slice der ersten IDE-Platte
|style="text-align:left;"| 2.&nbsp;Partition im 1.&nbsp;Slice der ersten IDE-Platte
|
| <code>ad0s1b</code>
|
|
|
|
|-
|-
|style="text-align:left;"| IDE-[[CD-ROM-Laufwerk]] am 1.&nbsp;Anschluss Master
|style="text-align:left;"| IDE-[[CD-ROM-Laufwerk]] am 1.&nbsp;Anschluss Master
|
| <code>acd0</code>
|
|
|
|
|-
|-
|style="text-align:left;"| IDE-CD-ROM-Laufwerk am 1.&nbsp;Anschluss Slave
|style="text-align:left;"| IDE-CD-ROM-Laufwerk am 1.&nbsp;Anschluss Slave
|
| <code>acd1</code>
|
|
|
|
|-
|-
|style="text-align:left;"| 1.&nbsp;SCSI-CD-ROM-Laufwerk
|style="text-align:left;"| 1.&nbsp;SCSI-CD-ROM-Laufwerk
| <code>scd0</code>
| <code>scd0</code>
| <code>cd0</code>
|
|
|
|-
|-
|style="text-align:left;"| [[Small Computer System Interface|SCSI]]-(Wechsel-)Platte, kleinste SCSI-ID
|style="text-align:left;"| [[Small Computer System Interface|SCSI]]-(Wechsel-)Platte, kleinste SCSI-ID
| <code>sda</code>
| <code>sda</code>
|
|
| <code>disk0</code>
|
|-
|-
|style="text-align:left;"| [[SCSI]]-(Wechsel-)Platte, nächstgrößere SCSI-ID
|style="text-align:left;"| [[SCSI]]-(Wechsel-)Platte, nächstgrößere SCSI-ID
| <code>sdb</code>
| <code>sdb</code>
|
|
| <code>disk1</code>
|
|-
|-
|style="text-align:left;"| 1.&nbsp;primäre Partition der ersten SCSI-(Wechsel-)Platte
|style="text-align:left;"| 1.&nbsp;primäre Partition der ersten SCSI-(Wechsel-)Platte
| <code>sda1</code>
| <code>sda1</code>
|
|
| <code>disk0s0</code>
|
|-
|-
|style="text-align:left;"| 11.&nbsp;logische Partition der ersten SCSI-(Wechsel-)Platte
|style="text-align:left;"| 11.&nbsp;logische Partition der ersten SCSI-(Wechsel-)Platte
| <code>sda15</code>
| <code>sda15</code>
|
|
|
|
|-
|-
|style="text-align:left;"| SCSI-(Wechsel-)Platte, kleinste SCSI-ID
|style="text-align:left;"| SCSI-(Wechsel-)Platte, kleinste SCSI-ID
|
| <code>da0</code>
|
| <code>disk0</code>
|
|
|-
|-
|style="text-align:left;"| 5.&nbsp;Partition im 2.&nbsp;Slice der 2.&nbsp;SCSI-(Wechsel-)Platte
|style="text-align:left;"| 5.&nbsp;Partition im 2.&nbsp;Slice der 2.&nbsp;SCSI-(Wechsel-)Platte
|
| <code>da1s2e</code>
|
|
|
|
|-
|-
|style="text-align:left;"| am ''C''-ten SCSI-[[Controller (Hardware)|Controller]] mit SCSI-ID=''T'' die ''D''-te Festplatte und auf ihr das ''S''-te Slice
|style="text-align:left;"| am ''C''-ten SCSI-[[Controller (Hardware)|Controller]] mit SCSI-ID=''T'' die ''D''-te Festplatte und auf ihr das ''S''-te Slice
|
|
|
|
|
| <code>c''C''t''T''d''D''s''S''</code>
|-
|-
|style="text-align:left;"| [[symbolische Verknüpfung]] auf CD-ROM-Laufwerk
|style="text-align:left;"| [[symbolische Verknüpfung]] auf CD-ROM-Laufwerk
| <code>cdrom</code>
| <code>cdrom</code>
|
|
|
|
|-
|-
|style="text-align:left;"| Der erste Namespace des ersten registrierten [[NVMe]]-Geräts
|style="text-align:left;"| Der erste Namespace des ersten registrierten [[NVMe]]-Geräts
|<code>nvme0n1</code>
|<code>nvme0n1</code>
|
|
|
|
|-
|-
|style="text-align:left;"| Die erste Partition des ersten Namespaces des ersten registrierten [[NVMe]]-Geräts
|style="text-align:left;"| Die erste Partition des ersten Namespaces des ersten registrierten [[NVMe]]-Geräts
|<code>nvme0n1p1</code>
|<code>nvme0n1p1</code>
|
|
|
|
|}
|}


==== Zeichenorientierte Geräte ====
==== Zeichenorientierte Geräte ====
Zeichenorientierte Geräte übertragen nur ein Zeichen (typischerweise ein [[Byte]]) zur selben Zeit, sind also der [[Serielle Datenübertragung|seriellen Datenübertragung]] zuzusprechen. Meist, aber nicht immer, werden Daten ungepuffert – also sofort – übertragen.
Zeichenorientierte Geräte übertragen nur ein Zeichen (typischerweise ein [[Byte]]) zur selben Zeit, sind also der [[Serielle Datenübertragung|seriellen Datenübertragung]] zuzusprechen.  
* Meist, aber nicht immer, werden Daten ungepuffert – also sofort – übertragen.


{| class="wikitable" style="text-align:center;"
{| class="wikitable" style="text-align:center;"
|+ Beispiele von Dateinamen für zeichenorientierte Geräte
|+ Beispiele von Dateinamen für zeichenorientierte Geräte
|-
|-
! Beschreibung des Geräts || [[Linux]] || [[DOS]]/[[Microsoft Windows|Windows]] || [[macOS]]
! Beschreibung des Geräts || [[Linux]]  
|-
|-
|style="text-align:left;"| 1.&nbsp;[[Serielle Schnittstelle]]
|style="text-align:left;"| 1.&nbsp;[[Serielle Schnittstelle]]
| <code>ttyS0</code>
| <code>ttyS0</code>
| <code>COM</code>
|
|-
|-
|style="text-align:left;"| 1.&nbsp;[[Parallele Schnittstelle]]
|style="text-align:left;"| 1.&nbsp;[[Parallele Schnittstelle]]
| <code>lp0</code>
| <code>lp0</code>
| <code>LPT1</code>
|
|-
|-
|style="text-align:left;"| 2.&nbsp;Parallele Schnittstelle
|style="text-align:left;"| 2.&nbsp;Parallele Schnittstelle
| <code>lp1</code>
| <code>lp1</code>
| <code>LPT2</code>
|
|-
|-
|style="text-align:left;"| symbolische Verknüpfungen für [[Pseudoterminal]]s
|style="text-align:left;"| symbolische Verknüpfungen für [[Pseudoterminal]]s
| <code>tty<em>X</em></code>
| <code>tty<em>X</em></code>
|
|
|-
|-
|style="text-align:left;"| Gerätedateien für USB-Geräte sowie alle virtuellen Gerätedateien
|style="text-align:left;"| Gerätedateien für USB-Geräte sowie alle virtuellen Gerätedateien
| <code>usbdev1.1</code>
| <code>usbdev1.1</code>
|
|
|-
|-
|style="text-align:left;"| symbolische Verknüpfung auf [[Maus (Computer)|Maus]]-Gerätedatei
|style="text-align:left;"| symbolische Verknüpfung auf [[Maus (Computer)|Maus]]-Gerätedatei
| <code>mouse</code>
| <code>mouse</code>
|
|
|-
|-
|style="text-align:left;"| Datei eines [[Framebuffer]]s (z.&nbsp;B.&nbsp;Monitor)
|style="text-align:left;"| Datei eines [[Framebuffer]]s (z.&nbsp;B.&nbsp;Monitor)
| <code>fb<em>X</em></code>
| <code>fb<em>X</em></code>
|
|
|-
|-
|style="text-align:left;"| Laufwerksdatei im Zeichenmodus ([[macOS]]). rdisk0, rdisk1, … entspricht hier der ersten, zweiten, … Festplatte als Gerät an sich, während rdisk0s1 beispielsweise die erste Partition auf der ersten Festplatte ist.
|style="text-align:left;"| Laufwerksdatei im Zeichenmodus ([[macOS]]).  
|
* rdisk0, rdisk1, … entspricht hier der ersten, zweiten, … Festplatte als Gerät an sich, während rdisk0s1 beispielsweise die erste Partition auf der ersten Festplatte ist.
|
|
| <code>rdisk#</code>
<code>rdisk#s#</code>
|-
|-
|style="text-align:left;"| Der Geräte-[[Controller_(Hardware)|Controller
|style="text-align:left;"| Der Geräte-[[Controller_(Hardware)|Controller
]] des ersten registrierten [[NVMe]]-Geräts
]] des ersten registrierten [[NVMe]]-Geräts
|<code>nvme0</code>
|<code>nvme0</code>
|
|
|}
|}


Zeile 244: Zeile 152:


==== Socketorientierte Geräte ====
==== Socketorientierte Geräte ====
Bei ''socketorientierten Geräten'' handelt es sich nicht um Gerätedateien, sondern eine Form von [[Interprozesskommunikation]]. Wie [[FIFO]]s sind sie damit keine Gerätedateien, können aber auch zur Kommunikation mit dem Kernel eingesetzt werden und nehmen dabei eine ähnliche Aufgabe wahr wie zeichenorientierte Geräte.
Bei ''socketorientierten Geräten'' handelt es sich nicht um Gerätedateien, sondern eine Form von [[Interprozesskommunikation]].  
* Wie [[FIFO]]s sind sie damit keine Gerätedateien, können aber auch zur Kommunikation mit dem Kernel eingesetzt werden und nehmen dabei eine ähnliche Aufgabe wahr wie zeichenorientierte Geräte.


{| class="wikitable"
{| class="wikitable"
Zeile 263: Zeile 172:
=== Unechte Geräte ===
=== Unechte Geräte ===
; Virtuelle Gerätedateien
; Virtuelle Gerätedateien
Eine Gerätedatei muss nicht mit einem real existierenden Gerät korrespondieren, sondern kann auch für ein sogenanntes ''virtuelles Gerät'' ({{lang|en|virtual device}}) bzw.&nbsp;''Pseudogerät'' ({{lang|en|pseudo-device}}) stehen. Das ist ein Arbeitsmittel, dessen Funktionsweise vom Betriebssystem (Kernel, Kernelerweiterung, Treiber) gehandhabt wird.
Eine Gerätedatei muss nicht mit einem real existierenden Gerät korrespondieren, sondern kann auch für ein sogenanntes ''virtuelles Gerät'' (virtual device) bzw.&nbsp;''Pseudogerät'' (pseudo-device) stehen.  
* Das ist ein Arbeitsmittel, dessen Funktionsweise vom Betriebssystem (Kernel, Kernelerweiterung, Treiber) gehandhabt wird.


Anders als der Begriff ''virtuelles Gerät'' vermuten lässt, wird hier nicht unbedingt ein physisches Gerät nachgebildet (vgl. [[Virtualisierung (Informatik)|Virtualisierung]]).
Anders als der Begriff ''virtuelles Gerät'' vermuten lässt, wird hier nicht unbedingt ein physisches Gerät nachgebildet (vgl.&nbsp;[[Virtualisierung (Informatik)|Virtualisierung]]).


Nachfolgend eine Liste der verbreitetsten Pseudogeräte (alle zeichenorientiert) in [[Unix]]- und [[Unixoides Betriebssystem|ähnlichen Systemen]]:
; Verbreitete Pseudogeräte  
{| class="wikitable"
* auf [[Unix]]- und [[Unixoides Betriebssystem|ähnlichen Systemen]]
* alle zeichenorientiert
 
{| class="wikitable options"
|-
|-
| <code>[[:/dev/null]]</code> || verwirft jede Eingabe ohne eine Ausgabe zu produzieren
| <code>[[:/dev/null]]</code> || verwirft jede Eingabe ohne eine Ausgabe zu produzieren
Zeile 274: Zeile 187:
| <code>[[:/dev/zero]]</code> || produziert einen Zeichenstrom, der nur aus [[Nullzeichen]] (in [[C (Programmiersprache)|C]]-Notation: <code>'\0'</code>) besteht
| <code>[[:/dev/zero]]</code> || produziert einen Zeichenstrom, der nur aus [[Nullzeichen]] (in [[C (Programmiersprache)|C]]-Notation: <code>'\0'</code>) besteht
|-
|-
| <code>[[:/dev/full]]</code> || produziert einen Zeichenstrom, der beim [[Lesezugriff]] nur aus [[Nullzeichen]] (in [[C (Programmiersprache)|C]]-Notation: <code>'\0'</code>) besteht. Bei Schreibzugriffen gibt es einen ENOSPC ("disk full") Fehler.
| <code>[[:/dev/full]]</code> || produziert einen Zeichenstrom, der beim [[Lesezugriff]] nur aus [[Nullzeichen]] (in [[C (Programmiersprache)|C]]-Notation: <code>'\0'</code>) besteht.  
* Bei Schreibzugriffen gibt es einen ENOSPC ("disk full") Fehler.
|-
|-
| <code>[[:/dev/random]]</code> || produziert echte [[Zufallszahl]]en oder wenigstens [[Kryptographie|kryptografisch]] starke [[Pseudozufallszahl]]en (meist anhand von Hardware-Eingaben)
| <code>[[:/dev/random]]</code> || produziert echte [[Zufallszahl]]en oder wenigstens [[Kryptographie|kryptografisch]] starke [[Pseudozufallszahl]]en (meist anhand von Hardware-Eingaben)
Zeile 284: Zeile 198:
Zum Erstellen von Gerätedateien dient das linuxspezifische [[Unix-Kommando|Kommando]] <code>[[mknod]]</code>, welches zum Erstellen einer Gerätedatei die zugehörige Major- und Minor number benötigt.
Zum Erstellen von Gerätedateien dient das linuxspezifische [[Unix-Kommando|Kommando]] <code>[[mknod]]</code>, welches zum Erstellen einer Gerätedatei die zugehörige Major- und Minor number benötigt.


Wenn ein Benutzer bei frühen Linux-Versionen einen neuen Treiber installiert hat, so mussten eine oder mehrere Gerätedateien mit diesem <code>mknod</code>-Kommando unter Zuhilfenahme der Treiberdokumentation und unter Angabe der notwendigen Major/Minor-Number angelegt werden, um die benötigte Schnittstelle zu schaffen. Viele [[Linux-Distribution]]en lieferten daher im <code>/dev</code>-Verzeichnisbaum bereits tausende von Gerätedateien mit, ungeachtet ob diese jemals benötigt werden würden. Dies war einerseits unübersichtlich, andererseits war es schwierig, automatisch neue Treiber für neue Hardware zu laden, da die Gerätedateien immer manuell gepflegt werden mussten.
Wenn ein Benutzer bei frühen Linux-Versionen einen neuen Treiber installiert hat, so mussten eine oder mehrere Gerätedateien mit diesem <code>mknod</code>-Kommando unter Zuhilfenahme der Treiberdokumentation und unter Angabe der notwendigen Major/Minor-Number angelegt werden, um die benötigte Schnittstelle zu schaffen.  
* Viele [[Linux-Distribution]]en lieferten daher im <code>/dev</code>-Verzeichnisbaum bereits tausende von Gerätedateien mit, ungeachtet ob diese jemals benötigt werden würden.  
* Dies war einerseits unübersichtlich, andererseits war es schwierig, automatisch neue Treiber für neue Hardware zu laden, da die Gerätedateien immer manuell gepflegt werden mussten.


Innerhalb mehrerer Jahre und Kernel-Releases wurden so zwei neue Konzepte entwickelt:
Innerhalb mehrerer Jahre und Kernel-Releases wurden so zwei neue Konzepte entwickelt:
Zeile 291: Zeile 207:
[[devfs]]
[[devfs]]


Im [[Linux (Kernel)|Linux-Kernelbaum]] 2.2 wurde das ''[[devfs]]'' eingeführt. Die zugrundeliegende Idee war, dass die [[Kernel-Modul]]e selbst Informationen zu den Namen der Gerätedateien, die sie erzeugen, neben den Minor und Major Numbers sowie dem Typ mit sich führen. Dadurch konnte der Kernel erstmals die Erzeugung der Gerätedateien selbst übernehmen.
Im [[Linux (Kernel)|Linux-Kernelbaum]] 2.2 wurde das ''[[devfs]]'' eingeführt.  
* Die zugrundeliegende Idee war, dass die [[Kernel-Modul]]e selbst Informationen zu den Namen der Gerätedateien, die sie erzeugen, neben den Minor und Major Numbers sowie dem Typ mit sich führen.  
* Dadurch konnte der Kernel erstmals die Erzeugung der Gerätedateien selbst übernehmen.


Die benötigten bzw.&nbsp;vom Kernel und seinen Modulen gestellten Gerätedateien hat der Kernel anschließend automatisch in dem devfs-Dateisystem mit Hilfe des ''devfsd''-[[Daemon]]s erstellt. Das Dateisystem wurde dabei üblicherweise im Verzeichnis <code>/dev</code> gemountet.
Die benötigten bzw.&nbsp;vom Kernel und seinen Modulen gestellten Gerätedateien hat der Kernel anschließend automatisch in dem devfs-Dateisystem mit Hilfe des ''devfsd''-[[Daemon]]s erstellt.  
* Das Dateisystem wurde dabei üblicherweise im Verzeichnis <code>/dev</code> gemountet.


==== udev ====
==== udev ====
[[udev]]
[[udev]]


Nach reiflicher Überlegung schien das System mit devfs doch zu unflexibel. Gefordert wurde ein System, das beim Einstecken neuer Hardware reagiert ([[Hotplug]]ging), die entsprechenden Kernelmodule lädt und die Gerätedateien anlegt und beim Ausstecken der Geräte diese wieder entfernt. Zusätzlich sollte es möglich sein, über ein Regelwerk selbst zu definieren, welches Namensschema man für seine Gerätedateien anwenden möchte, wie diese in Unterverzeichnissen strukturiert werden sollen etc.
Nach reiflicher Überlegung schien das System mit devfs doch zu unflexibel.  
* Gefordert wurde ein System, das beim Einstecken neuer Hardware reagiert ([[Hotplug]]ging), die entsprechenden Kernelmodule lädt und die Gerätedateien anlegt und beim Ausstecken der Geräte diese wieder entfernt.  
* Zusätzlich sollte es möglich sein, über ein Regelwerk selbst zu definieren, welches Namensschema man für seine Gerätedateien anwenden möchte, wie diese in Unterverzeichnissen strukturiert werden sollen etc.


Mit der Einführung von Kernel 2.6 wurde [[udev]] dieses neue Geräteverwaltungskonzept. Ähnlich wie bei devfs gibt es auch hier einen Daemon der im [[Userspace]] läuft und die eigentliche Arbeit erledigt. Bei udev kommt jedoch kein eigenes Dateisystem zum Einsatz, außerdem ist die notwendige Kernelkomponente deutlich schlanker, also kleiner und einfacher.
Mit der Einführung von Kernel 2.6 wurde [[udev]] dieses neue Geräteverwaltungskonzept. Ähnlich wie bei devfs gibt es auch hier einen Daemon der im [[Userspace]] läuft und die eigentliche Arbeit erledigt.  
* Bei udev kommt jedoch kein eigenes Dateisystem zum Einsatz, außerdem ist die notwendige Kernelkomponente deutlich schlanker, also kleiner und einfacher.


== Gerätedateien unter Windows ==
== Gerätedateien unter Windows ==
Auch unter [[Microsoft Windows|Windows]] gibt es Gerätedateien: Auf sie kann man als Programmierer mittels der [[Subroutine]] <code>CreateFile()</code> zugreifen. Der Name einer Gerätedatei hat das Format <code>\\.\NAME</code>. Gerätedateien sind nicht, wie unter Unix, unter gewöhnlichen Verzeichnissen anzutreffen, die Kommunikation erfolgt entsprechend auch nicht (für den Benutzer) transparent. Im Allgemeinen hat man als Benutzer mit der Windows-[[Shell (Betriebssystem)|Shell]] keine Möglichkeit, mit den Gerätedateien in Berührung zu kommen.
Auch unter [[Microsoft Windows|Windows]] gibt es Gerätedateien
* Auf sie kann man als Programmierer mittels der [[Subroutine]] <code>CreateFile()</code> zugreifen
 
Der Name einer Gerätedatei hat das Format <code>\\.\NAME</code>
* Gerätedateien sind nicht, wie unter Unix, unter gewöhnlichen Verzeichnissen anzutreffen
* Die Kommunikation erfolgt entsprechend auch nicht (für den Benutzer) transparent
 
Im Allgemeinen hat man als Benutzer mit der Windows-[[Shell (Betriebssystem)|Shell]] keine Möglichkeit, mit den Gerätedateien in Berührung zu kommen.


== Anwendung ==
== Anwendung ==
=== Problembehebung ===
=== Problembehebung ===
<noinclude>
<noinclude>
== Anhang ==
== Anhang ==
=== Siehe auch ===
=== Siehe auch ===

Aktuelle Version vom 22. Dezember 2024, 11:47 Uhr

Gerätedatei - spezielle Datei zum Zugriff auf Geräte

Beschreibung

Gerätedateien (device file) sind spezielle Dateien, die unter fast allen Unix-Derivaten und vielen anderen Betriebssystemen genutzt werden.

Gerätedateien unter Unix

Typen von Gerätedateien

Die Dateisysteme von Unix- und ähnlichen Betriebssystemen unterscheiden zwischen „normalen“ Dateien (binär/ASCII), Verzeichnissen, Named Pipes (auch FIFOs genannt), Symbolische Verknüpfungen, Sockets und Datenblöcken.

  • Während „normale“ Dateien und Verzeichnisse zum Standardfunktionsumfang gewöhnlicher Dateisysteme gehören, spielen bereits Named Pipes eine Sonderrolle, zählen aber nicht zu den Gerätedateien.
  • Erst bei den letzten drei Typen handelt es sich um Gerätedateien.
Typen von Gerätedateien

Zur Ausgabe des Typs einer (Geräte-)Datei eignen sich Befehle wie ls oder file.

/dev im Dateisystembrowser Konqueror. * Zu sehen sind die Icons der vielen verschiedenen Gerätedateien

Da meist für jedes Gerät eine eigene Gerätedatei existiert, sammelte man bereits in frühen Versionen von Unix diese Dateien im Verzeichnis /dev.

  • Mit dem Filesystem Hierarchy Standard ist dieses Vorgehen für Linux standardisiert worden (Solaris führt die Gerätedateien unter dem virtuellen Dateisystem in /devices und generiert automatisiert Symlinks die von /dev zu den eigentlichen Dateien in /devices zeigen), ferner ist vorgeschrieben, welche Gerätedateien in diesem Verzeichnis unter welchem Namen existieren müssen (siehe dazu die Listen weiter unten).
  • Moderne Unix-Derivate benutzen oft spezielle (virtuelle) Dateisysteme, um dieses Verzeichnis aktuell zu halten.
  • Unter Linux war dafür lange Zeit devfs populär, mittlerweile sorgt udev für die Verwaltung der Gerätedateien.

Gerätedateien werden als Schnittstelle zwischen Gerätetreibern oder Systemkomponenten und Anwendungsprogrammen, die im Userspace ablaufen, genutzt.

  • So druckt man beispielsweise auf einem LPT-Drucker, der über die parallele Schnittstelle an den Computer angeschlossen ist, indem man Text direkt in die Gerätedatei /dev/lp0 schreibt.
  • Durch das Konzept der Gerätedateien sind Programme prinzipiell von den Gerätetreibern, die im Kernel agieren, getrennt.
  • Außerdem erscheint die Benutzung eines Gerätes völlig transparent – man muss nicht erst ein spezielles Programm nutzen, sondern kann in eine Datei schreiben, die quasi dem Drucker entspricht.
  • Dies ermöglicht eine intuitive Benutzung der Hardware.

Das Konzept der Gerätedateien ist eine der Grundlagen für den Unix-Grundsatz Alles ist eine Datei und wurde beispielsweise mit Ansätzen wie dem Derivat Plan 9 ausgebaut.

Blockorientierte Geräte

Blockorientierte Geräte (auch Blockspeichergerät, Blockgerät oder engl. Vorlage:Lang) übertragen Daten in Datenblöcken und werden daher oft für parallele Datenübertragungen genutzt.

  • Alle diese Geräte nutzen den betriebssystemeigenen Puffer.
Beispiele von Dateinamen für blockorientierte Geräte
Beschreibung des Geräts Linux
1. Diskettenlaufwerk fd0
IDE-Festplatte oder IDE-CD-ROM-Laufwerk am 1. Anschluss Master (in Linux) hda
IDE-Festplatte oder IDE-CD-ROM-Laufwerk am 1. Anschluss Slave hdb
1. primäre Partition der ersten IDE-Platte hda1
15. logische Partition der ersten IDE-Platte hda15
1. Slice der ersten IDE-Platte
15. Slice der ersten IDE-Platte
1. Partition im 1. Slice der ersten IDE-Platte
2. Partition im 1. Slice der ersten IDE-Platte
IDE-CD-ROM-Laufwerk am 1. Anschluss Master
IDE-CD-ROM-Laufwerk am 1. Anschluss Slave
1. SCSI-CD-ROM-Laufwerk scd0
SCSI-(Wechsel-)Platte, kleinste SCSI-ID sda
SCSI-(Wechsel-)Platte, nächstgrößere SCSI-ID sdb
1. primäre Partition der ersten SCSI-(Wechsel-)Platte sda1
11. logische Partition der ersten SCSI-(Wechsel-)Platte sda15
SCSI-(Wechsel-)Platte, kleinste SCSI-ID
5. Partition im 2. Slice der 2. SCSI-(Wechsel-)Platte
am C-ten SCSI-Controller mit SCSI-ID=T die D-te Festplatte und auf ihr das S-te Slice
symbolische Verknüpfung auf CD-ROM-Laufwerk cdrom
Der erste Namespace des ersten registrierten NVMe-Geräts nvme0n1
Die erste Partition des ersten Namespaces des ersten registrierten NVMe-Geräts nvme0n1p1

Zeichenorientierte Geräte

Zeichenorientierte Geräte übertragen nur ein Zeichen (typischerweise ein Byte) zur selben Zeit, sind also der seriellen Datenübertragung zuzusprechen.

  • Meist, aber nicht immer, werden Daten ungepuffert – also sofort – übertragen.
Beispiele von Dateinamen für zeichenorientierte Geräte
Beschreibung des Geräts Linux
1. Serielle Schnittstelle ttyS0
1. Parallele Schnittstelle lp0
2. Parallele Schnittstelle lp1
symbolische Verknüpfungen für Pseudoterminals ttyX
Gerätedateien für USB-Geräte sowie alle virtuellen Gerätedateien usbdev1.1
symbolische Verknüpfung auf Maus-Gerätedatei mouse
Datei eines Framebuffers (z. B. Monitor) fbX
Laufwerksdatei im Zeichenmodus (macOS).
  • rdisk0, rdisk1, … entspricht hier der ersten, zweiten, … Festplatte als Gerät an sich, während rdisk0s1 beispielsweise die erste Partition auf der ersten Festplatte ist.
Der Geräte-Controller des ersten registrierten NVMe-Geräts nvme0

Die Netzwerkkarten (zum Beispiel Ethernet, ISDN) werden unter Linux nicht über Gerätedateien, sondern über den TCP/IP-Stack angesprochen, gleichwohl existieren oft auch Gerätedateien für Spezialanwendungen wie etwa zur direkten Ansteuerung der Hardware (Netlink Device, D-Kanal etc.).

Socketorientierte Geräte

Bei socketorientierten Geräten handelt es sich nicht um Gerätedateien, sondern eine Form von Interprozesskommunikation.

  • Wie FIFOs sind sie damit keine Gerätedateien, können aber auch zur Kommunikation mit dem Kernel eingesetzt werden und nehmen dabei eine ähnliche Aufgabe wahr wie zeichenorientierte Geräte.
Beispiele für socketorientierte Geräte
Dateiname Bedeutung
/dev/log Socket für den syslog-Daemon
/dev/gpmdata Socket für den GPM-Maus-Multiplexer
/dev/printer Socket für lpd

Unechte Geräte

Virtuelle Gerätedateien

Eine Gerätedatei muss nicht mit einem real existierenden Gerät korrespondieren, sondern kann auch für ein sogenanntes virtuelles Gerät (virtual device) bzw. Pseudogerät (pseudo-device) stehen.

  • Das ist ein Arbeitsmittel, dessen Funktionsweise vom Betriebssystem (Kernel, Kernelerweiterung, Treiber) gehandhabt wird.

Anders als der Begriff virtuelles Gerät vermuten lässt, wird hier nicht unbedingt ein physisches Gerät nachgebildet (vgl. Virtualisierung).

Verbreitete Pseudogeräte
/dev/null verwirft jede Eingabe ohne eine Ausgabe zu produzieren
/dev/zero produziert einen Zeichenstrom, der nur aus Nullzeichen (in C-Notation: '\0') besteht
/dev/full produziert einen Zeichenstrom, der beim Lesezugriff nur aus Nullzeichen (in C-Notation: '\0') besteht.
  • Bei Schreibzugriffen gibt es einen ENOSPC ("disk full") Fehler.
/dev/random produziert echte Zufallszahlen oder wenigstens kryptografisch starke Pseudozufallszahlen (meist anhand von Hardware-Eingaben)
/dev/urandom produziert Pseudozufallszahlen (meist im Gegensatz zu /dev/random ohne zu blockieren, wenn keine Hardwaredaten anfallen)

Verwaltung der Gerätedateien am Beispiel Linux

Zum Erstellen von Gerätedateien dient das linuxspezifische Kommando mknod, welches zum Erstellen einer Gerätedatei die zugehörige Major- und Minor number benötigt.

Wenn ein Benutzer bei frühen Linux-Versionen einen neuen Treiber installiert hat, so mussten eine oder mehrere Gerätedateien mit diesem mknod-Kommando unter Zuhilfenahme der Treiberdokumentation und unter Angabe der notwendigen Major/Minor-Number angelegt werden, um die benötigte Schnittstelle zu schaffen.

  • Viele Linux-Distributionen lieferten daher im /dev-Verzeichnisbaum bereits tausende von Gerätedateien mit, ungeachtet ob diese jemals benötigt werden würden.
  • Dies war einerseits unübersichtlich, andererseits war es schwierig, automatisch neue Treiber für neue Hardware zu laden, da die Gerätedateien immer manuell gepflegt werden mussten.

Innerhalb mehrerer Jahre und Kernel-Releases wurden so zwei neue Konzepte entwickelt:

devfs

devfs

Im Linux-Kernelbaum 2.2 wurde das devfs eingeführt.

  • Die zugrundeliegende Idee war, dass die Kernel-Module selbst Informationen zu den Namen der Gerätedateien, die sie erzeugen, neben den Minor und Major Numbers sowie dem Typ mit sich führen.
  • Dadurch konnte der Kernel erstmals die Erzeugung der Gerätedateien selbst übernehmen.

Die benötigten bzw. vom Kernel und seinen Modulen gestellten Gerätedateien hat der Kernel anschließend automatisch in dem devfs-Dateisystem mit Hilfe des devfsd-Daemons erstellt.

  • Das Dateisystem wurde dabei üblicherweise im Verzeichnis /dev gemountet.

udev

udev

Nach reiflicher Überlegung schien das System mit devfs doch zu unflexibel.

  • Gefordert wurde ein System, das beim Einstecken neuer Hardware reagiert (Hotplugging), die entsprechenden Kernelmodule lädt und die Gerätedateien anlegt und beim Ausstecken der Geräte diese wieder entfernt.
  • Zusätzlich sollte es möglich sein, über ein Regelwerk selbst zu definieren, welches Namensschema man für seine Gerätedateien anwenden möchte, wie diese in Unterverzeichnissen strukturiert werden sollen etc.

Mit der Einführung von Kernel 2.6 wurde udev dieses neue Geräteverwaltungskonzept. Ähnlich wie bei devfs gibt es auch hier einen Daemon der im Userspace läuft und die eigentliche Arbeit erledigt.

  • Bei udev kommt jedoch kein eigenes Dateisystem zum Einsatz, außerdem ist die notwendige Kernelkomponente deutlich schlanker, also kleiner und einfacher.

Gerätedateien unter Windows

Auch unter Windows gibt es Gerätedateien

  • Auf sie kann man als Programmierer mittels der Subroutine CreateFile() zugreifen

Der Name einer Gerätedatei hat das Format \\.\NAME

  • Gerätedateien sind nicht, wie unter Unix, unter gewöhnlichen Verzeichnissen anzutreffen
  • Die Kommunikation erfolgt entsprechend auch nicht (für den Benutzer) transparent

Im Allgemeinen hat man als Benutzer mit der Windows-Shell keine Möglichkeit, mit den Gerätedateien in Berührung zu kommen.

Anwendung

Problembehebung

Anhang

Siehe auch

Weblinks
  1. https://de.wikipedia.org/wiki/Ger%C3%A4tedatei
  2. Major- und Minor-Nummern aus der Dokumentation zur Konfiguration des HP 9000 Rechners
  3. Aus dem FreeBSD-Handbook: Devices and Device Nodes (englisch)