Der folgende Text stammt aus dem »Debian GNU/Linux Guide« von John Goerzen und Ossama Othman. Ins Deutsche übersetzt von Michael »grisu« Bramer. Der Text steht unter der GNU General Public License.
Dateitypen
Der Linux-Kernel betrachtet fast alles als Datei. Er betrachtet auch Directories und Geräte als Dateien – es sind nur besondere Dateien.
Der erste Buchstabe von ls -l zeigt den Typ der Datei an. Für eine normale Datei ist das ein einfaches –. Weitere Möglichkeiten sind unter anderem:
| Zeichen | Dateityp |
|---|---|
| d | Directory |
| l | Symbolische Links |
| b | Blockorientiertes Gerät |
| c | Zeichenorientiertes Gerät |
| p | Named Pipes |
| s | Sockets |
Im Folgenden werden die einzelnen Dateitypen beschrieben.
Symbolische Links
Symbolische Links (auch »Symlinks« oder »Softlinks« genannt) sind eine andere Art von Links neben Hardlinks. Ein Symlink ist eine besondere Datei, die auf einen Hardlink in einem gemounteten Dateisystem zeigt. Wenn du versuchst, den Inhalt eines Symlinks zu lesen, siehst du den Inhalt der Datei, auf die er zeigt. Da Directories, Geräte und andere Symlinks nur verschiedene Arten von Dateien sind, kann ein Symlink auf diese zeigen.
Eine Hardlink ist also ein Dateiname und eine Inode-Nummer. Eine Datei ist in Wirklichkeit eine Inode: der Ort auf der Platte, der Dateityp, Rechte usw. Ein Symlink ist eine Inode, die den Namen eines Hardlinks enthält. Ein Symlink führt einen Dateinamen mit einem anderen Dateinamen zusammen, wohingegen ein Hardlink einen Dateinamen mit einer Inode-Nummer zusammenführt.
Alle Hardlinks zu ein und derselben Datei haben denselben Status. Einer ist so gut wie der andere. Wenn du eine Operation auf einem Hardlink ausführst, ist das genau dasselbe, als wenn du diese Operation auf einem anderen ausführen würdest. Andererseits haben Operationen auf einem Symlink manchmal Auswirkungen auf der Inode des Symlinks (die den Namen des Hardlinks enthält) und manchmal haben sie Auswirkungen auf den Hardlink, auf den gezeigt wurde.
Es gibt einige wichtige Unterschiede zwischen Symlinks und Hardlinks:
- Symlinks können Dateisysteme überspringen, da sie den kompletten Dateinamen enthalten und alle Dateinamen einzigartig sind. Da Hardlinks die Inode-Nummer benutzen und Inode-Nummern nur auf einem Dateisystem einzigartig sind, würden diese vieldeutig sein, wenn das Dateisystem nicht bekannt ist
- Du kannst Symlinks auf Directories zeigen lassen, jedoch keine Hardlinks. Jedes Directory hat Hardlinks – diese sind im Elterndirectory als . und als .. in den Unterverzeichnissen eingetragen – aber um die Ordnung im Dateisystem zu gewährleisten, sind andere Hardlinks zu Directories verboten. Folglich entspricht die Anzahl der Directories in einem Directory der Anzahl der Hardlinks des Directorys. Du kannst nur Hardlinks zu Dateien anlegen, die vorhanden sind, da eine Inode-Nummer benötigt wird. Du kannst jedoch einen Symlink zu jedem Dateinamen anlegen, unabhängig davon, ob ein solcher Dateiname existiert oder nicht.
- Wird ein Symlink gelöscht, wird nur dieser Link entfernt. Das Löschen hat keine Auswirkungen auf die Datei. Wird der einzige ( und damit letzte) Hardlink gelöscht, werden die Daten der Datei auch gelöscht.
Probiere einmal Folgendes aus:
konsolero@nitidelo ~ $ cd; ln -s /tmp/me MyTmp
cd wechselt in dein Homeverzeichnis. ln mit der Option -s erstellt einen symbolischen Link – in diesem Fall einen Link mit dem Namen MyTemp, der zu dem Dateinamen /tmp/me zeigt:
konsolero@nitidelo ~ $ ls -l MyTmp
Die Ausgabe sollte wie folgt aussehen:
lrwxrwxrwx 1 havoc havoc 7 Dec 6 12:50 MyTmp –> /tmp/me
Datum, Besitzer und Gruppe werden bei dir natürlich anders sein. Beachte die Angabe l als Dateityp und auch die Rechte. Wenn du mit chmod versuchst, die Rechte zu ändern, wirst du die Rechte der Datei ändern.
konsolero@nitidelo ~ $ chmod 700 MyTmp
Du wirst die Fehlermeldung No such file or directory erhalten, da die Datei /tmp/me nicht vorhanden ist. Bedenke, dass du einen Symlink immer erzeugen kannst.
konsolero@nitidelo ~ $ mkdir /tmp/me
Erzeugt das Directory /tmp/me.
konsolero@nitidelo ~ $ chmod 700 MyTmp
Das sollte jetzt funktionieren.
konsolero@nitidelo ~ $ touch MyTmp/myfile
Erzeugt eine Datei in MyTmp.
konsolero@nitidelo ~ $ ls /tmp/me
Die Datei wurde gerade in /tmp/me erzeugt.
konsolero@nitidelo ~ $ rm MyTmp
Löscht den symbolischen Link. Beachte, dass hiermit nur der Link gelöscht wird. Deshalb verwende rm und nicht rmdir.
konsolero@nitidelo ~ $ rm /tmp/me/myfile; rmdir /tmp/me
Räumt auf und löscht alle Dateien, die für diese Demonstration angelegt wurden.
Gerätedateien
Geräte beziehen sich auf physikalische oder virtuelle Geräte des Systems, wie Festplatte, Grafikkarte, Bildschirm oder Tastatur. Ein Beispiel für ein virtuelles Gerät ist die Konsole, vertreten durch /dev/console.
Es gibt zwei Arten von Geräten. Zeichenorientierte Geräte können auf einzelne Zeichen zugreifen. Das ist dann die kleinste Einheit, die auf diesen Geräten geschrieben oder gelesen werden kann.
Auf blockorientierte Geräte muss in größeren Einheiten, die mehrere Zeichen enthalten, zugegriffen werden – das wird Block genannt. Deine Festplatte ist ein blockorientiertes Gerät.
Du kannst Gerätedateien wie andere Dateien lesen und in sie schreiben, obwohl die Dateien unverständliches Kauderwelsch enthalten. Es ist in der Regel eine schlechte Idee, wahllos Daten in diese Dateien zu schreiben. Aber manchmal ist es nützlich. Beispielsweise kannst du eine Postscript-Datei in das Druckergerät /dev/lp0 ausgeben oder Modemkommandos an die entsprechende Gerätedatei des seriellen Ports senden.
/dev/null
/dev/null ist eine besondere Gerätedatei, die alles, was in sie geschrieben wird, einfach wegwirft. Wenn du irgendeine Ausgabe nicht möchtest, wirf sie in /dev/null. Im Grunde genommen ist diese Datei ein Fass ohne Boden. Wenn du /dev/null liest, erhäst du sofort ein EOF-Zeichen (end-of-file). /dev/zero ist ähnlich. Wenn du jedoch davon liest, erhäst du das Zeichen \0 (was nicht dasselbe wie die Zahl 0 ist).
Named Pipes (FIFOs)
Eine Named Pipe ist eine Datei, die wie eine Röhre (engl. Pipe) arbeitet. Du tust etwas in die Datei, und es kommt am anderen Ende wieder heraus. Dieses Prinzip wird FIFO oder First-In-First-Out genannt: Die erste Sache, die du in die Pipe legst, ist die erste Sache, da am anderen Ende wieder herauskommt.
Der Prozess, der in eine Named Pipe schreibt, wird so lange nicht beendet, bis die geschriebenen Informationen gelesen wurden. Wenn ein Prozess von der Named Pipe liest, wartet er, bis etwas zu lesen da ist. Die Größe der Pipe ist immer Null – sie speichert keine Daten, sie verbindet nur zwei Prozesse wie die Shell mit |. Da die Pipe einen Namen hat, müssen sich die Prozesse nicht auf derselben Kommandozeile befinden oder vom gleichen Benutzer ausgeführt werden.
Du kannst das mit den folgenden Beispielen ausprobieren:
konsolero@nitidelo ~ $ cd; mkfifo mypipe
Erzeugt das FIFO.
konsolero@nitidelo ~ $ echo "hello" > mypipe
Startet einen Prozess, der versucht, »hello« in die Pipe zu schreiben. Beachte, dass der Prozess sich nicht beendet; er wartet auf einen Prozess, der die Pipe liest.
Wechsel auf eine andere Konsole und gib dort folgendes Kommando ein:
konsolero@nitidelo ~ $ cat mypipe
Jetzt kann sich der echo-Prozess beenden, da das cat von der Pipe liest und der cat-Prozess hello ausgibt.
konsolero@nitidelo ~ $ rm mypipe
Du kannst Named Pipes wie andere Dateien löschen.
Sockets
Sockets sind mit Pipes vergleichbar, jedoch arbeiten Sockets über das Netzwerk. Hiermit organisiert dein Computer den Datenaustausch mit anderen Rechnern. Du hast vielleicht schon einmal etwas von »WinSock« gehört, das sind Sockets für Windows.
Wir werden uns hier nicht näher mit diesem Thema beschäftigen, da du vermutlich keine Gelegenheit haben wirst, Sockets zu benutzen, solange du nicht programmierst. Jedoch weiß du jetzt, wenn du den Dateityp s siehst, was das ist.
