Der Inode Verzeichnisse Harte Links symbolische Links Vergleich: Aliasses(MacOS)
vs. Links (UNIX)
Anmerkungen

Hintergrund:
Ein Überblick über das Linux-Filesystem
inodes und (symbolische) links

Überraschenderweise (;-)) ist das Linuxfilesystem (mit Namen ext2fs) anders aufgebaut als das von MacOS. Im folgenden möchte ich die interne Struktur etwas herhellen und damit Licht in das Konzept der Links und der symbolischen Links bringen:

Der Inode

Der Inode (information node = Informations Knoten) ist die zentrale Instanz im Linux-Filesystem. Im inode werden alle relevanten Informationen über eine Datei außerdem Namen und den Daten selbst gespeichert. Also die Rechte, die verschiedenen Zugriffs- und Änderungszeiten, Besitzer und Gruppe der Datei, usw. Ferner enthält jeder inode noch die Liste der Zeigern auf die Datenblöcke, in denen die eigentlichen Daten gespeichert sind.

Die Zahl der inodes wird übrigens beim Formatieren festgelegt. Da die Zahl der inodes gleichzeitig die Zahl der Dateien festlegt, sollte man hier nicht zu knauserig sein. Insbesondere, da UNIX/Linux (wegen des fehlenden Ressource-Forks) viel mit kleinen Dateien arbeiten. Andererseits benötigt jeder inode auch Platz auf der Festplatte, so dass man auch nicht beliebig viele inodes anlegen sollte. Typischerweise sollte ein Wert von einem inode auf 4-8 kB ausreichend sein.

Die inodes sind nun ihrerseits in einer linearen Liste abgelegt[1], so dass man sie einfach nummerieren kann. Entsprechend werden die inodes auch über ihre fortlaufende Nummer angesprochen.

Verzeichnisse

Verzeichnisse sind nun nicht anderes als spezielle Dateien. Diese Dateien enthalten statt der üblichen Daten, eine Liste von Namen, denen je eine inode-Nummer zugeordnet wird. Bei einen Zugriff auf eine Datei anhand ihres Namens wird nun dieser Name im Verzeichnis gesucht und die inode-Nummer bestimmt, um schließlich über die Zeiger in diesem inode auf die Daten der Datei zuzugreifen.

Unterverzeichnisse werden auf dieselbe Weise realisiert als Namen plus die Nummer des inodes, in dessen Datenblöcken die Verzeichnisdaten stehen. Damit man beim Pfadwechsel nicht immer denn ganze Pfad vom /-Verzeichnis aus durchhechln muss, gibt es in jedem Verzeichnis zwei spezielle Einträge, die in keinen Verzeichnis fehlen dürfen:
Das ist zum einen der Eintrag '..'. Diesem ist die inode-Nummer des übergeordneten Verzeichnisses zugeordnet. Damit ist es möglich von einem Unterverzeichnis direkt in das übergeordnete Verzeichnis zu wechseln[2]. In der Shell sieht man dies daran, dass das entsprechende Kommando eben cd .. heißt.
Der zweite Spezialeintrag ist '.'. Dieser bezeichnet das Verzeichnis selbst. Er verweist als auf die eigenen inode-Nummer.
Beide Einträge ('.' und '..') werden wie Unterverzeichnisse gehandhabt. Übrigens mit dem Shellkommando ls -i kann man sie die inode-Nummer anzeigen lassen

Harte Links

Dem einen oder anderen wird es aufgefallen sein, dass auf die inodes eines Verzeichnisses mehrere Einträge in verschiedenen Verzeichnissen zeigen. Auf jeden inode eines Verzeichnisses zeigen mindestens zwei Verzeichniseinträge, nämlich einer im übergeordneten Verzeichnis und der '.-Eintrag im Verzeichnis selbst. Hinzu kommen noch die '..'-Einträge in allen Unterverzeichnissen.

Mehrerer Einträge zu einem inode sind nun aber nicht nur auf Verzeichnisses beschränkt. Zu jedem inode kann es beliebig viele Verweise unter beliebigen Namen in beliebigen Verzeichnissen geben. Sie müssen nur auf ein und derselben Partition liegen. Dies kann Vorteile bringen, wenn man möchte, dass ein Programm verschiedene Funktionalitäten haben soll.

