Unter Unix werden weitaus mehr Dinge in Dateiform verwaltet, als z.B. unter DOS/Windows. Neben den regulären Dateien (regular files) gibt es noch verschiedene weitere Konstrukte, die genauso verwaltet werden. Grundsätzlich unterscheidet Unix die folgenden Dateiarten

  • Reguläre Dateien (regular file)
  • Verzeichnisse (directory)
  • Symbolische Links (symbolic link)
  • Blockorientierte Geräte (block device)
  • Zeichenorientierte Geräte (char device)
  • Feststehende Programmverbindungen (named pipe)
  • Netzwerk-Kommunikationsendpunkte (socket)

Das erste Zeichen des Dateizugriffsstring (darstellbar mit ls -l) zeigt die Dateiart an. ein Bindestrich steht für eine normale Datei, ein d für ein Verzeichnis, ein l für einen symbolischen Link, ein b bzw. c für ein block- bzw. zeichenorientiertes Gerät, ein p für eine named pipe und ein s für einen Socket. Im Folgenden werden alle diese Dateiarten kurz dargestellt.

Reguläre Dateien

Reguläre Dateien sind alle „normalen Dateien“, also das, was wir auch unter DOS als Dateien kennen. Sie haben einen Inhalt, der als Bitfolge auf einem Datenträger gespeichert ist, Die wesentlichen Eigenschaften sind schon im letzten Kapitel besprochen worden. Der einzige Punkt, der noch nicht dargestellt wurde ist die Frage, warum jede Datei die Angabe besitzt, wieviele Dateinamen sie besitzt.

Unter Unix existieren für Dateien sogenannte Links, einer davon, der symbolische Link, wird gleich im Anschluß besprochen. Unter diesen Links ist etwas ähnliches zu verstehen, wie unter den Verknüpfungen von Windows 95/98. Die Tatsache, dass Dateien mehrere Namen besitzen können wurde unter Unix schon sehr früh eingeführt, es handelt sich hierbei eigentlich um mehrere Dateinamen im Inhaltsverzeichnis einer Platte, die auf die selben Blöcke zeigen. Unter Unix spricht man hier von sogenannten Hard-Links.

Darunter ist tatsächlich nichts anderes zu verstehen, als ein zweiter Name für ein und dieselbe Datei. Wenn eine Datei zwei Namen hat, so kann nicht zwischen Orginal und Link unterschieden werden. Es ist möglich, eine der beiden Dateien zu löschen und trotzdem ist die andere noch vorhanden. Physikalisch handelt s sich aber immer um die selbe Datei, d.h., sie nimmt nur einmal den Speicherplatz auf der Platte in Anspruch.

Diese Tatsache erklärt aber auch die Einschränkung, der ein Hardlink unterworfen ist. Der Link muß sich auf der selben Partition befinden, auf der sich die Orginaldatei befindet. Das liegt in der Natur des Links, weil er ja nur ein weiterer Name für die Datei ist, der im Inhaltsverzeichnis der Platte bzw. der Partition gespeichert ist.

Hardlinks werden mit dem Befehl ln angelegt.

Symbolische Links

Im Gegensatz zu Hardlinks sind symbolische Links wesentlich flexibler, aber auch fehleranfälliger. Hier handelt es sich tatsächlich um Verweise auf eine bestehende Datei, d.h., der symbolische Link ist in Wahrheit eine Datei, die nur den Dateinamen einer anderen Datei enthält. Damit das System diese Datei nicht als Textdatei mißinterpretiert wird sie als SymLink gekennzeichnet, als Dateityp steht ein l statt eines Bindestrichs.

Durch diese Tatsache kann man beim SymLink immer zwischen Orginal und Link unterscheiden, im Gegensatz zum Hardlink, bei dem das nicht möglich ist. Symbolische Links erlauben es auch, Verweise über die Partitionsgrenzen hinweg zu erstellen. Allerdings ist nicht sichergestellt, dass der Link auch auf etwas zeigt, was existiert. Wird z.B. ein SymLink auf eine Datei angelegt und anschließend die Datei gelöscht, so zeigt der Link ins Leere.

