Copyright © 1995 by O'Reilly/International Thomson Verlag

Bitte denken Sie daran: Sie dürfen zwar die Online-Version ausdrucken, aber diesen Druck nicht fotokopieren oder verkaufen.

Wünschen Sie mehr Informationen zu der gedruckten Version des Buches "Linux - Wegweiser zur Installation & Konfiguration", dann klicken Sie hier.


Kapitel 4

Die Gerätedateien

Gerätedateien (device files) ermöglichen Anwendungsprogrammen unter Benutzung des Kernels den Zugriff auf die Hardwarekomponenten (devices) des Systems. Es handelt sich nicht um »Dateien« im eigentlichen Sinn, aber aus der Sicht eines Programms erscheinen sie wie Dateien -- Sie können aus diesen Dateien lesen, dorthin schreiben, sie mit mmap() benutzen usw. Wenn Sie auf eine solche Geräte»datei« zugreifen, erkennt der Kernel die E/A-Anforderung und reicht sie an einen Gerätetreiber weiter, der die entsprechende Operation ausführt; etwa Daten aus einer seriellen Schnittstelle lesen oder Daten an eine Soundkarte schicken.

Gerätedateien (obwohl der Name ungenau ist, wollen wir ihn weiter benutzen) bieten eine bequeme Methode des Zugriffs auf die Systemressourcen, ohne daß der Anwendungsprogrammierer wissen muß, wie das angesprochene Gerät funktioniert. Unter Linux sind die Gerätetreiber selbst ein Teil des Kernels -- wie in den meisten UNIX-Systemen. Im Abschnitt » Den Kernel kompilieren « zeigen wir, wie Sie Ihren eigenen Kernel kompilieren können, der nur Treiber für die im System vorhandene Hardware enthält.

Gerätedateien finden sich auf fast allen UNIX-artigen Systemen im Verzeichnis /dev . Zu jedem Gerät im System gehört ein entsprechender Eintrag in /dev . So entspricht z.B. /dev/ttyS0 der ersten seriellen Schnittstelle (unter DOS als COM1 bekannt); /dev/hda2 entspricht der zweiten Partition auf der ersten IDE-Festplatte. Tatsächlich finden Sie in /dev Einträge für viele Geräte, die in Ihrem System gar nicht vorhanden sind. Die Gerätedateien werden in der Regel bei der Installation des Systems angelegt und sollen alle möglicherweise vorhandenen Geräte erfassen. Dies stimmt nicht unbedingt mit der vorhandenen Hardware Ihres Systems überein.

Es gibt eine Reihe von »Pseudo-Devices« in /dev , die keinem tatsächlich vorhandenen Gerät zugeordnet sind. Zum Beispiel dient /dev/null als Datensenke -- alle schreibenden Zugriffe auf /dev/null sind erfolgreich, aber die geschriebenen Daten werden ignoriert. In ähnlicher Weise können Sie /dev/zero benutzen, um z.B. eine Swap-Datei zu erzeugen; alle Leseanforderungen an /dev/zero liefern einfach eine Folge von Null-Bytes zurück.

Wenn Sie mit ls -l die Gerätedateien in /dev auflisten, werden Sie etwa folgendes sehen:

brw-rw----   1 root     disk       3,   0 May 19  1994 /dev/hda

Wir zeigen den Eintrag für /dev/hda , welcher der ersten IDE-Festplatte entspricht. Beachten Sie zunächst, daß der erste Buchstabe im Berechtigungsfeld ein b ist -- es handelt sich also um ein Block-Device (blockorientiertes Gerät). Erinnern Sie sich noch einmal daran, daß normale Dateien an dieser Stelle einen - haben, Verzeichnisse ein d usw. Gerätedateien werden entweder mit einem b für Block-Device oder einem c für Character-Device (zeichenorientiertes Gerät) bezeichnet. Ein Block-Device ist in der Regel ein Peripheriegerät wie z.B. eine Festplatte -- Daten werden blockweise auf das Gerät geschrieben und von dort gelesen (wobei das Gerät festlegt, wie groß ein Block ist -- das muß nicht mit den 1024 Bytes übereinstimmen, die wir unter Linux normalerweise als »Block« bezeichnen). Auf blockorientierte Geräte kann wahlfrei zugegriffen werden. Im Gegensatz dazu werden zeichenorientierte Geräte normalerweise sequentiell gelesen und beschrieben, und die Ein/Ausgabe kann byteweise erfolgen. Ein Beispiel für ein zeichenorientiertes Gerät ist die serielle Schnittstelle.

