K Textersetzung - „== Syntax ==“ durch „== Aufruf ==“
(18 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1:
Zeile 1:
'''topic''' - Kurzbeschreibung
'''Gerätedatei''' - spezielle [[Datei]] zum Zugriff auf Geräte
== Beschreibung ==
== Beschreibung ==
'''Gerätedateien''' ({{enS|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. Somit wird zwischen drei Typen von Gerätedateien unterschieden:
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.
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.
== Installation ==
== Aufruf ==
== Syntax ==
=== Optionen ===
=== Optionen ===
=== Parameter ===
=== Parameter ===
=== Umgebungsvariablen ===
=== Umgebung ===
=== Exit-Status ===
=== Rückgabewert ===
== Anwendung ==
== Anwendung ==
=== Fehlerbehebung ===
=== Problembehebung ===
== Konfiguration ==
=== Dateien ===
<noinclude>
<noinclude>
== Anhang ==
== Anhang ==
=== Siehe auch ===
=== Siehe auch ===
{{Special:PrefixIndex/{{BASEPAGENAME}}}}
{{Special:PrefixIndex/{{BASEPAGENAME}}}}
----
{{Special:PrefixIndex//dev}}
* [[/dev]]
==== Sicherheit ====
==== Dokumentation ====
===== RFC =====
===== Man-Pages =====
===== Info-Pages =====
==== Links ====
===== Projekt =====
===== Weblinks =====
===== Weblinks =====
# https://de.wikipedia.org/wiki/Ger%C3%A4tedatei
# https://de.wikipedia.org/wiki/Ger%C3%A4tedatei
Zeile 331:
Zeile 323:
# Aus dem [[FreeBSD]]-Handbook: [http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/basics-devices.html Devices and Device Nodes] (englisch)
# Aus dem [[FreeBSD]]-Handbook: [http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/basics-devices.html Devices and Device Nodes] (englisch)
<noinclude>
[[Kategorie:Gerätedatei]]
= TMP =
== Gerätedateien ==
Die Dateien im '''/dev''' Verzeichnis sind, wie bereits angedeutet "Pipelines" zur Hardware des Computers.
Die meisten Dateien können (die entsprechenden Zugriffsrechte vorausgesetzt) sowohl ausgelesen als auch beschrieben werden.
Einige, welche Statusinformationen über die Hardware liefern können selbstverständlich nur ausgelesen werden, während andere, welche die Hardware konfigurieren nur geschrieben werden können.
D.h. auf die einzelnen Hardwarekomponenten des Computers kann wie auf Dateien zugegriffen werden.
Vorteil dieses Konzepts: Auf diese Weise kann auf die Hardware zugegriffen werden (z. B.
* aus Shellscripten heraus), ohne dass spezielle Hilfsprogramme geschrieben werden müssen.
Die folgende Tabelle enthält eine Liste der wichtigsten Gerätedateien, samt Beschreibung:
{| class="wikitable sortable"
|-
! | Gerätedatei
!colspan="2" | | Bedeutung
|-
| | '''sdasdbsdcsdd'''
| | erstezweitedrittevierte
| | SCSI/SATA-Festplatte
|-
| | '''sda1sda2sda3sda4'''
| | erstezweitedrittevierte
| | Festplattenpartition auf der ersten SCSI/SATA-Festplatte
|-
| | '''hda'''
| colspan="2" | wie s'''da''', nur für IDE-Festplatten
|-
| | '''ttyS0ttyS1'''
| colspan="2" | Erste und zweite serielle Schnittstelle (COM1 und COM2 unter DOS)
|-
| | '''audiodspsndstatmidi00'''
| colspan="2" | Zugriff auf die Soundblasterkarte
|-
| | '''psaux'''
| colspan="2" | Zugriff auf die PS/2 Schnittstelle
|-
| | '''lp0lp1lp2'''
| colspan="2" | Zugriff auf die parallele Schnittstelle
|-
| | '''fd0'''
| colspan="2" | Zugriff auf das erste Diskettenlaufwerk
|-
|}
Dies ist selbstverständlich nur eine kleine Zusammenstellung.
* Eine vollständige Liste findet sich unter:
/usr/src/linux/Documentation/devices.txt
==== Besondere Geräte ====
{| class="wikitable sortable"
|-
| | '''/dev/zero'''
| | liefert unendlich vielen Nullen
|-
| | '''/dev/null'''
| | schluckt alle Daten die es erhält
|-
| | '''/dev/random'''
| | liefert [http://de.wikipedia.org/wiki/Zufallszahlengenerator Zufallszahlen] von hoher Qualität
|-
| | '''/dev/urandom'''
| | liefert unendlich viele [http://de.wikipedia.org/wiki/Zufallszahlengenerator Zufallszahlen]
|-
|}
===== /dev/null =====
'''/dev/null''' ([http://de.wikipedia.org/wiki/Englische_Sprache englisch] ''null'': dt. „nichts“) ist der Name einer speziellen [http://de.wikipedia.org/wiki/Gerätedatei#Virtuelle_Ger.C3.A4tedateien virtuellen Gerätedatei], des ''Nulldevice'', auf [http://de.wikipedia.org/wiki/Unix Unix] und Unix-ähnlichen [http://de.wikipedia.org/wiki/Betriebssystem Betriebssystemen], die jegliche Daten, die dorthin geschrieben werden, verwirft.
* Unter [http://de.wikipedia.org/wiki/CP/M CP/M] und seinen Abkömmlingen [http://de.wikipedia.org/wiki/PC-kompatibles_DOS DOS], [http://de.wikipedia.org/wiki/OS/2 OS/2] und [http://de.wikipedia.org/wiki/Microsoft_Windows Microsoft Windows] wird das Nulldevice als NUL: angesprochen.
* Unter [http://de.wikipedia.org/wiki/Disk_Operating_System DOS] und Nachfolgerbetriebssystemen existiert das Nulldevice in jedem Verzeichnis unter dem Dateinamen NUL.
* Die Datei /dev/null ist durch den [http://de.wikipedia.org/wiki/Portable_Operating_System_Interface POSIX]-Standard standardisiert.
; Verwendung
Eine häufige Verwendung ist z. B. , in einer [http://de.wikipedia.org/wiki/Unix-Shell Shell]-Sitzung die Meldungen eines Programms von der [http://de.wikipedia.org/wiki/Stdout Standardausgabe] statt auf den Bildschirm nach /dev/null umzuleiten, wenn man an ihnen nicht interessiert ist; sie werden dann nicht angezeigt.
Das Gerät /dev/null kann auch als Ziel bei Dateisystemoperationen dienen.
Ein solcher Zweck tritt gelegentlich auf, wenn Shellskripte oder Programme unbedingt eine Dateiangabe erfordern, diese im vorliegenden Fall aber keinen Sinn ergibt oder unerwünscht ist.
Lesezugriffe liefern sofort ein Dateiende ([http://de.wikipedia.org/wiki/End_of_File End of File], „EOF“).
* Dabei verhält sich das Gerät wie eine gewöhnliche Datei, das öffnende Programm muss also keine besonderen Vorkehrungen treffen.
In der [http://de.wikipedia.org/wiki/Netzkultur Netzkultur] ist /dev/null ein umgangssprachlich verwendeter Begriff für eine Art gedankliches [http://de.wikipedia.org/wiki/Schwarzes_Loch Schwarzes Loch], meist um Desinteresse an der Aussage des Gesprächspartners zu bekunden.
===== Beispiele =====
Wenn man nur die normale Ausgabe eines Programms sehen will, nicht aber die Fehlermeldungen und sonstigen Informationen, die das Programm in die [http://de.wikipedia.org/wiki/Standard-Datenströme#Standardfehlerausgabe_.28stderr.29 Standardfehlerausgabe] schreibt, kann man diese umleiten:
$ programm 2>/dev/null
Möchte man für Shell-Skripte nur den Rückgabewert eines Programms verwenden und somit sämtliche Ausgaben nach /dev/null umleiten, kann die folgende Syntax verwendet werden:
$ programm >/dev/null 2>&1
Mittels Shell-[http://de.wikipedia.org/wiki/Pipe_%28Informatik%29 Pipes] kann man selektiv uninteressante (Fehler-)Meldungen von Teilen der Pipeline ausblenden:
$ programm1 2>/dev/null | programm2 | ...
Ähnlich ist die Verwendung mittels [http://de.wikipedia.org/wiki/Symbolische_Verknüpfung symbolischer Verknüpfung], danach wird alles, was in die verlinkte Datei (~/.bash_history) geschrieben wird, nicht gespeichert, beispielsweise zum [http://de.wikipedia.org/wiki/Datenschutz Datenschutz]:
$ ln -sf /dev/null ~/.bash_history
Auch üblich ist die Verwendung für die Standardeingabe.
* Ein Beispiel dafür ist das Ausführen eines Kommandos im Hintergrund während einer [http://de.wikipedia.org/wiki/Secure_Shell SSH]-Sitzung.
* Dabei wird die Standardeingabe an /dev/null übergeben, womit das Programm im Hintergrund weiterläuft, auch wenn man sich aus der SSH-Sitzung ausloggt:
Man kann auch einen Datenträger überprüfen, indem z. B. /dev/cdrom0 nach /dev/null kopiert wird.
* Wenn hierbei ein Fehler auftritt, ist der entsprechende Datenträger beschädigt oder nicht vorhanden.
$ dd if=/dev/cdrom of=/dev/null
==== /dev/zero ====
'''/dev/zero''' ist eine spezielle [http://de.wikipedia.org/wiki/Virtuelle_Gerätedatei virtuellen Gerätedatei] auf [http://de.wikipedia.org/wiki/Unix Unix] und [http://de.wikipedia.org/wiki/Unixoides_System unixoiden Systemen], die bei jedem Lesezugriff [http://de.wikipedia.org/wiki/Nullzeichen Nullzeichen] zurückgeliefert.
* Im Gegensatz zu [http://de.wikipedia.org/wiki//dev/null /dev/null] ist /dev/zero nicht Bestandteil des [http://de.wikipedia.org/wiki/Portable_Operating_System_Interface POSIX]-Standard.
/dev/zero wurde mit [http://de.wikipedia.org/wiki/SunOS SunOS]-4.0 im Jahre 1987 gemeinsam mit dem neuen VM-Subsystem eingeführt.
==== Details ====
Wenn auf /dev/zero geschrieben wird, verhält sich /dev/zero wie /dev/null.
Bei einem ''mmap'' auf /dev/zero werden anonyme genullte Seiten aus dem virtuellen [http://de.wikipedia.org/wiki/Speicherpool Speicherpool] des [http://de.wikipedia.org/wiki/Kernel_%28Betriebssystem%29 Kernels] zur Verfügung gestellt.
Viele Betriebssysteme verwenden diesen ''mmap''-Mechanismus, um Programmen und [http://de.wikipedia.org/wiki/Shared_Library Shared Libraries] den sogenannten ''nichtinitialisierten''-Datenbereich zur Verfügung zu stellen.
Viele Programme verwenden Datenbereiche, die durch einen ''mmap'' auf /dev/zero erzeugt wurden, als Basis für [http://de.wikipedia.org/wiki/Shared_Memory Shared Memory], das zur Kommunikation zwischen mehreren [http://de.wikipedia.org/wiki/Prozess_%28Informatik%29 Prozessen] verwendet wird.
===== Beispiele =====
Das folgende [http://de.wikipedia.org/wiki/Unix-Kommando Unix-Kommando] erzeugt eine Datei namens ''file'', die 12 MB groß ist und nur das [http://de.wikipedia.org/wiki/Nullzeichen Nullzeichen] enthält:
/dev/random ist eine zeichen-orientierte [http://de.wikipedia.org/wiki/Virtuelle_Gerätedatei virtuelle Gerätedatei], über die Programme auf einen systemweiten [http://de.wikipedia.org/wiki/Zufallszahlengenerator Zufallszahlengenerator] von hoher Qualität zugreifen können.
Da für [http://de.wikipedia.org/wiki/Rechnernetz netzwerk]-orientierte Systeme wie Unix [http://de.wikipedia.org/wiki/Kryptografie Kryptografie]-Dienste und damit [http://de.wikipedia.org/wiki/Zufallszahl Zufallszahlen] eine bedeutende Rolle spielen, kommt dieser Datei und dem dahinterstehenden Treiber eine wichtige Bedeutung zu.
Der Zufallsgenerator sammelt [http://de.wikipedia.org/w/index.php?title=Umgebungsrauschen&action=edit&redlink=1 Umgebungsrauschen] von [http://de.wikipedia.org/wiki/Gerätetreiber Gerätetreibern] und anderen Quellen in einem [http://de.wikipedia.org/wiki/Entropie_%28Informationstheorie%29 Entropiepool].
* Der Generator speichert auch eine Abschätzung über die Anzahl der [http://de.wikipedia.org/wiki/Bit Bit] im Entropiepool.
Aus diesem Pool werden die Zufallszahlen generiert.
* Beim Lesen gibt /dev/random nur solange Zufallszahlen zurück, bis die abgeschätzte Entropiemenge erschöpft ist.
Wenn der Entropiepool erschöpft ist, blockieren Lesezugriffe auf /dev/random, bis zusätzliches Umgebungsrauschen erhalten wurde. /dev/random sollte ausreichend sein für Anwendungszwecke, die auf eine sehr hohe Qualität der Zufälligkeit angewiesen sind, wie etwa [http://de.wikipedia.org/wiki/Kryptografie Kryptografie] (beispielsweise [http://de.wikipedia.org/wiki/One-Time-Pad One-Time-Pads] oder [http://de.wikipedia.org/wiki/Public_Key Schlüsselerzeugung]).
Aus Performancegründen wird in der Praxis oft nur der Seed eines Pseudo-Zufallszahlengenerators von /dev/random gelesen (z. B.
* in [http://de.wikipedia.org/wiki/OpenSSL OpenSSL], [http://de.wikipedia.org/wiki/Pretty_Good_Privacy PGP] und [http://de.wikipedia.org/wiki/GnuPG GnuPG]).
Der aktuelle Füllstand des Entropiepools lässt sich unter [http://de.wikipedia.org/wiki/Linux_%28Kernel%29 Linux] aus der Datei /proc/sys/kernel/random/entropy_avail ermitteln.
Eine Ausgabe der Datei liefert die verfügbare Entropie in bit, wobei das Maximum von 4096 bit einem vollständig gefüllten Entropiepool entspricht.
=== /dev/urandom ===
Aus /dev/urandom (von engl.
* unlimited random(ness)) können wie aus /dev/random Zufallszahlen gelesen werden.
Im Gegensatz zu letzterem blockiert es jedoch nicht, wenn eine definierte Entropieschwelle unterschritten wird.
In diesem Fall ist es theoretisch möglich, dass die erzeugten [http://de.wikipedia.org/wiki/Pseudozufall Pseudozufallszahlen] im Nachhinein von einem Angreifer berechnet werden können.
* Im Zweifelsfall sollte bei hohen Anforderungen, z. B.
* bei One-Time-Pads, auf /dev/random zurückgegriffen werden.
==== Verbesserung der Entropie ====
Über Software, wie z. B. timer_entropyd, haveged, randomsound, lässt sich die Entropie verbessern sowie bzw.
* der Entropie-Pool vergrößern, sodass mehr Zufallszahlen zur Verfügung stehen.
Mit der [http://de.wikipedia.org/wiki/GNU GNU]-Software rng-tools lassen sich unter Linux und ähnlichen Betriebssystemen [http://de.wikipedia.org/wiki/Zufallszahlengenerator#Physikalischer_Zufallszahlengenerator physikalische Zufallszahlengeneratoren] einbinden.
=== Zusammenfassung: Gerätedateien ===
* Spezialdateien (special files)
* Geräte werden als Spezialdatei eingetragen
* Zugriff auf Gerät Zugriff auf eine Datei
* Schutzmechanismus wie für normale Dateien
* Blockorientierte und zeichenorientierte Geräte
==== Named Pipes estellen (mkfifo) ====
mkfifo erstellt named pipes (FIFOs) mit dem übergebenen Namen.
'''mkfifo '''[''OPTION'']... ''NAME''...
===== Optionen =====
-'''m''', --'''mode'''<nowiki>=</nowiki>''MODE Setzt Zugriffsrechte mit Bitmaske (MODE)''
-'''Z''', --'''context'''<nowiki>=</nowiki>''CTX Setzt den ''SELinux security context für jeden NAME auf CTX
==== Gerätedateien erzeugen (mknod) ====
'''mknod''' erzeugt eine Spezialdatei
'''mknod''' ''[-m Modus] [-mode=Modus] Name {bcu} Major Minor''
'''mknod''' ''[-m Modus] [-mode=Modus] Pfad p''
'''mknod''' erzeugt ein FIFO, eine Gerätedatei für ein zeichenorientiertes Gerät (character device) oder für ein blockorientiertes Gerät (block-device) mit dem angegebenen ''Namen''.
Die Gerätedateien werden über die Major Device Nummern (Hauptgerätenummern) mit den entsprechenden Gerätetreibern im Kernel verbunden.
Mehrere Geräte der gleichen Art werden vom Gerätetreiber durch die Minor Device Nummern (Untergerätenummern) unterschieden.
Eine vollständige Liste aller Gerätenummern finden Sie bei den Kernelsourcen in der Datei ./src/linux/Documentation/devices.txt.
* Die verbindliche Liste aller registrierten Hauptgerätenummern befindet sich in der Includedatei <linux/major.h>.
Die Zugriffsrechte auf die Datei werden aus der Bitdifferenz von 0666 und der aktuellen ''umask'' des aufrufenden Prozesses gebildet.
Der erste Buchstabe nach dem ''Namen'' gibt den Typ der Datei an:
{| class="wikitable sortable"
|-
| | '''p '''
| | (pipe) erzeugt eine FIFO Spezialdatei (wie [../../../../ebooks/computer/betriebssysteme/linux/allgemein/unsortiert/linux_anwender_handbuch/linux_anwenderhandbuch_7-0/node79.html#mkfifo mkfifo])
|-
| | '''b '''
| | (block) erzeugt eine Gerätedatei für ein (gepuffertes) blockorientiertes Gerät
|-
| | '''c '''
| | (character) erzeugt eine ungepufferte Gerätedatei für ein zeichenorientiertes Gerät
|-
| | '''u '''
| | (unbuffered) das Gleiche wie ''c''
|-
|}
===== Optionen =====
{| class="wikitable sortable"
|-
| | '''-m ''Modus'' '''
| | setzt die Rechte der Dateien auf ''Modus'' wie bei [../../../../ebooks/computer/betriebssysteme/linux/allgemein/unsortiert/linux_anwender_handbuch/linux_anwenderhandbuch_7-0/node29.html#chmod chmod]
|-
|}
==== Verwaltung der Gerätedateien mit udev ====
udev ersetzt seit dem Kernel 2.6 das früher genutzte [http://de.wikipedia.org/wiki/Devfs devfs]-Dateisystem, dessen Aufgaben es damit übernimmt.
Genauso wie devfs verwaltet udev das /dev-Verzeichnis, welches die speziellen [http://de.wikipedia.org/wiki/Gerätedatei Gerätedateien] enthält, um von Programmen aus auf die vom System zur Verfügung gestellten Geräte zuzugreifen.
Mit der Einführung von udev waren sowohl udev als auch devfs im Kernel enthalten.
* Seit Ende Juni 2006 ist nur noch udev enthalten, devfs wurde vollständig entfernt.
===== Arbeitsweise =====
'''udev''' überwacht und wertet [http://de.wikipedia.org/wiki/Hot-Plug hotplug]-Ereignisse aus.
Finden sich dort Informationen über ein neu angeschlossenes Gerät, werden zusätzliche zu diesem Gerät vorhandene Informationen dem [http://de.wikipedia.org/w/index.php?title=Sysfs&action=edit&redlink=1 sysfs]-Dateisystem entnommen und eine neue Gerätedatei im /dev-Verzeichnis erzeugt.
Dabei ist der für die spezielle Datei verwendete Name und die [http://de.wikipedia.org/wiki/Dateiberechtigung Zugriffsberechtigung] frei durch Regeln konfigurierbar.
===== Konfiguration =====
Installiert man udev, so findet man die Standardregeln unter /etc/udev/rules.d/50-udev.rules.
Um die eigenen Regeln anwenden zu können, sollte man diese Datei nicht verändern, sondern eine neuere mit kleinerer Nummer erzeugen, zum Beispiel /etc/udev/rules.d/10-udev.rules.
Somit ist gewährleistet, dass diese Regeln zuerst erkannt werden.
* Wurde eine Regel gefunden, so wird diese, und auch jede passende folgende, angewandt.
===== Vorteile =====
Im Unterschied zu devfs, welches im Linux-Kernel selbst integriert ist, arbeitet udev im [http://de.wikipedia.org/wiki/Userspace userspace], wird also als normales Programm gestartet.
Die Verwaltung und Namensgebung der angeschlossenen Geräte liegt dadurch nicht mehr beim Kernel und ist somit einfacher konfigurierbar.
Weitere Vorteile:
* die Zuordnung von Geräten ist eindeutig – es entstehen keine Probleme mehr, wenn man z. B.
* die Reihenfolge von zwei angeschlossenen USB-Druckern ändert
* die Benennung der Geräte kann durch den Nutzer gewählt werden; sie bleibt beständig
* für die Ermittlung der Gerätenamen können beliebige Verfahren zur Anwendung kommen, neben statischen Listen und Regeln z. B.
* auch die Abfrage einer externen Datenbank, wodurch sich beispielsweise Geräte innerhalb eines Unternehmensnetzwerkes - durch ihre Seriennummer identifiziert - einheitlich verhalten
* die Benennung ist [http://de.wikipedia.org/wiki/Linux_Standard_Base Linux-Standard-Base]-konform
===== Nachteile =====
Ein beabsichtigter Nachteil von udev besteht darin, dass es im Gegensatz zu devfs beim Aufruf eines /dev-Knotens nicht automatisch die entsprechenden [http://de.wikipedia.org/wiki/Gerätetreiber Gerätetreiber] lädt.
Funktioniert beim Einstecken eines Gerätes HotPlug nicht richtig und laden die benötigten Treiber nicht, können diese nicht mit udev nachgeladen werden.
[[Kategorie:Gerätedatei]]
</noinclude>
</noinclude>
Aktuelle Version vom 12. November 2024, 18:44 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. Sie ermöglichen eine einfache Kommunikation zwischen Userspace, zum Beispiel gewöhnlichen Anwenderprogrammen, und dem Kernel und damit letztlich der Hardware eines Computers. Diese Kommunikation ist transparent, da Gerätedateien wie normale Dateien verwendet werden.
Zur Ausgabe des Typs einer (Geräte-)Datei eignen sich Befehle wie ls oder file.
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.
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
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.
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.
Vorlage:Anker
Eine Gerätedatei muss nicht mit einem real existierenden Gerät korrespondieren, sondern kann auch für ein sogenanntes virtuelles Gerät (Vorlage:Lang) bzw. Pseudogerät (Vorlage:Lang) 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).
Nachfolgend eine Liste der verbreitetsten Pseudogeräte (alle zeichenorientiert) in Unix- und ähnlichen Systemen:
produziert einen Zeichenstrom, der beim Lesezugriff nur aus Nullzeichen (in C-Notation: '\0') besteht. Bei Schreibzugriffen gibt es einen ENOSPC ("disk full") Fehler.
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 Kommandomknod, 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:
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.
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 SubroutineCreateFile() 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.