26.3 Dateitypen
Alles ist Datei
Unter Unix gibt es bezüglich Dateisystemen die Philosophie, dass eigentlich alles als »Datei« bezeichnet wird, was sich letztendlich im Dateisystem befindet. <Das ist nicht selbstverständlich. Beispielsweise unter Windows befindet sich »C:\>« auch im Dateisystem, ist aber keine Datei.} Die meisten Unix-Anwender, die von Windows kommen, denken, dass nur reguläre Dateien (d. h. ausführbare Programme, Text-Dateien etc.) »richtige« Dateien seien. Dies ist aber unter Unix nicht der Fall. Unter Unix sind beispielsweise auch Sockets, FIFOs, Verzeichnisse und Devices Dateien. <Unter Solaris kennt man auch »Doors« als Dateitypen.> Auch wenn Sie mit einigen Begriffen nach der Lektüre der vorherigen Kapitel schon einiges anfangen können, wollen wir im Folgenden trotzdem noch eine zusammenfassende Übersicht geben.
Im Besonderen definiert sich ein Dateityp also nicht durch den Unterschied zwischen Text- oder Musikdateien, sondern vielmehr durch den Unterschied aus Sicht des Betriebssystems.
26.3.1 Reguläre Dateien
In die Kategorie der regulären Dateien gehören alle Text- und Binärdateien – also etwa ausführbare Programme, Shellskripts, Konfigurationsdateien, Savegames oder Library-Dateien. Ein unbedarfter Betrachter würde vielleicht im semantischen Unterschied dieser Dateien unterschiedliche Dateitypen ausmachen wollen. Jedoch kennt das Betriebssystem diese Unterschiede nicht, da im Zugriff auf diese Dateien abstrahiert und die Interpretation des Inhalts einem Benutzerprogramm überlassen wird.
26.3.2 Verzeichnisse
Verzeichnisse (engl. »directories«) stellen einen ganz eigenen Dateityp dar. Ein Verzeichnis beinhaltet die so genannten Inode-Nummern der in diesem Verzeichnis befindlichen Dateinamen. Diese Nummern stellen Verweise auf die eigentlichen Dateien dar. Außerdem ist im Verzeichnis jeder darin enthaltenen Inode-Nummer mindestens ein Dateiname zugeordnet.
Dateien befinden sich demzufolge also nicht in einem Verzeichnis – das gaukelt Ihnen das System nur vor --, sondern an irgendeinem x-beliebigen Ort auf dem Speichermedium. Im Prinzip kann eine Datei also in mehreren Verzeichnissen gleichzeitig unter verschiedenen Namen existieren. Das Verzeichnis »weiß« also nur, dass es einen Dateinamen »x« gibt, der auf einen Inode-Eintrag mit der Nummer »y« verweist.
Kopieren vs. Verschieben
Wird also eine Datei innerhalb eines Dateisystems von einem Verzeichnis A in ein Verzeichnis B verschoben, so werden nur die Inode-Einträge der Verzeichnisse angepasst, die Daten selbst müssen nicht kopiert werden. Daher dauert ein Kopiervorgang mittels cp auch wesentlich länger als ein Verschiebungsvorgang mit dem Kommando mv, da beim Kopieren die Daten Byte für Byte kopiert werden müssen.
Ihnen ist bereits bekannt, dass die Verzeichnisstruktur in Unix hierarchisch aufgebaut ist. Ein Verzeichnis kann Dateien eines jeden Typs und somit insbesondere natürlich auch Unterverzeichnisse enthalten. In diesen Unterverzeichnissen können wiederum viele weitere Verzeichnisse, Unterverzeichnisse und natürlich auch reguläre Dateien liegen.
Ausgangspunkt dieser Hierarchie ist das bereits bekannte Wurzelverzeichnis. Im Verzeichnisbaum werden dabei auch alle anderen Dateisysteme, etwa das eines CD- Laufwerks oder ein NFS-Dateisystem, gemountet.
Die Hierarchie eines Unix-Dateisystems ist im Filesystem Hierarchy Standard genau festgelegt.
Diesen finden Sie in Kapitel 2 zusammengefasst oder ausführlich unter www.pathname.com/fhs.
Abbildung 26.1 Hierarchie der Verzeichnisse
26.3.3 Links
Auf Dateien verweisen
Links sind Verweise auf andere Dateien beziehungsweise stellen eine (weitere) Instanz für eine Datei dar. Links werden grundsätzlich in zwei Typen unterteilt: in Hardlinks und Softlinks. Letztere werden oft auch als symbolische Links bezeichnet.
Ein symbolischer Link /cdrom wäre eine spezielle Datei mit »/mnt/cdrom« oder einen anderem Ziel als Inhalt. Greift ein Benutzer nun auf /cdrom zu, so merkt das Betriebssystem, dass es sich bei diesem Verzeichnis um einen Link handelt, und leitet den Benutzer entsprechend zum Ziel weiter.
Bei einem Hardlink handelt es sich dagegen nur um einen weiteren Dateinamen für eine bereits vorhandene Datei.
Dies bedeutet, dass dieser Dateiname auf den gleichen Inode-Eintrag des Dateisystems wie die Orginaldatei verweist. Da jede reguläre Datei, etwa eine Textdatei, ein Verweis auf einen Inode-Eintrag ist, ist sie immer auch ein Hardlink.
ln
Links werden mit dem Tool ln erzeugt. Dabei können sowohl Soft- als auch Hardlinks erzeugt werden. Übergibt man als Parameter nur die Originaldatei und den Namen des neuen Links, wird ein Hardlink erstellt. Fügt man hingegen die Option -s hinzu, wird ein Softlink erstellt.
$ echo "ABC" > datei
$ ln datei symlink_datei
$ cat symlink_datei
ABC
$ cd /etc
$ ls
X11
adduser.conf
adduser.message
afs
amd
astrocam.conf
...
$ ln -s /etc /tmp/symlink_etc
$ ls /tmp/symlink_etc
X11
adduser.conf
adduser.message
afs
amd
astrocam.conf
...
$ ln /etc /tmp/symlink_etc2
ln: /etc: is a directory
Listing 26.14 Einen symbolischen Link erzeugen
Softlinks (symbolische Links) können auf Dateien verweisen, die nicht mehr existieren, und können zudem auf Verzeichnisse verweisen, was mit Hardlinks nicht funktioniert.
Link-Counter
Im Inode-Eintrag einer jeden Datei ist ein sogenannter Link-Counter enthalten.
Dieser Link-Counter gibt an, wie viele Dateinamen (Hardlinks) im Dateisystem auf den Inode- Eintrag verweisen. Damit kann das Betriebssystem zu jeder Zeit in Erfahrung bringen, ob überhaupt noch ein Dateiname in irgendeinem Verzeichnis auf diesen Inode-Eintrag verweist. Ist das nicht der Fall, können dieser Inode-Eintrag sowie die Datenbereiche, auf die er verweist, gelöscht werden. Somit steht der verwendete Speicherplatz wieder zur Nutzung durch andere Dateien zur Verfügung.
Wird eine Datei im Dateisystem erstellt, erhält der entsprechende Link-Counter den Wert 1. Wird daraufhin noch ein zusätzlicher Hardlink auf diesen Inode-Eintrag erstellt, erhöht der Dateisystem-Code im Kernel den Link-Counter-Wert, der somit den Wert 2 hat. Löscht man nun einen dieser Hardlinks, sinkt der Wert wieder auf 1. Löscht man den letzten Hardlink ebenfalls, sinkt der Wert auf 0 und die Datei kann physikalisch gelöscht werden.
Nehmen wir einmal die Datei /tmp/file als Beispiel. Sie hat einen Link-Counter-Wert von 1, da nur ein Dateiname auf diese Datei verweist. Erstellt man nun einen Hardlink auf diese Datei, zeigt ls den jetzt inkrementierten Wert des Link-Counters an.
$ touch file $ ls -l file -rw------- 1 cdp_xe wheel 0 May 1 19:10 file $ ln file fileb $ ls -l file -rw------- 2 cdp_xe wheel 0 May 1 19:10 file
Listing 26.15 Link-Counter (2. Spalte der ls-Ausgabe)
26.3.4 Sockets
Sockets sind nicht zwangsläufig im Dateisystem abgelegt. Dies ist nämlich durch den Typ des Sockets bedingt. TCP/IP-Sockets liegen beispielsweise nicht im Dateisystem. Ausschließlich Unix-Domain-Sockets sind als Datei im Dateisystem zu finden. Programme können dann in diesen Socket schreiben (also senden) und aus ihm lesen (also empfangen). Dabei kann vom Programmierer je nach Wunsch eine Stream- oder eine Datagrammverbindung verwendet werden.
Dabei werden, wie Sie aus Kapitel 24 über »Prozesse und IPC« bereits wissen, die üblichen Socket-Syscalls genutzt, die auch für TCP-Stream-Sockets bzw. UDP-Datagramm-Sockets verwendet werden.
26.3.5 Named Pipes
Pipes kennen Sie bereits aus den Kapiteln zur Shell und zur Interprozesskommunikation. Named Pipes werden, im Gegensatz zu einfachen Pipes, als Datei im Dateisystem abgelegt. Pipes bieten dabei eine Kommunikationsmöglichkeit innerhalb einer Prozesshierarchie (unterhalb eines Session-Leader-Prozesses wie der Shell oder eines Dämonprozesses).
26.3.6 Gerätedateien
Gerätedateien (engl. »device files«) sind im Dateisystem unterhalb von /dev untergebrachte Dateien, die eine Hardwarekomponente repräsentieren. Dabei kann eine solche Hardwarekomponente entweder real vorhanden oder nur virtueller Natur sein. Letzteres bezeichnet man als Pseudo-Device. Ein Pseudo-Device wäre beispielsweise /dev/null.