Beachten Sie auch, daß das Feld für die Dateigröße in dieser Auflistung jetzt zwei durch ein Komma getrennte Zahlen enthält. Der erste Wert ist die major device number , der zweite die minor device number . Wenn ein Programm auf eine Gerätedatei zugreift, wird dem Kernel die E/A-Anforderung in Form der beiden Gerätenummern für dieses Gerät übergeben. Die Major Number bezeichnet im allgemeinen einen bestimmten Treiber im Kernel und die Minor Number steht für das Gerät, auf das der Treiber tatsächlich zugreifen soll. So haben z.B. alle Gerätedateien für die seriellen Schnittstellen dieselbe Major Number, aber unterschiedliche Minor Numbers. Der Kernel benutzt die Major Number, um eine E/A-Anforderung an den zuständigen Treiber zu übergeben und der Treiber benutzt die Minor Number, um herauszufinden, welches Gerät er ansprechen soll.

Die Vergabe von Namen für die Dateien in /dev ist, gelinde gesagt, ein einziges Chaos. Für den Kernel selbst spielen die Namen, die in /dev auftauchen, keine Rolle (der Kernel benutzt nur die Major und Minor Numbers). Deshalb haben die Vertreiber von Distributionen, Anwendungsprogrammierer und Treiber-Schreiber vollkommen freie Hand bei der Auswahl von Namen für die Gerätedateien. Oft ist es vielleicht so, daß der Programmierer eines Gerätetreibers einen Namen vorschlägt, der aber später geändert wird, weil noch andere, ähnliche Treiber untergebracht werden müssen. Bei fortschreitender Entwicklung des Systems kann das zu Verwirrung und Diskrepanzen führen -- hoffentlich haben Sie nicht mit solchen Problemen zu kämpfen.

Die Gerätedateien in Ihrer Distribution sollten auf jeden Fall zu Ihrer Kernel-Version und den Gerätetreibern in dieser Distribution passen. Wenn Sie einen neuen Kernel einspielen oder weitere Treiber hinzufügen (siehe auch den Abschnitt » Einen neuen Kernel erstellen « ), müssen Sie eventuell mit dem Befehl mknod eine neue Gerätedatei erzeugen. Der Befehl hat folgendes Format:

mknod -m berechtigungen name typ major minor

wobei

Nehmen wir an, daß Sie einen neuen Gerätetreiber in den Kernel einbinden wollen, und die Dokumentation besagt, daß Sie ein Block-Device mit dem Namen /dev/bogus , der Major Number 42 und der Minor Number 0 erzeugen müssen. Geben Sie dazu folgenden Befehl ein:

mknod /dev/bogus b 42 0

Wenn Sie das Argument -m Berechtigungen nicht angeben, erhält das neue Gerät dieselben Berechtigungen wie eine neu erstellte Datei, modifiziert durch die aktuelle umask -- in der Regel ergibt das 0644. Wenn die Berechtigungen statt dessen auf 0666 gesetzt werden sollten, würden wir:

mknod -m 666 /dev/bogus b 42 0

eingeben. Sie können die Berechtigungen für eine Gerätedatei auch nach dem Erzeugen mit chmod vergeben.

Warum sind die Berechtigungen für Geräte so wichtig? Wie bei allen anderen Dateien bestimmen die Berechtigungsbits auch für Gerätedateien, wer in welcher Weise direkt auf auf ein Gerät zugreifen darf. Wir haben weiter oben gesehen, daß die Gerätedatei für /dev/hda die Berechtigungsbits 0660 hat -- das bedeutet, daß nur der Eigner und die Mitglieder der Gruppe (in diesem Fall disk) direkt von diesem Gerät lesen und dorthin schreiben dürfen. (Wir besprechen die Berechtigungen im Abschnitt » Die Dateiberechtigungen « in Kapitel 3 .)