Als weiterer Vorteil von SymLinks ist noch die Tatsache zu nennen, dass sie auch auf Verzeichnisse zeigen können. Damit ist es also etwa möglich, ein Verzeichnis, das nicht mehr auf die Partition passt, in der es erwartet wird, in einer anderen Partition abzuspeichern und in der ursprünglichen Partition einfach einen SymLink auf die neue Position zu setzen.

Symbolische Links werden wie Hardlinks mit dem Befehl ln angelegt. Zur Unterscheidung wird dort einfach der Parameter -s (für symbolischen Link) benutzt.

Verzeichnisse

Verzeichnisse sind unter Unix auch nur Dateien, die allerdings eben den Typ d statt Bindestrich haben um sie von regulären Dateien zu unterscheiden. Die Befehle zum Anlegen, Löschen und Wechseln der Verzeichnisse entsprechen im Großen und Ganzen denen von DOS, auch wenn unter dem herkömmlichen Unixen meist die vollen Befehle (mkdir statt md) verlangt werden. Die Befehle sind

  • mkdir – Anlegen eines Verzeichnisses
  • rmdir – Löschen eines Verzeichnisses
  • cd – Wechseln in ein Verzeichnis
  • pwd – Anzeige des aktuellen Verzeichnisnamens

Blockorientierte Geräte

Unix betrachtet auch jedes Stück Hardware als Datei. Dabei wird zwischen block- und zeichenorientierten Geräten unterschieden. Als blockorientiertes Gerät gilt jedes Gerät, das nicht einzelne Zeichen verarbeitet, sondern ganze Blocks. Dabei handelt es sich z.B. typischerweise um Festplatten, Disketten und andere Laufwerke. Diese Laufwerke werden dann als Dateien verwaltet, für den Anwender bleibt der Unterschied zwischen Gerät und Datei nahezu transparent.

Die Gerätedateien (engl. special files), sowohl die block- wie auch die zeichenorientierten befinden sich im Verzeichnis /dev. Sie belegen physikalisch keinen Platz auf der Festplatte, sind also selbst nicht die Gerätetreiber, wie oft fälschlicherweise gedacht wird. Diese Dateien haben eigentlich nur zwei Nummern, die die Adresse des Gerätetreibers im Kernel symbolisieren. Die erste Nummer, auch major number genannt zeigt, um welchen Gerätetreiber es sich handelt, die zweite (minor number) beschreibt, das wievielte Gerät es ist, das diesen Treiber benutzt.

Als Beispiel folgt hier die Ausgabe des ls -l Befehls auf einige Gerätedateien des Blocktyps:

                                 Major Minor  
                                   V    V
brw-rw----   1 root     disk       1,   0 Apr  5 01:12 ram0
brw-rw----   1 root     disk       1,   1 Apr  5 01:12 ram1
brw-rw----   1 root     disk       1,   2 Apr  5 01:12 ram2
brw-rw----   1 root     disk       1,   3 Apr  5 01:12 ram3
...
brw-rw-rw-   1 root     disk       2,   0 Apr  5 01:12 fd0
brw-rw-rw-   1 root     disk       2,   1 Apr  5 01:12 fd1
...
brw-rw----   1 root     disk       3,   0 Apr  5 01:12 hda
brw-rw----   1 root     disk       3,   1 Apr  5 01:12 hda1
brw-rw----   1 root     disk       3,   2 Apr  5 01:12 hda2
brw-rw----   1 root     disk       3,   3 Apr  5 01:12 hda3
brw-rw----   1 root     disk       3,   4 Apr  5 01:12 hda4
brw-rw----   1 root     disk       3,   5 Apr  5 01:12 hda5
...
brw-rw----   1 root     disk       3,  64 Apr  5 01:12 hdb
brw-rw----   1 root     disk       3,  65 Apr  5 01:12 hdb1
brw-rw----   1 root     disk       3,  66 Apr  5 01:12 hdb2
brw-rw----   1 root     disk       3,  67 Apr  5 01:12 hdb3
...

Typische blockorientierte Geräte sind hier also der Arbeitsspeicher (ram1-4 Major-Number 1), die Diskettenlaufwerke (fd0, fd1 Major Number 2) und die Festplatten. (Major Number 3 für IDE-Platten) Bei den Festplatten wird unterschieden zwischen den ganzen Platten (hda, hdb, hdc, hdd) und den darauf befindlichen Partitionen (hda1, hda2, hdb1, hdb2,…)