Zum Beispiel gibt es traditionellerweise für jedes Kompressionformat (zip, gzip, lha, etc.) ein ein eigenen Packer/Entpacker. Ein universelles (De-)Kompressionprogramm könnte nun unter allen traditionellen Namen[3] vorhanden sein. Wenn dies durch mehrfache Verweise auf ein und denselben inode geschieht spart es Speicherplatz.

Diese zusätzlichen Verweise auf einen bestehenden inode nennt man harte Links. Man kann sie in der Shell mit

> ln Pfad-der-bestehenden-Datei neuer-Name
erzeugen. Genau genommen ist jeder Eintrag in ein Verzeichnis ein harter Link. Mit ln erzeugt man also nur weitere harte Links zu den bestehende.

Die Vorteile dieses Konzeptes sind folgende:

Der zweite Punkt wird dadurch erreicht, das in jedem inode gespeichert wird, wieviele harte Links (einschließlich des allerersten beim Erzeugen der Datei) auf ihn verweisen. Wird nun ein harter Link neu angelegt , erhöht sich dieser Zähler um 1, wird einer gelöscht erniedrigt er sich um 1. In der Ausgabe des Kommandos ls -l wird einem in der 2. Spalte dieser Linkcount angezeigt.

symbolische Links

Was nun aber wenn man, auf einen Link auf eine Datei legen möchte, die sich auf einer anderen Partition befindet. Harte Links versagen hier offenbar. Deshalb wurde das Konzept der symbolischen Links eingeführt. Ein symbolischer Link verweist nicht direkt auf einen inode, sondern auf einen Pfad. Damit gehen leider einige Vorteile der harten Links verloren. Wenn die nämlich die Ursprungsdatei verschoben oder gelöscht wird, weist der Link in die Leere. Es gibt keinen Mechanismus, mit dem eine Datei beim Löschen erfahren könnte, ob symbolische Links auf sie verweisen und gesamten Dateibaum zu durchsuchen wäre entscheiden zu aufwenig.

Trotzdem werden symbolische Links gerne auch innerhalb einer Partition eingesetzt. In vielen Situationen ist es nämlich von Vorteil zu wissen wohin ein Link weist, d.h. wo die Daten ursprünglich stehen. Ein symbolischer Link ist in dieser Hinsicht transparenter. So werden bei den device-files gerne symbolische Links verwendet, um device mit aussagekräftigen Namen anzulegen (z.B. cdrom, printer, modem,...), die dann auf die kryptischen "echten" Namen der devices verweisen (z.B. /dev/cdrom -> /dev/hdc)[4].

Anlegt werden symbolische Links ähnlich wie harte:

> ln -s Pfad-der-bestehenden-Datei neuer-Name

Der alles entscheidende Unterschied ist hier die Option -s, die das Kommando ln anweist statt einem harten eine symbolischen Links anzulegen.

In der Anzeige mit ls -l erscheint dann ein symbolischer Link z.B. so:

lrwxrwxrwx   1 root     root            4 Sep 29 18:17 cdrom -> scd0  

 

Zum Abschluss noch ein Vergleich von MacOS-Aliasses und UNIX-Links:

Verhaltenharte Links (UNIX) Aliasses (MacOS) symbolische Links (UNIX)
Verschieben der Ursprungsdatei Links bleiben
funktionstüchtig
Aliasses bleiben
funktionstüchtig[5]
Links weisen in die Leere
Löschen der Ursprungsdatei Links bleiben
funktionstüchtig
Aliasses weisen
in die Leere
Links weisen in die Leere
Links/Aliasses und
Ursprungsdatei sind..
ununterscheidbar unterscheidbar unterscheidbar

 

Anmerkungen

  1. Beim ext2fs stimmt dies nicht ganz. Die inodes sind in mehreren Blöcken über die Partition verteilt abgelegt. Man kann sie dennoch als eine lange Liste (mit Unterbrechungen) betrachten.
  2. Bei /-Verzeichnis verweist .. auf sich selbst.
  3. Ein Programm unter UNIX weiss im Prinzip mit welchem Namen es aufgerufen wurde. Es kann also an Hand dieses Namens bestimmen, was es tun soll.
  4. Im Prinzip könnte man auch bei harten Links herausbekommen, worauf sie "verweisen". Dazu müsste man aber die inode-Nummer der in Frage kommenden Dateien alle miteinander vergleichen.
  5. Zumindest in der Theorie. In der Realität leider nicht immer.

Rüdiger Goetz
Last modified: Thu Jan 20 21:29:15 CET 2000