Im allgemeinen sollten Sie keinem Benutzer den direkten Schreib- und Lesezugriff auf bestimmte Gerätedateien zugestehen -- insbesondere nicht auf die Gerätedateien, über die auf Festplatten und Partitionen zugegriffen wird. Wenn Sie das doch tun, könnte jedermann z.B. eine Partition mit mkfs bearbeiten und alle Daten im System vernichten.

Für Laufwerke und Partitionen braucht man die Schreibberechtigung, um Daten in dieser Weise zu zerstören, aber auch die Leseberechtigung stellt eine Bedrohung der Systemsicherheit dar. Wenn ein Benutzer nämlich die Leseberechtigung für eine Gerätedatei erhält, über die auf eine Festplattenpartition zugegriffen wird, hat er damit die Möglichkeit, die Dateien anderer Benutzer zu lesen. Ähnlich verhält es sich mit der Gerätedatei /dev/mem , die für den physikalischen Speicher des Systems steht (wird in der Regel nur für extreme Debugging-Operationen benutzt). Ein begabter Benutzer mit Leseberechtigung könnte hiermit die Paßwörter anderer Benutzer einschließlich root ausspähen, wenn sie beim Login eingetippt werden.

Stellen Sie sicher, daß die Berechtigungen für alle Geräte, die sie nachträglich dem System hinzufügen, mit der Art und Weise übereinstimmen, in der die Geräte von den Benutzern angesprochen werden können und sollen. In der Regel ist es in Ordnung, wenn Normalsterbliche auf serielle Schnittstellen, Soundkarten und virtuelle Konsolen zugreifen können, aber die meisten anderen Geräte im System sollten nur von root benutzt werden (und den Programmen, die mit Root-Berechtigung laufen).

Einige der Dateien in /dev sind in Wirklichkeit symbolische Links (wie üblich mit ln -s angelegt) auf eine andere Gerätedatei. Solche Links vereinfachen den Zugriff auf bestimmte Geräte, indem Sie einen verständlicheren Namen benutzen. Wenn Sie z.B. eine serielle Maus benutzen, kann über eine der Gerätedateien /dev/cua0 , /dev/cua1 , /dev/cua2 oder /dev/cua3 darauf zugegriffen werden -- das hängt davon ab, an welche serielle Schnittstelle die Maus angeschlossen ist. Viele Leute erzeugen einen Link namens /dev/mouse auf das entsprechende serielle Gerät:

ln -s /dev/cua2 /dev/mouse

Auf diese Weise können wir für den Zugriff auf die Maus /dev/mouse benutzen, statt uns zu merken, an welche Schnittstelle die Maus angeschlossen ist. Dieser Konvention folgen auch Geräte wie /dev/cdrom und /dev/modem . Diese Dateien sind in der Regel Links auf eine andere Gerätedatei in /dev , die das eigentliche CD-ROM-Laufwerk oder Modem darstellt.

Eine Gerätedatei können Sie ganz einfach mit:

rm /dev/bogus

entfernen. Mit dem Entfernen einer Gerätedatei wird nicht gleichzeitig der entsprechende Gerätetreiber aus dem Speicher oder dem Kernel entfernt; Sie entfernen lediglich die Möglichkeit, einen bestimmten Treiber anzusprechen. Ebenso bedeutet das Hinzufügen einer Gerätedatei noch nicht, daß Sie einen neuen Treiber in das System eingebunden haben -- tatsächlich könnten Sie sogar Gerätedateien für Treiber erzeugen, die gar nicht existieren. Die Gerätedateien sind lediglich der »Haken«, mit dem Sie sich in einen bestimmten Gerätetreiber einklinken, sofern dieser im Kernel existiert.


Inhaltsverzeichnis Vorherige Abschnitt Nächste Abschnitt