
Entschuldigen Sie, wenn diese Frage irgendwo anders eine exakte Kopie hat, aber bisher haben alle Antworten, die ich auf SE oder anderen Websites im Allgemeinen gefunden habe, diese Frage nicht speziell beantwortet. Ich belege an meinem College einen Kurs über Betriebssysteme und bin daher mit Dateisystemen im Allgemeinen ziemlich neu.
Ich verstehe, dass es in den meisten Dateisystemen ein Stammverzeichnis gibt, das Dateiverzeichniseinträge enthält. Diese Einträge enthalten eine Zuordnung vom Dateinamen zur Inode-Nummer und haben eine variable Länge.
Entsprechenddiese Antwort, ich vermute, diese Einträge werden linear gespeichert, wie unten:
Ich verstehe vollkommen, was Inodes sind und wie sie anhand ihrer Inhaltsverzeichniseinträge (TOC) den Datenblocknummern einer Datei auf der physischen Festplatte zugeordnet werden.
Meine Frage ist jedoch:Wie und wo werden Unterverzeichnis-Dateiverzeichniseinträge gespeichert?
Ich würde annehmen, dass sie entweder am selben Ort wie das Stammverzeichnis gespeichert sind, an einem bestimmten Offset. Ich kann mir jedoch nicht vorstellen, wie dieser Offset vom Inode abgerufen werden kann.
Daher habe ich das Gefühl, dass die Verzeichniseinträge der Unterverzeichnisse tatsächlich im Datenbereich der Festplatte gespeichert sind und nicht mit den Einträgen des Stammverzeichnisses.
Wenn dies der Fall ist, erfordert der Wechsel von einem Verzeichnis in ein anderes, dass die Festplatte scheinbar von beliebigen Orten aus liest, was mir ein wenig ineffizient erscheint.
Trotzdem möchte ich einfach meine Missverständnisse zum Speicherort der Dateiverzeichniseinträge eines Unterverzeichnisses aufklären.
Wir sind für jede Hilfe dankbar.
Antwort1
Verzeichnisse werden normalerweise als Dateien implementiert. Sie haben einen Inode und einen Datenbereich, werden aber normalerweise durch spezielle Systemaufrufe aufgerufen (oder zumindest beschrieben). Einige Systeme erlaubenLektüreVerzeichnisse mit dem üblichen read(2)
Systemaufruf (Linux tut das nicht, FreeBSD schon, als ich das letzte Mal nachgesehen habe). Der Datenbereich der Verzeichnisdatei enthält dann die Verzeichniseinträge. Auf ext4
hat das Stammverzeichnis auch einen Inode, dieser ist auf Inode Nummer 2 festgelegt (versuchen Sie es mit ls -lid /
).
Wenn sich das Verzeichnis wie eine Datei verhält, ist es einfach, Speicherplatz für die Verzeichniseinträge usw. zuzuweisen, da die Funktionen zum Zuweisen von Blöcken für Dateien immer vorhanden sein müssen. Da sie bei Bedarf dieselben Datenblöcke verwenden, ist es außerdem nicht erforderlich, im Voraus Speicherplatz zwischen Dateidaten und Verzeichnislisten zuzuweisen.
Die interne Vorgehensweise beim Speichern von Verzeichniseinträgen variiert zwischen Dateisystemen und hat sich beispielsweise zwischen ext2
und entwickelt ext4
. Moderne Systeme verwenden Bäume anstelle linearer Listen für schnellere Suchvorgänge. SieheHierSogar der ehrwürdigeFAT-Dateisystemspeichert Verzeichnisse als Dateien, aber zumindest in älteren FATs ist das Stammverzeichnis etwas Besonderes. (Die Struktur der Verzeichniseinträge in FAT unterscheidet sich natürlich von Unix-Dateisystemen.)
Wenn dies der Fall ist, erfordert der Wechsel von einem Verzeichnis in ein anderes, dass die Festplatte scheinbar von beliebigen Orten aus liest, was mir ein wenig ineffizient erscheint.
Ja. Aber häufig aufgerufene Verzeichniseinträge (oder die zugrunde liegenden Datenblöcke) werden in modernen Betriebssystemen wahrscheinlich zwischengespeichert.
Das zentrale Speichern der Inhalte aller Verzeichnisse würde die Vorabzuweisung eines großen Bereichs erfordern und würde weiterhin Suchvorgänge auf der Festplatte innerhalb des Verzeichnisdatenbereichs erfordern.
Antwort2
Die übliche Lösung besteht darin, dass einige der Inodes im Stammverzeichnis auf Einträge verweisen, die ebenfalls Verzeichnisse sind. In vielerlei Hinsicht sind sie wie Dateien, aber der Dateityp weist das Dateisystem an, sie als Verzeichnisse zu interpretieren.
(In wirklich alten Tutorials, beispielsweise für das ursprüngliche Unix, wird Ihnen sogar gesagt, dass Sie cat
auch ein Verzeichnis verwenden können. Dies stimmt im Allgemeinen nicht mehr.)
Mit anderen Worten, jedes Verzeichnis ist eine einfache lineare Liste von Inode-Zeigern. Einige davon zeigen auf Blattknoten im Verzeichnisbaum (Dateien), andere auf interne Knoten (ein anderes Verzeichnis). Das einzig Besondere am Stammverzeichnis ist, dass es sein eigenes übergeordnetes Verzeichnis ist und dass es etwas außerhalb des Baums gibt, das dem System mitteilt, dass es von hier aus mit der Durchquerung des Baums beginnen soll.