Auf diese Gerätedateien kann zugegriffen werden, wie auf jede normale Datei, sie haben einen Zugriffsmodus (rwx…) wie normale Dateien und Eigentümer und Gruppenzugehörigkeit.

Damit ist es z.B. möglich den Diskcopy-Befehl mit dem Befehl cat wie folgt zu realisieren:

cat /dev/fd0 > Datei
cat Datei > /dev/fd0

Zunächst wird also alles aus der Datei /dev/fd0 (erstes Floppy-Laufwerk) in die Datei Datei kopiert, im zweiten Befehl wird – nachdem eine Leerdiskette eingelegt wurde – der Inhalt der Datei wieder auf die Diskette geschrieben. Es wird hier nicht dateiorientiert gearbeitet, sondern wie bei DOS-diskcopy clusterorientiert.

Zeichenorientierte Geräte

Grundsätzlich trifft alles, was wir für die blockorientierten Geräte oben gesagt haben auch auf die zeichenorientierten Geräte zu, nur dass es sich bei ihnen um Geräte handelt, die nicht blockweise angesteuert werden sondern durch einzelne Bytes. Typischerweise handelt es sich hier um serielle oder parallele Schnittstellen, auch und gerade die Terminalleitungen (auch die der virtuellen Terminals) aber auch etwa der Soundanschluß.

Auch hier wieder ein paar Beispiele:

ISDN Anschlüsse
crw-------   1 root     root      45,   0 Apr  5 01:13 isdn0
crw-------   1 root     root      45,   1 Apr  5 01:13 isdn1

BIOS-ROM
crw-------   1 root     root      31,   0 Apr  5 01:13 rom0
crw-------   1 root     root      31,   1 Apr  5 01:13 rom1

Terminalleitungen für die virtuellen Terminals
crw-rw-rw-   1 root     root       5,   0 Apr  5 01:12 tty
crw--w--w-   1 root     tty        4,   0 Apr  5 01:12 tty0
crw-------   1 root     root       4,   1 Aug  8 11:39 tty1

Serielle Leitungen (COM1 und COM2)
crw-rw----   1 root     uucp       4,  64 Apr  5 01:12 ttyS0
crw-rw----   1 root     uucp       4,  65 Apr  5 01:12 ttyS1

Sowohl die block- als auch die zeichenorientierten Gerätedateien werden mittels dem Befehl mknod angelegt. Die einzige Information, die man dazu braucht ist die der Major- und Minornummer und die Frage, ob es sich um ein block- oder zeichenorientiertes Gerät handelt.

Feststehende Programmverbindungen (named pipes oder FIFOs)

In seltenen Fällen kann es nötig sein, feststehende Verbindungsleitungen zwischen verschiedenen Programmen zu nutzen. Dazu können named pipes benutzt werden. Es handelt sich um einfache FIFO Buffer (First In First Out), in die geschrieben werden kann und aus denen gelesen werden kann. Damit können z.B. auch Prozesse, die auf verschiedenen Terminals laufen via Pipe verbunden werden.

Diese FIFOs werden angelegt, wenn sie gebraucht werden, auch sie werden mit dem Befehl mknod erstellt.

Netzwerk-Kommunikationsendpunkte

Die Technik der Sockets besteht aus dem Prinzip, dass auch Netzwerkverbindungen im Dateisystem sichtbar (und nutzbar) gemacht werden. Sockets werden nur von Netzwerkprogrammen angelegt und genutzt. Es sind Kommunikationsendpunkte, die auf beiden Systemen, die miteinander kommunizieren bestehen und dort als Ansprechpunkt benutzt werden. Es gibt keine Verwendung für Sockets direkt für User, genausowenig gibt es Möglichkeiten Sockets einfach durch einen bestimmten Befehl anzulegen.

Als Beispiel für einen Socket kann man die Datei /var/run/printer ansehen, auf Systemen, die den Druckerdaemon laufen haben existiert diese Datei als Socket.

Schreibe einen Kommentar